본문 바로가기

카테고리 없음

객체지향 프로그래밍 - 상속

클래스에는 상속이라는 것이 있다. 

 

어떻게 쓰냐면, 상속을 해주는 부모클래스를 소괄호 안에 넣어주면된다. 

 

여기 Person이라는 부모클래스가 있다.

class Person:
    def __init__(self, name):
        self.name = name
        print("자기소개 하겄습네다")
    def introduce2(self):
        print("나는 {}입니다.".format(self.name))

init메서드는 자기소개 하겄습네다라는 말을 print 해주는 것이고, introduce2라는 함수는 Person 클래스의 이름항목에 담긴 데이터를 담아 나는 ~입니다라고 출력해준다. 

 

person = Person("샘알트만")
person.introduce2()

자기소개 하겄습네다

나는 샘알트만입니다.

이렇게 출력된다.

 

이번엔 자식클래스 Student에 Person이라는 부모클래스를 상속해보자. 

(프로그래밍 세계에서는 부모역할을 하는 클래스를 베이스 클래스(base class) 또는 슈퍼클래스(superclass)라 부르고 상속을 받아서 자식역할을 하는 클래스를 서브클래스(subclass)라고 한다. 

 

class Student(Person):
    def __init__(self, name, student_id):
        super().__init__(name)     #여기서 super은 Person이라는 부모클래스의 init 함수 실행함
        self.student_id = student_id

    def introduce(self):
        super().introduce2()    #super로 부모클래스에서 있었던 매소드 실행해줌.
        print(f"내 학번은 {self.student_id}입니다.")

이 super()라는 것은 파생클래스에서 베이스클래스의 메소드를 호출할 때 사용한다.

 

student = Student("화성", 17-73006631)

student.introduce()

두 코드를 실행하면 어떻게될까?

첫 번째 줄의 코드는 

super().__init__(name) 코드로 인해 Person클래스의 init 메소드가 실행된다. 

 

세 번째 줄의 코드는 Person 클래스의 introduce2 메소드와 intruduce가 가진 print(내 학번은~ 뭐시기)를 출력한다.

 

 

 

 

##다중상속

 

class Base1:
    def __init__(self):
        print("Base1의 __init__실행")
        
class Base2:
    def __init__(self):
        print("Base2의 __init__실행")

class Child(Base1, Base2):
    def __init__(self):
        print("Child의 __init__실행")

 

이렇게 코드를 짠 후,

child = Child()

 

이 코드를 실행하면 어떻게될까?

결과는 child의 __init__실행만 출력된다. 

 

class Base1:
    def __init__(self):
        print("Base1의 __init__실행")
        
class Base2:
    def __init__(self):
        print("Base2의 __init__실행")

class Child(Base1, Base2):
    def __init__(self):
        print("Child의 __init__실행")
        super().__init__()

 

그럼 이제 맨 마지막 코드에 super~을 추가해줬으니 될까? 

> 이러면 Base1과 Chile 클래스 안에 있는 init 메소드가 실행된다. 

 

그래서 결과적으로 Base1, Base2, Child 모두를 실행하고 싶다면, 

 

## 다중상속
class Base1:
    def __init__(self):
        print("Base1의 __init__실행")
        super().__init__()

class Base2:
    def __init__(self):
        print("Base2의 __init__실행")
        super().__init__()

class Child(Base1, Base2):
    def __init__(self):
        print("Child의 __init__실행")
        super().__init__() #얘만 추가하면 Base1까지만 실행함.

이렇게 클래스마다 super~ 코드를  추가해 주어야 한다.