Python - 도형 class를 이용한 상속 예제
Vehicle 객체에서 기본적인 동작을 미리 구현하여 Car, Truck, Motocycle 등의 class를 구현할 때,
이미 기본적인 뼈대가 구현 된 vehicle 객체를 상속받음으로써 지역변수, 함수 등의 리소스들를 재활용 할 수 있다.
마찬가지로 도형에서도 shape라는 뼈대 class 객체를 미리 구현해 둔다면
Rectangle, triangle, Circle 등을 구현할 때, 자료를 재활용 하므로써 편하게 프로그래밍 할 수 있다.
- Shape class
기본적으로 width, height 2가지 변수를 float으로 입력 받아 데이터를 생성하는 생성자를 가진다.
getWidth(), setWidth() 등의 getters, setters를 가진다.
__str__ operation을 통해 [width, height]를 출력한다.
class Shape(object):
def __init__(self, width, height): # 변수 초기화 및 잘못된 형태의 변수가 들어올 시 assert
self.width = float(width)
self.height = float(height)
assert type(width) == float and width >= 0.0
assert type(height) == float and height >= 0.0
def setWidth(self,width): # Setters 함수 구현입니다.
self.width = float(width)
assert type(width) == float and width >= 0.0
def setHeight(self,height):
self.height = float(height)
assert type(height) == float and height >= 0.0
def getWidth(self): #getters 함수 구현입니다.
return self.width
def getHeight(self):
return self.height
def __str__(self): # 출력시 width와 height값을 리턴하도록 합니다.
return "["+str(self.getWidth())+", "+ str(self.getHeight())+"]"
- Rectangle class
기본적인 생성자와 함수들은 Shape에 이미 다 있기 때문에, 그대로 상속받아 사용하면 된다.
단순히 넓이를 구하는 (width * height) 함수인 calculateArea만 추가되어있다.
class Rectangle(Shape): # Shape에서 상속받아 생성자 함수를 구현하였습니다.
def __init__(self, width, height):
Shape.__init__(self,width,height)
def calculateArea(self): # Rectangle의 고유함수. 넓이를 return 합니다.
return self.getWidth() * self.getHeight()
- Circle class
Circle class는 하지만 radius, 즉 반지름 하나만 받기 때문에 그대로 Shape 객체의 생성자를 활용할 순 없습니다.
따라서 하나의 매개변수 radius만 받되, Shape객체의 생성자에서 반지름이 아닌 지름을 넣어주기로 합니다.
그렇게 넓이를 구할 땐 Shape 객체의 getWidth 혹은 getHeight 함수로 받은 길이의 반을 제곱하여 파이와 함께 넓이를 계산합니다.
class Circle(Shape):
def __init__(self, radius):
Shape.__init__(self,radius*2, radius*2)
# Circle의 생성자 매개함수를 받지만, 초기화는 Shape에게 넘깁니다.
# 다만 width와 height를 2r로 작성합니다.
def calculateArea(self):
return self.getWidth()*self.getWidth()/4*math.pi # 원넓이는 =pi*r^2 이므로..
- Main function
if __name__ == "__main__":
rec = Rectangle(5.7, 9.4)
print(rec) # [5.7, 9.4] __str__ function
cir = Circle(10.0)
print(cir) # [20.0, 20.0] __str__ function
print(rec.calculateArea()) # 53.58
print(cir.calculateArea()) # 314.1592...
print 함수로 Rectangle, Circle의 instance를 출력할 수 있으며, 넓이도 잘 출력합니다.
이처럼 상속을 사용한다면 자원의 재활용 덕에 훨씬 더 짧은 코드로 객체를 구현할 수 있습니다.