상세 컨텐츠

본문 제목

[파이썬(Python)] #25 상속

python

by 빨간눈동자 2021. 9. 17. 13:10

본문

반응형

이번에는 상속에 대해 살펴보자. 

 

우선 아래 코드를 살펴보자. 

class Person :
    def __init__(self, name, age):
        self.name = name
        self.age = age
        
    def say(self) :
        print(f"My name is {self.name} and age is {self.age}")

def main() :
    p = Person("Smith", 29)
    p.say()

if __name__ == '__main__' : 
    main()

Person이라는 class가 있으며, 멤버 변수로 name과 age가 있고 멤버 함수로 say()가 있다. 

 

이제 address를 포함하는 class를 추가로 만들어 보자. 

class Person :
    def __init__(self, name, age):
        self.name = name
        self.age = age
        
    def say(self) :
        print(f"My name is {self.name} and age is {self.age}")

class Person1 :
    def __init__(self, name, age, address):
        self.name = name
        self.age = age
        self.address = address

    def say(self) :
        print(f"My name is {self.name} and age is {self.age}")
        print(f"address {self.address}")

def main() :
    p = Person("Jake", 30)
    p = Person1("Smith", 29, "Street 7")
    p.say()

if __name__ == '__main__' : 
    main()

코드는 문제 없이 수행되지만, 먼가 코드가 지저분하다.. Person / Persion1 class에 중복되는 멤버 변수도 보이고... 

이럴때 상속을 사용하면 코드가 좀 더 간결해진다. 

 

class Person :
    def __init__(self, name, age):
        self.name = name
        self.age = age
        
    def say(self) :
        print(f"My name is {self.name} and age is {self.age}")

class Person1(Person) :
    def __init__(self, name, age, address):
        super(Person1, self).__init__(name, age)
        self.address = address

def main() :
    p = Person("Jake", 30)
    p.say()
    p1 = Person1("Smith", 29, "Street 7")
    p1.say()

if __name__ == '__main__' : 
    main()

B라는 클래스가 A라는 클래스를 상속받으려면 아래와 같이 사용하면 된다. 

class B(A):
    ....
    ....

상속을 사용하니 Persion1의 class가 좀 더 간결해졌다.  실제 Person1에 say() 멤버함수가 없어도 부모 클래스의 say()를 호출함으로 써, 멤버 변수 name과 age를 출력할 수 있었다. 

하지만, address 변수를 출력하지 못하였다. 

 

오버라이드 기법을 사용해서 address 변수를 출력해보도록 하자. 

class Person :
    def __init__(self, name, age):
        self.name = name
        self.age = age
        
    def say(self) :
        print(f"My name is {self.name} and age is {self.age}")

class Person1(Person) :
    def __init__(self, name, age, address):
        super(Person1, self).__init__(name, age)
        self.address = address
    def say(self) :
        super(Person1, self).say()
        print(f"and address is {self.address}")

def main() :
    p = Person("Jake", 30)
    p.say()
    print("-"*30)
    p1 = Person1("Smith", 29, "Street 7")
    p1.say()

if __name__ == '__main__' : 
    main()

부모 클래스의 멤버 변수와 동일한 이름을 자식 클래스에서 사용하면 오버라이드 즉, 함수 재정의가 발생한다. 

함수가 재정의되면, 부모 클래스의 멤버함수는 자식 클래스의 멤버 함수로 대체된다. 

그렇게 때문에, 부모 클래스의 함수를 사용하고 싶으면, super() (부모 클래스를 의미함) 를 사용해야한다. 

 

반응형

관련글 더보기