Python 상속 마스터하기: 개념, 문법, 실전 예제
Python 상속
상속으로 부모 클래스의 모든 기능을 물려받으면서 기능을 추가/확장한 새 클래스 생성 가능. 이 튜토리얼은 Python 상속 사용법을 명확한 예제와 모범 사례로 설명합니다.
동영상: Python 상속
Python 상속
상속은 코드 재사용과 논리적 계층을 촉진하는 객체지향 프로그래밍 핵심 원칙. 새 클래스(파생 또는 자식 클래스)는 기존 클래스(베이스 또는 부모 클래스)를 최소 변경으로 정의. 자식 클래스는 부모의 속성/메서드 자동 수신하며 필요시 오버라이드나 확장 가능.
Python 상속 문법
class BaseClass:
# 베이스 클래스 본문
class DerivedClass(BaseClass):
# 파생 클래스 본문
위 스니펫에서 DerivedClass는 BaseClass의 모든 퍼블릭 멤버 상속. 새 메서드 추가나 기존 메서드 오버라이드로 베이스 구현 재사용하면서 행동 커스터마이즈 가능.
Python 상속 예제
실용적 예로 상속 설명. 변의 개수와 길이 저장하는 제네릭 Polygon 클래스:
class Polygon:
def __init__(self, no_of_sides):
self.n = no_of_sides
self.sides = [0 for _ in range(no_of_sides)]
def input_sides(self):
self.sides = [float(input(f"Enter side {i+1} : ")) for i in range(self.n)]
def display_sides(self):
for i, side in enumerate(self.sides, 1):
print(f"Side {i} is {side}")
Polygon 클래스는 모든 다각형 공통 속성/메서드 캡슐화. Triangle은 정확히 세 변 가진 특정 다각형이므로 Polygon 상속해 공통 로직 재정의 불필요:
class Triangle(Polygon):
def __init__(self):
super().__init__(3) # 베이스 3변으로 초기화
def find_area(self):
a, b, c = self.sides
s = (a + b + c) / 2
area = (s * (s - a) * (s - b) * (s - c)) ** 0.5
print(f"The area of the triangle is {area:.2f}")
다음 실행으로 상속 동작 확인:
>>> t = Triangle()
>>> t.input_sides()
Enter side 1 : 3
Enter side 2 : 5
Enter side 3 : 4
>>> t.display_sides()
Side 1 is 3.0
Side 2 is 5.0
Side 3 is 4.0
>>> t.find_area()
The area of the triangle is 6.00
Triangle이 input_sides(), display_sides() 호출 가능함에 주목—상속으로 자동 사용 가능.
자식 클래스에서 속성/메서드 못 찾으면 부모 클래스 탐색, 필요시 상속 체인 위로 계속 탐색.
Python 메서드 오버라이딩
Polygon과 Triangle 모두 __init__ 정의. 자식 구현이 부모 것 오버라이드하지만 베이스 로직 명시적 호출로 확장 권장. super() 사용이 현대적 권장 방식:
class Triangle(Polygon):
def __init__(self):
super().__init__(3) # Polygon.__init__ 호출
오버라이드 시 자식 메서드가 새 행동 추가하거나 베이스 행동 수정하며 원본 기능 보존.
Python은 상속 관계 인트로스펙션용 isinstance()와 issubclass() 제공:
t = Triangle()
print(isinstance(t, Triangle)) # True
print(isinstance(t, Polygon)) # True
print(isinstance(t, int)) # False
print(isinstance(t, object)) # True
print(issubclass(Polygon, Triangle)) # False
print(issubclass(Triangle, Polygon)) # True
print(issubclass(bool, int)) # True
이 유틸리티들은 타입 체크와 객체가 예상 인터페이스 준수하는지 보장에 필수.
super() 더 알아보기: Python super() 함수 문서.