Hey Tech
[Python] 클래스 상속, 메서드 오버라이딩(method overriding), 슈퍼(super) 함수에 대해 알아보자! 본문
[Python] 클래스 상속, 메서드 오버라이딩(method overriding), 슈퍼(super) 함수에 대해 알아보자!
Tony Park (토니) 2021. 5. 1. 11:12본 포스팅에서는 클래스 상속(Class Inheritance)의 의미를 알아보고 파이썬으로 실습합니다. 또한, 메서드 오버라이딩(method overriding)과 슈퍼 함수(super)까지 알아봅니다.
📚목차
1. 클래스 상속이란?
1.1. 클래스 상속의 의미
1.2. 부모 클래스와 자식 클래스
1.3. 클래스 상속 방법
2. 클래스 상속 예시
3. 메서드 오버라이딩(method overriding)
4. 슈퍼 함수(super)
1. 클래스 상속이란?
1.1. 클래스 상속의 의미
클래스 상속은 기존에 정의한 클래스의 속성 및 메서드를 그대로 사용할 수 있도록 클래스 간에 물려주거나 받는 것을 의미합니다. 즉, 클래스 상속은 중복된 메서드를 재정의할 필요가 없다는 장점이 있습니다. 또한, 기존 클래스에서 일부 기능을 추가하거나 변경함으로써 새로운 클래스를 정의할 수 있기 때문에 효율적인 코드 작성이 가능합니다.
1.2. 부모 클래스와 자식 클래스
상속해 주는 기존 클래스는 부모 클래스(Pararent class), 상위 클래스(Super class), 기초 클래스(Base class)라고 부릅니다. 반대로 상속을 받는 클래스는 자식 클래스(Child class), 하위 클래스(Sub class), 파생 클래스(Derived class)라고 부릅니다.
1.3. 클래스 상속 방법 및 예시
클래스를 상속은 자식 클래스 이름 뒤의 괄호 안에 부모 클래스의 이름을 입력하면 됩니다. 아래(⬇) 예시 코드를 참고해 주세요!
2. 클래스 상속 예시
부모 클래스와 자식 클래스 간의 관계를 더욱 직관적으로 이해할 수 있도록 예시를 들어보겠습니다. 자식 클래스로는 축구와 농구 팀 이름을 속성으로 갖는 클래스인 SoccerTeam 과 BasketballTeam 이 있다고 가정하겠습니다.
부모 클래스 생성
class SportsTeam:
def __init__ (self, team_name):
self.team_name= team_name
print(f"{self.team_name} 팀에 대한 정보입니다.")
def won(self, won):
print(f"{self.team_name} 팀은 {won}회 승리하였습니다.")
def loss(self, loss):
print(f"{self.team_name} 팀은 {loss}회 패배하였습니다.")
def draw(self, draw):
print(f"{self.team_name} 팀은 {draw}회 비겼습니다.")
먼저, 위(⬆)와 같이 스포츠 팀 이름을 속성으로 갖고 리그전에서 승리, 무승부, 패배(이하 승무패) 정보를 출력하는 메서드를 갖는 SportsTeam 이라는 부모 클래스를 생성해 보겠습니다.
자식 클래스 생성(상속)
class SoccerTeam(SportsTeam):
def __init__ (self, team_name):
self.team_name = team_name
class BasketballTeam(SportsTeam):
def __init__ (self, team_name):
self.team_name = team_name
다음으로, 위(⬆)와 같이 SoccerTeam 과 BasketballTeam 이라는 자식 클래스를 생성해 보겠습니다. 두 클래스는 SportsTeam 이라는 부모 클래스로부터 상속받습니다. 이를 위해 클래스 정의 시에 클래스 이름 뒤이어 괄호 안에 부모 클래스 이름을 입력해 주었습니다.
클래스 상속은 여러 클래스를 정의함에 있어서 동일한 속성이나 기능을 지원하는 메서드를 중복으로 정의할 필요가 없다는 장점이 있다고 했습니다. 즉, 위의 예시에서도 마찬가지로 축구팀과 농구 팀 모두 리그전을 치르며 승무패 중 1개의 경기 결과를 받습니다. 물론, 농구 경기에는 승부가 날 때까지 연장전을 치르긴 하죠? 이러한 예외 처리는 뒤에 "3. 메서드 오버라이딩" 섹션에서 이어서 다루겠습니다. 따라서 굳이 농구 팀, 축구 팀별 승무패 기록을 각각 출력하는 메서드를 중복으로 정의할 필요 없이 부모 클래스에서 상속받는 것이 코드 작성에 있어 효율적입니다.
자식 클래스 객체에서 상속받은 메서드 활용하기
mcfc = SoccerTeam('Manchester City FC')
mcfc.won(24)
mcfc.loss(4)
mcfc.draw(5)
lal = BasketballTeam('LA Lakers')
lal.won(35)
lal.loss(25)
lal.draw(2)
SoccerTeam 과 BasketballTeam 자식 클래스는 객체 생성 시에 팀 이름을 속성 값으로 전달받지만, 승패 기록을 출력하는 메서드는 정의하지 않았습니다. 그럼에도 승패 기록을 출력하는 메서드가 정의된 부모 클래스로부터 모든 메서드를 상속받기 때문에, 자식 클래스를 갖는 객체 레벨에서 부모 클래스의 메서드(won, loss, draw)를 호출해도 정상적으로 아래(⬇)와 출력되는 것을 확인할 수 있습니다.
출력 결과
Manchester City FC 팀은 24회 승리하였습니다.
Manchester City FC 팀은 4회 패배하였습니다.
Manchester City FC 팀은 5회 비겼습니다.
LA Lakers 팀은 35회 승리하였습니다.
LA Lakers 팀은 25회 패배하였습니다
LA Lakers 팀은 2회 비겼습니다.
3. 메서드 오버라이딩(method overriding)
오버라이드(override)가 '무시하다', '...보다 더 중요하다'와 같은 사전적 의미를 갖습니다. 즉, 메서드 오버라이딩(method overriding)은 부모 클래스로부터 상속받은 특정 메서드를 자식 클래스에서 재정의하는 작업을 의미합니다.
앞서 다룬 예시에서, (리그전의 경우) 축구에는 무승부가 존재하지만 농구에는 연장전을 치러 반드시 승자와 패자를 가리기 때문에 엄밀히는 무승부가 존재하지 않습니다. 하지만 부모 클래스에는 연장전에 대한 언급이 아닌 무승부 기록을 출력하는 메서드(draw)만 존재합니다. 그럼에도 농구 팀의 경우, "무승부 기록"을 "연장전 돌입 횟수"로 변경하고 싶다면 어떻게 해야 할까요?
이런 경우 메서드 오버라이딩을 활용하여 해결할 수 있습니다. 메서드 오버라이딩을 활용하는 방법은 단순히 자식 클래스에서 부모 클래스 내 메서드 포맷을 가져와 내부적으로 수정해 주기만 하면 됩니다. 단, 주의하실 점은 메서드 오버라이딩을 활용하면 부모 클래스에서 정의한 메서드의 기능을 자식 클래스에서 재활용이 불가능하다는 점을 고려하셔야 합니다.
class BasketballTeam(SportsTeam):
def __init__ (self, team_name):
self.team_name = team_name
def draw(self, draw):
print(f"{self.team_name} 팀은 {draw}회 연장전에 돌입했습니다.")
위(⬆)와 같이 자식 클래스인 BasketballTeam 내 draw 메서드를 오버라이딩 하였습니다.
lal = BasketballTeam('LA Lakers')
lal.draw(2)
오버라이딩 작업이 잘 처리되었는지 draw 메서드를 출력해 보겠습니다.
출력 결과
LA Lakers 팀은 2회 연장전에 돌입했습니다.
위(⬆)와 같이 자식 클래스에서 메서드 오버라이딩이 정상적으로 처리되었음을 확인할 수 있습니다.
4. 슈퍼 함수(super)
메서드 오버라이딩을 사용하면 부모 클래스에서 정의한 메서드의 기능을 자식 클래스에서 사용할 수 없다고 했습니다. 그럼에도 슈퍼(super) 함수는 부모 클래스 내 메서드를 자식 클래스에서 이용하면서 동시에 필요한 부분만 재정의하여 사용할 수 있게 도와줍니다. 사용 방법은 간단합니다. 자식 클래스에서 재정의한 메서드 내에 "super().[메서드 이름](매개변수)"와 같이 입력해 주면 됩니다.
class BasketballTeam(SportsTeam):
def __init__ (self, team_name):
self.team_name = team_name
def draw(self, draw):
super().work(draw)
print(f"{self.team_name} 팀은 {draw}회 연장전에 돌입했습니다.")
위(⬆)와 같이 말이죠.
lal = BasketballTeam('LA Lakers')
lal.draw(2)
draw 메서드를 호출하면 결과는 아래((⬇)와 같습니다.
LA Lakers 팀은 2회 비겼습니다.
LA Lakers 팀은 2회 연장전에 돌입했습니다.
이처럼 슈퍼 함수를 활용하면 자식 클래스에서 오버라이딩이 발생하더라도 부모 클래스에서 정의한 메서드를 호출하여 정상적으로 활용할 수 있습니다.
📚 참고할만한 포스팅
1. [Python] 클래스(class), 객체(object), 속성(attribute), 함수(method)에 대해 알아보자!
2. [Python] 메서드(method)와 스태틱/클래스 메서드(static/class method)에 대해 알아보자!
3. [Python] 클래스 상속, 메서드 오버라이딩(method overriding), 슈퍼(super) 함수에 대해 알아보자!
포스팅 내용에 오류가 있을 경우 댓글 남겨주시면 감사드리겠습니다.
그럼 오늘도 즐거운 하루 보내시길 바랍니다 :)
고맙습니다.
'SW 개발 > Python' 카테고리의 다른 글
[Python] 아나콘다(Anaconda) 가상환경 생성, 삭제방법 (2) | 2021.08.19 |
---|---|
[Python] 텍스트 파일 읽고 쓰는 방법에 대해 알아보자!(feat. open, with 구문) (0) | 2021.07.20 |
[Python] 메서드(method)와 스태틱/클래스 메서드(static/class method)에 대해 알아보자! (0) | 2021.04.30 |
[Python] 클래스(class), 객체(object), 속성(attribute), 함수(method)에 대해 알아보자! (0) | 2021.04.29 |
[파이썬] 유니코드를 활용한 문자열-숫자 변환(ord, chr 내장함수) (0) | 2021.04.25 |