Class
클래스Class
클래스와 클래스 사이가 어떤 관계를 형성하는 것은 흔히 볼 수 있으며, 그 방법은 IS-A와 HAS-A가 있다.
IS-A: 상속Inheritance
IS-A는 ‘~는 ~의 한 종류다’를 의미한다. 예를 들어 ‘노트북은 컴퓨터의 한 종류다’는 문장은 관계가 성립하므로 컴퓨터와 노트북은 IS-A관계다. 위 문장을 영어로 표현하면 ‘A laptop IS-A computer’이므로 IS-A관계임을 확인할 수 있다.
IS-A를 표현할 때는 상속(Inheritance)를 사용한다. 상속은 객체 지향의 근간이라고 불릴 만큼 중요하며 유용하지만, IS-A 관계가 아닐 때 상속을 하면 클래스 설계에 어려움이 따른다.
상속 관계에서 상속을 하는 클래스를 [기본클래스, 부모클래스, 슈퍼클래스]라고 하며, 상속 받는 클래스를 [파생클래스, 자식클래스, 서브클래스]라고 한다.
class Computer:
def __init__(self, cpu, ram):
self.CPU = cpu
self.RAM = ram
def browse(self):
print('browse')
def work(self):
print('work')
class Laptop(Computer):
#멤버 추가
def __init__(self, cpu, ram, battery):
super().__init__(cpu, ram)
self.battery = battery
#메서드 추가
def move(self, to):
print('move to {}'.format(to))
컴퓨터 클래스는 인스턴스 멤버로 CPU와 RAM을, 인스턴스 메서드로 browse()와 work()를 가진다. 노트북 또한 동일한 요소를 가지고 기능을 할 수 있다. 이렇듯 어떤 객체나 다른 객체의 모든 특성(멤버)과 기능(메서드)을 가진 상태에서 그 외에 다른 특성이나 기능을 가지고 있다면 상속을 활용하는 것이 유용하다.
Laptop 클래스의 이름 옆 괄호 안에는 Computer가 들어있다. 이는 Laptop 클래스가 Computer 클래스를 상속한다는 의미이다.
super().__init__(cpu, ram) 문장은 Computer 클래스의 생성자를 호출하면서 여러개의 인자를 전달한다. 이 중 super는 현재 클래스의 슈퍼 클래스를 의미한다.
HAS-A: 합성Composition과 통합Aggregation
HAS-A 관계는 ‘~이 ~을 가진다’를 의미한다. 컴퓨터는 CPU를 가지므로 ‘A Computer HAS-A CPU’가 성립하며, HAS-A 관계라고 부른다.
HAS-A 관계는 합성과 통합으로 다시 나뉜다. 둘 모두 HAS-A 관계를 나타내는 방법이지만, 차이점이 존재한다.
class CPU:
pass
class RAM:
pass
class Computer:
def __init__(self):
self.cpu = CPU()
self.ram = RAM()
Computer 클래스는 인스턴스 멤버 CPU를 가진다. 생성자에서 CPU 객체를 생성하여 멤버 cpu에 할당한다. 즉, Computer 객체와 CPU 객체는 함께 생성되고 사라진다. 따라서 객체의 생명주기가 같고, 어느 하나가 다른 하나를 소유하고 있는 강한 관계를 맺고 있을 때 합성Composition이라고 한다.
class Gun:
def __init__(self, kind):
self.kind = kind
def bang(self):
print('bang bang!')
class Police:
def __init__(self):
self.gun = None #1
def acquire_gun(self, gun): #2
self.gun = gun
def release_gun(self): #3
gun = self.gun
self.gun = None
return gun
def shoot(self):
if self.gun:
self.gun.bang()
else:
print("Unable to shoot")
#1에서 Police 객체가 만들어질 때 아직 Gun 객체를 가지고 있지 않다. #2의 acquire_gun() 메서드를 통해 Gun 객체를 멤버로 가지게 되며, #3의 release_gun() 메서드를 통해 총을 놓을 수 도 있다. 이 두 메서드를 이용해 총을 가진 경찰과 가지고 있지 않은 경찰 모두 표현할 수 있다.
정리하자면, 객체끼리 생명주기를 함께 하지 않는 상대적으로 약한 관계를 통합Aggregation이라고 한다.
Enjoy Reading This Article?
Here are some more articles you might like to read next: