Is - a 관계 : 동등관계
상속에서 자식클래스와 부모클래스는 is-a관계가 성립된다.
is-a 관계는 "a는 b이다." 관계이다.
상속의 계층구조를 올바르게 설계했는지 알기 위해 is-a 관계가 성립하는 지를 생각해보면 된다.
코드로 예시를 들어보자면,
class Animal(object):
pass
class Dog(Animal):
def __init__(self, name):
self.name = name
위의 코드에서 클래스 Animal과 Dog 은 "개는 동물이다."의 관계가 성립한다. 둘은 동등관계이다.
Has-a 관계 : 포함관계
만약 "a는 b를 가지고 있다"와 같은 has-a(포함)관계가 성립되면 이 관계는 상속으로 모델링을 하면 안 된다.
객체지향프로그래밍에서 이 포함관계는 구성관계(composition) 또는 집합관계(aggregation)를 의미한다.
구성관계에서는 하나의 객체가 다른 객체의 부품이 된다.
집합관계에서는 하나의 객체가 다른 객체를 소유한다.
코드로 예시를 들어보면,
class Animal(object):
pass
class Dog(Animal):
def __init__(self, name):
self.name = name
class Person(object):
def __init__(self, name):
self.name = name
self.pet = None
dog1 = Dog("dog1")
person1 = Person("아이펠")
person1.pet = dog1
위 코드에서는 Person이라는 class 가 추가되었다.
Person클래스를 보면 pet 이라는 인스턴스 변수를 비워두고,
아래에서 dog1이라는 객체를 참조하고 있다.
즉, dog1이라는 객체가 person1이라는 객체에 포함이 된다고 볼 수 있는 것이다.