상세 컨텐츠

본문 제목

Object Oriented Programming 원칙 (5) - 조합(composition)

개발/python-객체지향프로그래밍(OOP)

by Matthew0633 2022. 5. 20. 22:12

본문

조합 Composition

Composition 은 왜 필요할까?

( Inheritance vs Composition ) You’ll quickly get a rather deep and wide inheritance. You may end up with a deep class hierarchy some days. One change from the upper-class may destroy all the below classes. The moment you decide to inherit from another class, that’s time you tie your class to it. You’re never sure what the superclass is going to do as it’s out of your control :D This is known as the fragile base class problem

위의 링크에서는 Inheritance 과 Composition 에 대한 차이를 설명하면서, 상속으로 인해 발생 가능한 문제 상황을 묘사하고 있어 이를 인용했다.

복잡하고 깊은 상속관계를 가진 코드들을 다룰 때, 만약 예상치 못하게 부모 클래스의 내용에 수정이 일어날 경우, 상속을 받는 자식 클래스들을 거치며, 해당 내용과 관련된 부분에 모두 수정을 해야하는 번거로움이 생길 수 있다. 만약 내부 구현 방식, 상속관계를 정확하게 파악하지 못한다면 오류와 실수가 발생할 가능성이 매우 높다.

Composition 의 장점 및 예시

따라서 이러한 일이 예상될 경우에는 단순히 “Inheritance” 를 사용하는 것이 아니라 “Composition” 을 사용할 수 있다. Composition 은 전혀 다른 class 의 일부 내용을 부품처럼 가져와 사용하는 것처럼 코드를 작성하는 패턴이다.

아래 코드를 보면 MyCalculatorcal_add() 메소드처럼 Robot class 를 상속받는 것이 아니라, Robot.cal_add() 메소드만 부품처럼 가져와서 사용하고 있다. 만약 이후 코드 변경 및 유지보수 시에 Robot.cal_add() 내용이 수정되더라도, Robot class 를 상속받는 class 들에 대한 모든 수정을 거칠 필요가 없고, MyCalculator.cal_add() 만 수정해주면 된다.

class Robot:
    def __init__(self, name, age):
        self.__name = name
        self.__age = age

    def cal_add(self, a, b):
        return a + b + 1

    @classmethod
    def how_many(cls):
        return f"We have {cls.__population} robots."


class MyCalculator:
    def __init__(self):
        self.a = None
        self.b = None

    def cal_add(self, a, b):
        self.a, self.b = a, b
        return self.Robot.cal_add(a, b)

<Reference>

https://betterprogramming.pub/inheritance-vs-composition-2fa0cdd2f939

관련글 더보기

댓글 영역