OOP의 세 가지 핵심 개념
객체 지향 프로그래밍의 핵심 요소는 다음과 같습니다:
- 캡슐화
- 상속
- 다형성
상속의 개념
상속은 클래스 간 관계를 정의하는 메커니즘입니다. 예를 들어, "개"와 "고양이"가 "동물"이라는 공통 특성을 가질 때, 이 관계를 코드로 표현할 수 있습니다.
class Animal:
def breathe(self):
print("호흡 중...")
class Dog(Animal):
def bark(self):
print("멍멍!")
# 사용 예시
my_dog = Dog()
my_dog.breathe() # Animal의 메서드 호출
my_dog.bark() # Dog의 고유 메서드
추상화와 상속 절차
다양한 하위 클래스의 공통 요소를 추출하여 기본 클래스를 생성하는 과정을 추상화라고 합니다.
class Vehicle:
def __init__(self, brand):
self.brand = brand
class Car(Vehicle):
def drive(self):
print(f"{self.brand} 자동차 주행 중")
class Bike(Vehicle):
def pedal(self):
print(f"{self.brand} 자전거 페달링 중")
# 인스턴스 생성
my_car = Car("현대")
my_bike = Bike("삼천리")
속성 검색 순서
Python의 속성 탐색 순서는 다음과 같습니다:
- 인스턴스 자체
- 클래스 정의
- 부모 클래스
- 최상위 클래스(object)
파생과 메서드 오버라이딩
자식 클래스가 부모 클래스의 메서드를 재정의할 때를 파생(derived) 상태라고 합니다.
class Parent:
def greet(self):
print("부모 클래스 메서드")
class Child(Parent):
def greet(self):
print("자식 클래스 오버라이딩")
# 실행 결과
c = Child()
c.greet() # "자식 클래스 오버라이딩"
super()를 통한 부모 클래스 접근
자식 클래스에서 부모 클래스의 기능을 호출할 때는 super()를 사용합니다.
class Base:
def __init__(self, value):
self.value = value
class Extended(Base):
def __init__(self, value, extra):
super().__init__(value) # 부모 초기화 호출
self.extra = extra
e = Extended("데이터", 42)
조합(Composition) 패턴
상속이 "is-a" 관계라면 조합은 "has-a" 관계를 표현합니다.
class Engine:
def start(self):
print("엔진 시동")
class Car:
def __init__(self):
self.engine = Engine() # 조합 관계
my_car = Car()
my_car.engine.start() # 구성 요소 접근
다중 상속과 MRO
Python은 여러 부모 클래스로부터 상속받는 다중 상속을 지원합니다. 메서드 해결 순서(Method Resolution Order)는 다음 규칙을 따릅니다:
- 깊이 우선 탐색
- 공통 조상 클래스는 마지막에 탐색
class A: pass
class B(A): pass
class C(A): pass
class D(B, C): pass
print(D.mro()) # 상속 순서 확인