Programming/Python

[Python 3.7] 파이썬 클래스 상속 개념과 오버라이딩, super()

Nirsa 2020. 2. 7. 12:49
반응형

 

  • 클래스 상속

클래스 상속은 말 그대로 클래스를 물려받는 개념 입니다. 기반이 되는 클래스를 부모 클래스(parent class) 또는 기반 클래스(base class), 슈퍼 클래스(super class) 라고 부르며, 물려받은 클래스를 자식 클래스(child class) 또는 파생 클래스(derived class), 서브 클래스(sub class) 라고 합니다.

이 글에서는 부모 클래스와 자식 클래스라는 단어를 사용 하겠습니다. 자식 클래스는 자기 자신의 메서드와 부모 클래스의 메서드를 모두 사용할 수 있습니다.

부모 클래스는 평소 사용하던 문법과 차이가 없고, 자식 클래스만 약간 차이가 납니다.

클래스를 선언하게되면 class child_class: 와 같이 설정을 했지만, 상속받기 위해선 class child_class(parent_class): 와 같이 ()에 부모 클래스의 이름을 작성해주어야 합니다. 아래 코드는 자식 클래스인 child_class로 인스턴스를 생성하여 자신의 메서드와 부모 클래스의 메서드까지 호출 하였습니다.

# 부모 클래스
class parent_class:
    def parent_print(self):
        print('부모 클래스 입니다.')
        
    def add(self, a, b):
        print('{0} + {1} = {2} 입니다.'.format(a, b, a + b))
        
# 부모 클래스를 parent_class 으로 지정
class child_class(parent_class):
    def child_print(self):
        print('자식 클래스 입니다.')

# 자식 클래스인 child_class의 인스턴스 생성
test = child_class()


# 자식 클래스인 child_class 클래스의 child_print 호출
test.child_print()

# 부모 클래스인 parent_class 클래스의 parent_print 호출
test.parent_print()

# 부모 클래스인 parent_class 클래스의 add 호출
test.add(5, 6)

결과값 : 자식 클래스 입니다.
결과값 : 부모 클래스 입니다.
결과값 : 5 + 6 = 11 입니다.

프로그래밍을 하다보면 중복되는 기능을 같은 코드로 다시 넣어야 하는 상황이 오게 되는데 상속을 사용하면 똑같은 기능을 가진 코드를 다시 삽입하지 않아도 사용이 가능 합니다.

예를들어 어떤 클래스를 하나 더 만들어야 하는데 그 기능에 입력값 두개의 합을 구하고 출력하는 코드가 필요 할 때, 기존에 이미 그 기능을 가진 클래스가 있다면 굳이 기능을 하나 더 만들지 않더라도 부모 클래스에 이미 만들어져있는 메소드를 지정하여 사용할 수 있습니다.

 

  • 메소드 오버라이딩(Overriding)과 super()

메소드 오버라이딩은 상속 관계에서 동일한 메소드가 있을 때 특정 클래스의 메소드를 무시하고, 다른 클래스의 메소드를 사용하는 방식 입니다. 오버라이딩은 기존에 이미 만들어진 메소드의 이름을 똑같이 만들어야할 때 사용 됩니다.

예를들어 아래와 같이 부모 클래스(parent_class)에 over 메소드가 있을 때 자식 클래스(child_class)에도 over라는 메소드가 필요하여 자식 클래스에 사용하게 되면 자식 클래스의 over 메소드가 호출 됩니다.

class parent_class:
    def over(self):
        print("부모 클래스의 over 메소드 입니다.")

class child_class(parent_class):
    def over(self):
        print("자식 클래스의 over 메소드 입니다.")

test = child_class()
test.over()

결과값 : 자식 클래스의 over 메소드 입니다.

 

이렇게 동일한 이름의 메소드를 삽입했을 때 특정 클래스의 메소드가 무시되는걸 오버라이딩이라고 합니다.

만약, 필요에 의해 오버라이딩한 자식 클래스의 over 메소드를 삽입 했으나 부모 클래스의 over 메소드도 같이 필요하다면 super() 를 이용하시면 됩니다.

class parent_class:
    def over(self):
        print("부모 클래스의 over 메소드 입니다.")

class child_class(parent_class):
    def over(self):
        super().over()
        print("자식 클래스의 over 메소드 입니다.")

test = child_class()
test.over()

결과값 : 부모 클래스의 over 메소드 입니다.
결과값 : 자식 클래스의 over 메소드 입니다.

이렇게 super()를 이용할 경우 부모 클래스의 지정한 메소드를 호출하며, 오버라이딩된 상황에서 특정 메소드를 중복하여 출력하거나 값이 필요한 경우 사용될 수 있습니다.

 

반응형