728x90
상속이란??
맞습니다 그 상속이 맞아요!
흔히 부보님에게 유산을 상속받다, 재산을 상속받다 하는데 그것을 파이썬에서도 표현한다.
- 기존의 클래스의 기능에 추가적인 기능을 정의하는 방법
- 상속을 통해 추상화를 이용한 다형성 표현가능
아래의 예시를 보며 이해해 보자
class Point2D: # 2D 클레스 만듬
def __init__(self, x = 0, y = 0):
print('2D생성자')
self.x = x
self.y = y
def setX(self, x): # x setter
self.x = x
def setY(self, y): # y setter
self.y = y
def getX(self): # x getter
return self.x
def getY(self): # y getter
return self.y
def printPoint2D(self): # 2D좌표 출력 함수.
print(f'[x={self.x},y={self.y}]')
class Point3D(Point2D): # Point2D를 상속하여 Point3D정의
def __init__(self, x = 0, y = 0, z = 0): # x, y, z, 를 정의.
print('3D생성자')
super().__init__(x, y) # super().__init__ <- 부모클래스의 생성자를 사용한다.
#Point2D.__init__(self, x, y) 동일 # (x,y) <- 부모 클래스의 x,y의 기능을 상속.
self.z = z # Point3D 의 z를 정의
def setZ(self, z): # z setter
self.z = z
def getZ(self): # z getter
return self.z
def printPoint3D(self): # 3D 좌표 출력 함수
self.printPoint2D()
print(f'[z={self.z}]')
p1 = Point2D(10, 20)
p1.printPoint2D()
print()
p2 = Point3D(1, 2, 3)
p2.printPoint2D()
p2.printPoint3D()
"""
출력 결과 설명
2D생성자 p1 은 Point2D클래스, (10,20) 을 받아서 x,y값을 설정함.
[x=10,y=20] 출력 결과
3D생성자 p2 는 Point3D클래스, (1,2,3) 을 받아 x,y,z값을 설정 후 3D생성자 먼저 출력.
2D생성자 Point3D(Point2D) 로 상속을 받았기 때문에 p2가 peintPoint2D() 사용 할 수 있음.
[x=1,y=2] 그러기 때문에 Point3D(1,2,3)의 x,y값인 1,2를 받아 '2D생성자 [x=1,y=2]' 출력
(부모클래스의 값을 내 클레스의 값으로 변경.)
[x=1,y=2] super().__init__(x,y)을 사용해 부모 생성자를 상속해서 [x=1,y=1]출력
[x=3] Point3D 의 z 값 출력.
class Point2D: 생성, (부모 클레스)
그 밑은 Point2D 의 기능 나타내는 함수.
class Point3D(Point2D) <- class Point3D 의 부모는(Point2D)로 설정하고 상속한다.
super().__init__ 은 부모 클레스의 생성자를 상속
추가로 Point3D는 x,y에 관한 기능이 없지만 부모클래스 Point2D로부터 상속받아 기존 코드의 수정 없이
좌표를 저장하는 기능이 추가된 것을 확인할 수 있다.
말 그대로 부모클래스의 기능을 상속받아 사용한다!
super??
super 는 상속받는 클래스에서 사용하며 부모클래스를 명시한다.
계속해서 상속의 응용을 알아보자
문자열을 저장하는 클래스 정의 (MyStr1)
- 길이 반환하는 기능
문자열을 저장하는 클래스 정의 (MyStr2)
- 길이를 반환하는 기능을 가짐 (상속)
- 대문자 개수를 반환하는 기능을 가짐
문자열을 저장하는 클래스 정의 (MyStr3)
- 길이를 반환하는 기능을 가짐 (상속)
- 대문자 개수를 반환하는 기능을 가짐 (상속)
- 소문자 개수를 반환하는 기능을 가짐
class MyStr1: # 상속의 모체
def __init__(self, str1=""):
self.str1 = str1
def size(self):
return len(self.str1) # MyStr1 의 문자열 길이 반환의 기능
class MyStr2(MyStr1): # MyStr1을 상속한 MyStr2
def __init__(self, str1=""):
super().__init__(str1)
def upper_count(self): # MyStr2 대문자 개수 반환의 기능
count = 0
for ch in self.str1:
if 'A' <= ch <= 'Z':
count += 1
return count
class MyStr3(MyStr2): # MyStr1을 상속한 MyStr2를 상속한 MyStr3
def __init__(self, str1=""):
super().__init__(str1)
def lower_count(self): # MyStr3 의 소문자 개수 반환의 기능
count = 0
for ch in self.str1:
if 'a' <= ch <= 'z':
count += 1
return count
ms1 = MyStr1("hello WelcomE!")
print(ms1.size()) # MyStr1 의 기능
print()
ms2 = MyStr2("hello WelcomE!")
print(ms2.size()) # MyStr1 의 기능
print(ms2.upper_count()) # MyStr2 의 기능
print()
ms3 = MyStr3("hello WelcomE!")
print(ms3.size()) # MyStr1 의 기능
print(ms3.upper_count()) # MyStr2 의 기능
print(ms3.lower_count()) # MyStr3 의 기능
# 실행결과
14
14
2
14
2
10
상속을 알아보았다!
기능을 여러 가지 추가(새로운 코드작성) 할 필요 없이 클래스를 만들어 놓고 상속을 활용하여 기능을 구현할 수 있다!
728x90
'Python 파이썬' 카테고리의 다른 글
클래스의 관계 표현, object 클래스 (0) | 2023.10.24 |
---|---|
다형성(Polymorphism) (1) | 2023.10.24 |
세터,게터 (Setter, Getter) (0) | 2023.10.23 |
클래스(Class)를 응용해 기능을 구현해보자 (0) | 2023.10.23 |
클래스(Class), 클래스 변수와 객체 변수, __init__ (1) | 2023.10.23 |