클래스 간의 포함 관계 (has-a 관계)
클래스가 다른 클래스를 포함하는 경우로, 이를 통해 한 클래스의 인스턴스가 다른 클래스의 인스턴스를 구성 요소로 가질 수 있다.
class PohamHandle:
quantity = 0 # 핸들의 회전량을 저장하는 변수
def LeftTurn(self, q):
self.quantity = q # 좌회전 시 회전량을 설정
return '좌회전'
def RightTurn(self, q):
self.quantity = q # 우회전 시 회전량을 설정
return '우회전'
def StraightTurn(self, q):
self.quantity = q # 직진 시 회전량을 설정
return '직진'
class PohamCar:
turnShow = '정지' # 현재 차량의 상태를 나타내는 변수
def __init__(self, ownerName):
self.ownerName = ownerName # 차량 소유자의 이름
self.handle = PohamHandle() # PohamHandle 객체를 포함
def TurnHandle(self, q):
if q > 0:
self.turnShow = self.handle.RightTurn(q) # 우회전
elif q < 0:
self.turnShow = self.handle.LeftTurn(q) # 좌회전
else:
self.turnShow = self.handle.StraightTurn(q) # 직진
# 예제 실행
tom = PohamCar('tom')
tom.TurnHandle(20) # 핸들을 20만큼 우회전
print(tom.ownerName + '의 회전량은 ' + tom.turnShow + str(tom.handle.quantity))
클래스 간의 상속 (is-a 관계)
is-a 관계는 한 클래스가 다른 클래스의 서브 클래스가 되는 관계이다. 이는 상속을 통해 구현되며, 코드의 재사용성을 높여준다.
class Animal:
eat = '음식'
def move(self):
print('움직이는 생물')
class Dog(Animal): # Animal 클래스를 상속받는 Dog 클래스
pass # Dog 클래스는 Animal 클래스의 모든 속성과 메서드를 그대로 사용
class Horse(Animal): # Animal 클래스를 상속받는 Horse 클래스
pass # Horse 클래스도 Animal 클래스의 모든 속성과 메서드를 그대로 사용
dog1 = Dog()
print(dog1.eat) # Dog 클래스는 Animal 클래스의 속성을 그대로 사용
print(dog1.move()) # Dog 클래스는 Animal 클래스의 메서드를 그대로 사용
horse1 = Horse()
print(horse1.eat) # Horse 클래스도 Animal 클래스의 속성을 그대로 사용
print(horse1.move()) # Horse 클래스도 Animal 클래스의 메서드를 그대로 사용
오버라이딩과 다중 상속
Python에서는 메서드를 재정의(오버라이딩)하거나, 다중 상속을 통해 여러 클래스의 기능을 물려받을 수 있다. 이 과정에서 부모 클래스의 메서드를 호출하거나 우선순위를 정할 수 있다.
class Parent:
def printData(self):
pass # 부모 클래스에서 정의된 빈 메서드
class Child1(Parent):
def printData(self):
print('Child1 printData 수행중') # Child1 클래스에서 메서드 재정의
class Child2(Parent):
def printData(self):
print('Child2 printData 수행중') # Child2 클래스에서 메서드 재정의
c1 = Child1()
c1.printData() # Child1의 printData 메서드 실행
c2 = Child2()
c2.printData() # Child2의 printData 메서드 실행
class Tiger:
data = "호랑이세상"
def Cry(self):
print('어흥')
class Lion:
def Cry(self):
print('으르렁')
def Hobby(self):
print('낮잠자기')
class Liger(Tiger, Lion): # Tiger와 Lion 클래스를 상속받는 Liger 클래스
pass # 우선순위에 따라 Tiger의 Cry 메서드가 사용됨
class Liger2(Lion, Tiger): # Lion과 Tiger 클래스를 상속받는 Liger2 클래스
data = "라이거만의 세상" # 새로운 속성 추가
def Play(self):
print('라이거만의 기능 추가')
self.Eat() # Tiger 클래스의 Eat 메서드 호출
super().Hobby() # Lion 클래스의 Hobby 메서드 호출
print(self.data, super().data) # 현재 클래스와 부모 클래스의 data 출력
l1 = Liger()
print(l1.data) # Tiger 클래스의 data 속성 출력
l1.Cry() # Tiger 클래스의 Cry 메서드 실행
l2 = Liger2()
l2.Cry() # Lion 클래스의 Cry 메서드 실행 (우선순위에 따라)
l2.Play() # Liger2 클래스의 Play 메서드 실행