본문 바로가기
BIG DATA/PYTHON

[PYTHON] 파이썬 객체 지향 프로그래밍(OOP) 완벽 정리

by 라일리T 2025. 2. 22.

파이썬 객체 지향 프로그래밍(OOP) 완벽 정리

프로그래밍 패러다임 중 하나인 **객체 지향 프로그래밍(Object-Oriented Programming, OOP)**은 **객체(Object)와 클래스(Class)**를 사용하여 코드를 구조화하는 방법입니다. 파이썬도 객체 지향 언어로, 클래스와 객체를 사용하여 프로그램을 만들 수 있습니다. 이번 글에서는 파이썬의 OOP 개념과 활용법을 배워보겠습니다.


1. 클래스(Class)와 객체(Object)란?

1.1 클래스(Class)란?

클래스는 객체를 생성하기 위한 설계도입니다. 예를 들어, 자동차라는 클래스가 있다면, 특정한 내 차는 그 클래스에서 만들어진 객체입니다.

1.2 객체(Object)란?

**객체는 클래스에서 생성된 실체(Instance)**입니다. 객체는 클래스에서 정의한 **속성(변수)과 행동(메서드)**을 가집니다.


2. 클래스 정의와 객체 생성

2.1 클래스 정의

클래스를 만들려면 class 키워드를 사용합니다.

class Car:
    def __init__(self, brand, model):
        self.brand = brand
        self.model = model
    
    def drive(self):
        print(f"{self.brand} {self.model}이(가) 달립니다!")

2.2 객체 생성

클래스를 기반으로 객체를 생성하려면 아래와 같이 사용합니다.

my_car = Car("Hyundai", "Sonata")
print(my_car.brand)  # Hyundai
print(my_car.model)  # Sonata
my_car.drive()  # Hyundai Sonata이(가) 달립니다!

3. 생성자 (__init__ 메서드)

생성자는 객체가 생성될 때 자동으로 실행되는 메서드입니다.

class Person:
    def __init__(self, name, age):
        self.name = name
        self.age = age

p = Person("홍길동", 25)
print(p.name)  # 홍길동
print(p.age)  # 25

4. 인스턴스 변수와 클래스 변수

4.1 인스턴스 변수

  • 객체마다 개별적으로 관리되는 변수
  • self.변수명 형태로 사용
class Dog:
    def __init__(self, name):
        self.name = name  # 인스턴스 변수

dog1 = Dog("바둑이")
dog2 = Dog("초코")

print(dog1.name)  # 바둑이
print(dog2.name)  # 초코

4.2 클래스 변수

  • 모든 객체가 공유하는 변수
  • 클래스명.변수명 형태로 사용
class Dog:
    species = "포유류"  # 클래스 변수

dog1 = Dog()
dog2 = Dog()

print(dog1.species)  # 포유류
print(dog2.species)  # 포유류

5. 메서드 (Method)

5.1 인스턴스 메서드

객체가 사용하는 메서드이며, self를 첫 번째 매개변수로 받습니다.

class Cat:
    def __init__(self, name):
        self.name = name

    def meow(self):
        print(f"{self.name}이(가) 야옹!")

cat = Cat("나비")
cat.meow()  # 나비이(가) 야옹!

5.2 클래스 메서드

클래스 변수를 변경할 때 사용하며, @classmethod 데코레이터와 cls 매개변수를 사용합니다.

class Animal:
    count = 0

    def __init__(self):
        Animal.count += 1

    @classmethod
    def get_count(cls):
        return cls.count

a1 = Animal()
a2 = Animal()
print(Animal.get_count())  # 2

5.3 정적 메서드

클래스와 관계없이 독립적으로 실행되는 메서드입니다. @staticmethod를 사용하며 self나 cls가 필요하지 않습니다.

class Math:
    @staticmethod
    def add(a, b):
        return a + b

print(Math.add(3, 5))  # 8

6. 상속(Inheritance)

상속을 사용하면 기존 클래스를 확장하여 새로운 클래스를 만들 수 있습니다.

class Animal:
    def speak(self):
        print("소리를 냅니다.")

class Dog(Animal):
    def speak(self):
        print("멍멍!")

dog = Dog()
dog.speak()  # 멍멍!

6.1 super() 사용

부모 클래스의 메서드를 자식 클래스에서 사용하고 싶을 때 super()를 활용합니다.

class Parent:
    def show(self):
        print("부모 클래스")

class Child(Parent):
    def show(self):
        super().show()  # 부모 클래스의 메서드 호출
        print("자식 클래스")

c = Child()
c.show()

출력:

부모 클래스
자식 클래스

7. 캡슐화 (Encapsulation)

캡슐화는 데이터 보호를 위해 사용됩니다.

  • _변수명: 암묵적(private) (외부에서 직접 접근하지 않는 것이 권장됨)
  • __변수명: 완전 private (클래스 외부에서 접근 불가)
class BankAccount:
    def __init__(self, balance):
        self.__balance = balance  # private 변수

    def get_balance(self):
        return self.__balance  # getter 메서드

account = BankAccount(1000)
print(account.get_balance())  # 1000

8. 다형성 (Polymorphism)

같은 메서드를 다른 클래스에서 다르게 구현할 수 있습니다.

class Bird:
    def speak(self):
        print("짹짹!")

class Dog:
    def speak(self):
        print("멍멍!")

animals = [Bird(), Dog()]
for animal in animals:
    animal.speak()

출력:

짹짹!
멍멍!

9. 결론

이번 글에서는 파이썬의 객체 지향 프로그래밍(OOP) 개념과 활용 방법을 배웠습니다.

클래스와 객체: 클래스를 설계도 삼아 객체 생성
인스턴스 변수 vs 클래스 변수: 개별 vs 공유
메서드 종류: 인스턴스, 클래스, 정적 메서드
상속과 다형성: 기존 기능 확장 및 다양성 구현
캡슐화: 데이터 보호

다음 글에서는 파이썬의 모듈과 패키지 활용법에 대해 알아보겠습니다! 🚀