파이썬 Python

[파이썬] 클래스 상속, 메서드 오버라이딩 (예시를 통한 설명)

킹남지 2021. 6. 22. 03:18
반응형

전 포스팅에서 파이썬의 클래스(class)를 알아봤습니다!

이번에는 클래스의 상속(inheritance)과, 메서드 오버라이딩(method overriding)에 대해 정리해보겠습니다.

 

상속(inheritance)

클래스 간에도 상속의 개념을 사용합니다.

상속은 흔히 알고있는 뜻과 같습니다. (무언가를 물려받는) 

 

어떤 클래스를 정의할 때 이미 정의된 다른 클래스의 속성을 물려받는 절차를 말합니다.

 

이때 속성을 물려주는 클래스를 슈퍼 클래스(super class) ('부모 클래스'라고도 부릅니다.)

속성을 상속하는 클래스를 서브 클래스(sub class) ('자식 클래스'라고도 부릅니다.) 

라고 합니다.

 

상속을 받는 방법은 간단합니다.

아래의 예시처럼, 서브 클래스를 선언할 때 ()안에 슈퍼 클래스를 포함시키면 됩니다. 

class super_class:
    def __init__(self):
    	...

class sub_class(super_class):
    ...

 

사실 파이썬의 모든 클래스는 상속을 받고 있습니다.

참고자료 [2] 의 파이썬 문서에도 쓰여있듯이 기본적으로 최상위 클래스 object를 상속받습니다.

 

따라서 구글 파이썬 스타일 가이드에서는 한 클래스가 다른 클래스를 상속받지 않는 경우! 파이썬의 최상위 클래스인 object를 표기하는 것을 권장합니다.

 

이전 포스팅의 예시를 고쳐보겠습니다

 

< before >

class example(): # example라는 이름의 클래스를 만듭니다.
    def __init__(self): 
        self.ary = []
        print('__init__()메서드를 통해 객체를 초기화 했습니다.')

    # 메서드를 하나 정의합니다.
    def ary_append(self, item): # 첫 번째 인수는 self 임을 확인!
        self.ary.append(item)

< after >

# 좋은 예, object를 명시적으로 표기해줍니다.
class example(object): # example라는 이름의 클래스를 만듭니다.
    def __init__(self): 
        self.ary = []
        print('__init__()메서드를 통해 객체를 초기화 했습니다.')

    # 메서드를 하나 정의합니다.
    def ary_append(self, item): # 첫 번째 인수는 self 임을 확인!
        self.ary.append(item)

 

메서드 오버라이딩(method overriding)

메서드 오버라이딩은 서브 클래스에서 부모 클래스의 메서드를 재정의 하는것입니다.

만약 슈퍼 클래스의 메서드를 호출해야 한다면, super() 메서드를 통해 호출이 가능합니다.

 

바로 예시를 보겠습니다.

먼저, 슈퍼 클래스를 만들었습니다.

class car(object):
    def __init__(self, color, km):
        self.color = color
        self.km = km

    def change_color(self, color):
        self.color = color

    def change_km(self, km):
        self.km = self.km + km

    def info(self):
        print(f'차량의 색상 : {self.color}, 주행 거리 : {self.km}km')

sonata = car("red", 100)
sonata.info()
sonata.change_color("blue")
sonata.change_km(50)
sonata.info()

[출력 결과]
차량의 색상 : red, 주행 거리 : 100km
차량의 색상 : blue, 주행 거리 : 150km

다음은 car의 속성을 물려받는 sub_car 서브 클래스입니다.

class sub_car(car):
    def __init__(self, color, km):
        super().__init__(color, km)
    
    def change_km(self, km): # 재정의
        self.km = self.km - km

    def info(self):
        print(f'<차량 정보>')
        super().info() # super() 메서드를 사용해 슈퍼 클래스의 메서드 호출

bmw = sub_car("purple", 2000)
bmw.info()

bmw.change_color("red") # 부모 클래스의 메서드 그대로 사용
bmw.change_km(300) # 재정의된 메서드 사용
bmw.info() # 재정의된 메서드 사용

[출력 결과]
<차량 정보>
차량의 색상 : purple, 주행 거리 : 2000km
<차량 정보>
차량의 색상 : red, 주행 거리 : 1700km

 

1. () 안에 car를 넣어 car 클래스를 슈퍼 클래스로 상속받고 있습니다.

2. 슈퍼 클래스의 change_km 메서드와, info 메서드를 재정의 했습니다.

3. info 메서드의 재정의 과정 중 super() 메서드를 사용해 슈퍼 클래스의 메서드를 호출했습니다.

 

공부하면서 다른 예시를 만들어보시길 바랍니다.

 

읽어주셔서 감사합니다. ^^

 

[관련 게시물]

https://kingnamji.tistory.com/6

 

[파이썬] 클래스와 객체, 인스턴스를 이해해보자 (예시를 통한 설명)

파이썬의 클래스(class)와 객체(object), 인스턴스(instance)에 대해 정리해보겠습니다. 클래스(class), 객체(object), 인스턴스(instance)를 구분해보자. 클래스(class)는 주로 어떤 틀에 비유됩니다. 즉, 똑같

kingnamji.tistory.com

[참고 자료]

[1] https://wikidocs.net/28#_2

[2] https://docs.python.org/ko/3/tutorial/classes.html

 

반응형