[출처 : http://songhl1.tistory.com/7]

상속 - is a,  합성 - has a

아마 객체 지향 언어를 공부했다면, 위의 단어가 떠오를 것이다. python 역시 객체지향이기 때문에 합성과 상속을 사용한다.

Example : Inheritance (상속)
---------------------------------------
# Inheritance Example
class ListChild(list):

    def listMake(self, A):
        tlist = self[:]                             # list copy
        for x in A:
              if x not in tlist:                    # If the element is new and is not in list
                    tlist.append(x)             # Append new element to list
         return ListChild(tlist)             # return updated list
---------------------------------------

Example : Compostion(합성)
---------------------------------------
class ListChild:
    def __init__(self, d=None):
        self.data = d
    def listMake(self, A):
        res = self.data[:]                      # list copy
        for x in A:
             if x not in res:
                   res.append(x)
        return Set(res)
    def __getitem__(self, k):
        return self.data[k]
    def __repr__(self):
        return 'self.data'
---------------------------------------
위에서 data를 res로 복사했다고 생각하기 쉬운데, 사실 그게 아니라 data가 실제 list data가 있는 곳을 point 하고 있는 것이다. 즉, res = self.data[:] 이렇게 하면 data를 새로운 공간에 복사하는 것이 아니라 res 역시 list data가 존재하는 곳을 point 하고 있는 것이다. 
python에서는 이를 C와 같이 pointer라고 부르기 보다 symbol 이라 한다. (맞나..;;)

위에서 본 바와 같이 inheritance와 composition의 차이점을 짐작할 수 있을 것이다. 하지만 좀 더 이를 구체적으로 적어보자면,
- 합성이 구현하기 쉽다고 한다... 개인차인듯(내생각)
- 상속은 super class를 상속받아서 새로 method만 추가하면 되지만, super class에서 어떠한 method들이 제공되는지 알고 있어야 한다. 즉 super class의 정보를 모른다면 잘 사용하기 힘들다. 반면에 합성은 적어도 어떠한 method들을 사용할지 명확히 안다. (자기 안에 다 있으니까)
- 상속의 경우 super class의 수정은 조심해야 한다. 다른 클래스들이 참조할 수도 있으니, 반면에 합성은 수정이 쉽다.
- 상속의 경우 다형성을 제공, 즉 sub classing이 용이 (당연하건가..)
- 상속은 superclass의 이미지를 갖게 되므로 superclass의 종료시점을 가지게 된다. 반면에 합성은 객체의 생성과 소멸을 정할 수 있다.
- 두 기법은 당연히 같이 사용된다. 그게 좋다. 예를 들면 super class는 동물이고 이를 '사자'가 상속한다. 또한 '사자'는 '갈기'를 가지고 있다. '갈기'를 표현하기 위해서는 합성(has-a)을 사용하는 것이 좋다. 
 * 물론 여기서 일관성이 유지되는가를 고려해줘야 한다. 즉, 어떤 class가 여러가지로 표현이 가능하다면, (ex. 사람을 표현할 때, 이 사람은 고용인 일 수도 있으며, 엔지니어 일 수도 있고, 가계주인 일 수 있다. 동시에 말이다.) 이럴 경우에는 일관성을 위해서 합성을 사용하는 것이 좋을 것 같다.

+ Recent posts