Python/파이썬 기초

파이썬 클래스 상속(오버로딩), super().__init__() 의미

jimmy_AI 2021. 12. 30. 19:43
반응형

파이썬 클래스 상속과 super()

안녕하세요. 이번 시간에는 파이썬에서 클래스를 다룰 때,

상속을 진행하는 경우의 원리와 예제,

그리고 super().__init__() 함수가 의미하는 바가 무엇인지에 대하여

살펴는 시간을 가져보겠습니다.

 

가장 많이 다루는 클래스 상속 예제인 Person과 Student의 관계를 가지고

이 글에서도 설명해보도록 하겠습니다.

 

우선, 다음과 같은 간단하게 구현된 Person 클래스가 있다고 가정하겠습니다.

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

    def get_name(self):
        print(f'제 이름은 {self.name}입니다.')
    
    def get_age(self):
        print(f'제 나이는 {self.age}세 입니다.')

name과 age 두 가지의 속성을 가지며,

이름과 나이를 출력할 수 있는 두 가지 메소드를 가진 간단한 형태의 클래스입니다.

 

클래스를 호출하고 메소드를 실행시키는 예제는 다음과 같습니다.

person_a = Person('김OO', 27)
person_a.get_name() # 제 이름은 김OO입니다.
person_a.get_age() # 제 나이는 27세 입니다.

 

이제, 이 사람이 대학생이라고 가정을 해보고, GPA라는 새로운 속성

추가로 부여하는 상황을 살펴보겠습니다.

만일, Student라는 클래스를 별개로 구현한다면, 다음과 같이 나타낼 수 있습니다.

class Student:
    def __init__(self, name, age, GPA):
        self.name = name
        self.age = age
        self.GPA = GPA

    def get_name(self):
        print(f'제 이름은 {self.name}입니다.')
    
    def get_age(self):
        print(f'제 나이는 {self.age}세 입니다.')

    def get_GPA(self):
        print(f'제 학점은 {self.GPA}입니다.')

 

그러나 위와 같은 경우, Person 클래스에서 사용했던 name과 age 속성,

그리고 get_name과 get_age 메소드를 중복해서 작성하고 있는

상황이 펼쳐지고 있습니다.

 

만일, 다른 직업에 대한 클래스를 Person 클래스의 정보를 포함하여

새롭게 구현해야 상황에도 같은 작업이 반복되는 것은 낭비인 듯 합니다.

따라서, 이와 같은 경우 중복된 속성과 메소드를 쉽게 포함시킬 수 있게 해주는 기능이

클래스의 상속입니다. 이제 이에 대한 예제를 아래에서 살펴보겠습니다.

 

 

파이썬 클래스 상속 방법 : super().__init__()

super().__init__()이라는 코드가 다른 클래스의 속성 및 메소드

자동으로 불러와 해당 클래스에서도 사용이 가능하도록 해줍니다.

 

Student 클래스에서 Person 클래스의 속성 및 메소드를 가져오는 경우를

가정해보겠습니다. 아래와 같이 코드가 간소화된 것을 확인하실 수 있습니다.

class Student(Person):
    def __init__(self, name, age, GPA):
        super().__init__(name, age)
        self.GPA = GPA

    def get_GPA(self):
        print(f'제 학점은 {self.GPA}입니다.')

클래스 선언 시에 Student(Person)처럼 상속할 부모 클래스의 이름을

괄호 내에 적어주시면 됩니다.

초기화 단계에서 부모 클래스의 __init__ 메소드를 호출하는 원리로 진행됩니다.

그리고, 부모 클래스에 전달할 input을 super().__init__() 내에 적어주시면 됩니다.

 

get_age, get_name 함수가 Student 클래스 객체 내에 잘 포함되었는지를

확인해보도록 하겠습니다.

student_a = Student('김OO', 27, 3.4)
student_a.get_name() # 제 이름은 김OO입니다.
student_a.get_age() # 제 나이는 27세 입니다.
student_a.get_GPA() # 제 학점은 3.4입니다.

새롭게 구현한 get_GPA까지 세 가지 메소드가 모두 정상 실행되고 있는 것을

알 수 있었습니다.

반응형

부모 클래스와 다른 메소드 사용하기

때로는 메소드 이름은 같지만, 부모 클래스와 다른 기능을 하는 메소드를

구현하고 싶은 경우가 있을 것입니다.

 

이 경우에는, 상속받은 클래스 내에서 해당 메소드를 새롭게 다시 구현해주면

다른 기능을 수행하도록 만들 수 있습니다.

class Student(Person):
    def __init__(self, name, age, GPA):
        super().__init__(name, age)
        self.GPA = GPA

    def get_name(self):
        print(f'저는 대학생 {self.name}입니다.')

    def get_GPA(self):
        print(f'제 학점은 {self.GPA}입니다.')

get_name 메소드를 부모 클래스에서와는 다른 메시지가 출력되도록

설정해보았습니다. 결과를 확인해보면 아래와 같습니다.

student_a = Student('김OO', 27, 3.4)
student_a.get_name() # 저는 대학생 김OO입니다.

바뀐 메소드의 출력 결과가 정상적으로 반영된 것을 확인할 수 있었습니다.

 

 

부모 클래스의 메소드 호출하기 : super() 이용

마지막으로, 부모 클래스에서 구현했던 메소드를 호출하는 예제를 살펴보겠습니다.

get_name을 자식 클래스에서 새롭게 구현했음에도,

부모 클래스에서 구현되었던 get_name을 호출해보는 경우입니다.

get_GPA 함수 내에서 Student 클래스의 get_name이 아닌

Person 클래스의 get_name이 호출되고 있음을 보았습니다.

 

부모 클래스의 메소드를 호출하는 경우는 super().메소드이름 형태

코드를 작성해주시면 됩니다.