개발 & 데이터베이스/파이썬

파이썬 클래스 상속과 오버라이딩, 오버로딩

K.두부 2022. 1. 11. 21:07
반응형

클래스 상속

클래스가 다른 클래스로부터 데이터 속성과 메소드를 물려받는 것을 말함.

  • 유산을 물려주는 클래스를 기반 클래스 혹은 부모 클래스라고 불림
  • 유산을 물려받는 클래스를 파생 클래스 혹은 자식 클래스라고 불림

 

클래스를 상속하는 방법은 자식 클래스의 이름 뒤에 괄호()를 붙이고 그 안에 부모 클래스의 이름을 적으면 된다.

class parent:
    test

class Child(parent):
    test

 

오버라이딩과 오버로딩은 어떻게 다른걸까?

오버라이딩과 오버로딩을 이해하려면 객체 지향 프로그래밍에서의 다형성이라는 개념을 알아야한다.

다형성이란 같은 모양의 코드가 다른 동작을 하는 것을 의미하며, 종류로는 오버라이딩과 오버로딩이 있다.

 

오버라이딩 상위 클래스의 메소드를 하위 클래스가 재정의해서 사용함
오버로딩 같은 이름의 메소드를 여러 개 가지면서 매개변수의 유형과 개수를 다르게 가짐

 

파이썬에서는 오버로딩을 지원하지 않는다. 하지만 지역변수에 디폴트 값을 부여함으로써 오버로딩의 기능을 대체할 수 있다.

 

 

1. 오버라이딩

class Car:

    def __init__(self, name):
        self.name = name

    def show_info(self):
        print("이름:" + self.name)

class Acar(Car):
    pass

# 오버라이딩
class Bcar(Car):
    def show_info(self):
        print(self.name)
        
Acar = Car('트럭')
print(Acar.show_info())  # 이름: 트럭

Bcar = Car('람보르기니')
print(Bcar.show_info())  # 이름: 람보르기니

Acar.show_info() 를 호출하면 '이름:트럭'이 출력되지만, Bcar.show_info() 를 호출하면 '이름:람보르기니'가 출력된다.

 

이는 파이썬의 기본 원칙인 '아래에 위치한 메소드가 위에 위치한 메소드보다 우세하다'의 특징 때문에 오버라이딩이 적용된 모습을 볼 수 있고, 동일한 이름의 부모 클래스 내 함수를 자식 클래스 내에서 쓸 수 있음을 보여준다.

 

 

2. 오버로딩

class overloading:
    def __init__(self, *args):
        self.args = list(args)

    def __call__(self):
        print("overloading list:", self.args)

    def __add__(self, other):
        self.args += other.args


word1 = overloading("Hello World", "Good Bye")
word2 = overloading("Python")

print(word1())  # ['Hello World', 'Good Bye']
print(word2())  # ['Python']

위의 예시는 연산자의 오버로딩이다.

 

__add__ 메소드를 이용해서 word1 + word2 를 간단하게 합칠 수 있다.

class overloading:
    def __init__(self, *args):
        self.args = list(args)

    def __call__(self):
        print("overloading list:", self.args)

    def __add__(self, other):
        self.args += other.args


word1 = overloading("Hello World", "Good Bye")
word2 = overloading("Python")

word1 + word2  # __add__ 메소드 실행(오버로딩의 예시)

print(word1())  # ['Hello World', 'Good Bye', Python']
print(word2())  # ['Python']

위 코드의 출력값을 보면 word1의 결과는 바뀌었지만, word2는 변경되지 않은 것을 확인할 수 있다.

반응형