[출처 : http://songhl1.tistory.com/7]
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. 사람을 표현할 때, 이 사람은 고용인 일 수도 있으며, 엔지니어 일 수도 있고, 가계주인 일 수 있다. 동시에 말이다.) 이럴 경우에는 일관성을 위해서 합성을 사용하는 것이 좋을 것 같다.
상속 - is a, 합성 - has a
아마 객체 지향 언어를 공부했다면, 위의 단어가 떠오를 것이다. python 역시 객체지향이기 때문에 합성과 상속을 사용한다.
Example : Inheritance (상속)
---------------------------------------
# Inheritance Example
class ListChild(list):
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. 사람을 표현할 때, 이 사람은 고용인 일 수도 있으며, 엔지니어 일 수도 있고, 가계주인 일 수 있다. 동시에 말이다.) 이럴 경우에는 일관성을 위해서 합성을 사용하는 것이 좋을 것 같다.