Programing/Python programming

Python - 도형 class를 이용한 상속 예제

sosal 2015. 6. 3. 16:50
반응형

 

/*

 http://sosal.kr/
 * made by so_Sal
 */

 


 

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를 출력할 수 있으며, 넓이도 잘 출력합니다.

이처럼 상속을 사용한다면 자원의 재활용 덕에 훨씬 더 짧은 코드로 객체를 구현할 수 있습니다.