파이썬/클래스와 객체 지향

파이썬에서 상속(Inheritance) vs 구성(Composition)

Data Jun 2025. 9. 10. 11:56

객체지향 프로그래밍(OOP)에서는 클래스를 재사용하는 대표적인 방법이 두 가지 있습니다.
바로 상속(Inheritance) 과 **구성(Composition)**입니다.

 

1. 상속 (Inheritance)

상속은 부모 클래스의 모든 속성과 메서드를 자식 클래스가 물려받는 방식입니다.

  • 장점: 코드 재사용이 쉽고, 공통 기능을 공유 가능
  • 단점: 원하지 않는 기능까지 모두 따라옴

관계: “is-a 관계”

  • 예: Dog는 Animal이다

예시

class Robot:
    def cal_add(self, a, b):
        return a + b

class BixbyCal(Robot):  # 상속
    pass

b = BixbyCal()
print(b.cal_add(1, 2))  # 3

 

2. 구성 (Composition)

구성은 클래스 안에 다른 클래스의 인스턴스를 포함해 필요한 기능만 가져오는 방식입니다.

  • 장점: 불필요한 기능은 제외하고, 필요한 것만 선택 가능
  • 단점: 위임(delegate) 코드가 조금 늘어날 수 있음

 관계: “has-a 관계”

  • 예: BixbyCal은 Robot을 가진다

예시

class Robot:
    def __init__(self, name, age):
        self.name = name
        self.age = age
        
    def cal_add(self, a, b):
        return a + b

class BixbyCal:
    def __init__(self, name, age):
        self.Robot = Robot(name, age)  # Robot을 포함 (has-a)

    def cal_add(self, a, b):
        return self.Robot.cal_add(a, b)  # 필요한 기능만 위임

b = BixbyCal("Bixby", 2)
print(b.cal_add(1, 2))  # 3

 

3. 언제 상속? 언제 구성?

  • 상속: 부모와 자식이 “진짜로 is-a 관계”일 때
    • 예: Dog는 Animal이다
  • 구성: 단순히 기능을 재사용하고 싶을 때
    • 예: BixbyCal은 Robot의 기능을 가지고 있다

 

정리하면

  • 상속은 전체를 물려받는 강한 결합
  • 구성은 필요한 것만 가져오는 느슨한 결합

따라서, 불필요한 기능까지 가져오고 싶지 않다면 **구성(Composition)**을 쓰는 게 더 깔끔합니다.