본문 바로가기

Python 파이썬

상속, super

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

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