파이썬 클래스 상속과 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().메소드이름 형태로
코드를 작성해주시면 됩니다.
'Python > 파이썬 기초' 카테고리의 다른 글
파이썬 return 값 여러개 설정하기, 재귀 함수 응용 예시 (0) | 2022.01.03 |
---|---|
파이썬 raise 오류 발생시키기, 에러 종류 만들기 (0) | 2021.12.24 |
py 파일 import 방법, if __name__ == '__main__' 의미, Colab에서 py 파일 가져오기 (0) | 2021.12.21 |