[파이썬 기초] 상속
1. 상속
- 이미 정의된 클래스를 기반으로 새로운 요소를 추가해서 클래스를 다시 정의하는 것을 말한다.
- 이미 있던 클래스를 '슈퍼클래스', 새로 정의한 클래스를 '서브 클래스'라고 부른다.
- 서브 클래스는 슈퍼 클래스가 갖고 있던 기능을 그대로 포함하므로 서브 클래스를 정의할 때 슈퍼 클래스와 서브 클래스의 차이만 다시 정의하면 된다.
2. 클래스를 상속하는 방법
class 서브클래스 이름 ( 슈퍼클래스 이름) :
서브 클래스 정의
- 클래스 이름 뒤에 슈퍼클래스의 이름을 쓰자.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 | class Car: ''' 기본적인 기능을 갖춘 자동차를 나타내는 클래스 ''' def __init()__(self, owner): self.handle = 0 self.car_type="normal" self.owner = owenr def turn_left(self): ''' 핸들을 왼쪽으로 꺾는다 ''' self.handle -= 90 def turn_right(self): ''' 핸들을 오른쪽으로 꺾는다 ''' self.handlef += 90 def show_status(self): ''' 상태를 표시한다 ''' print("---" print("owner:", self.owner) print("car_type:", self.car_type) print("handle:", self.handle) # 서브클래스 정의 class Van(Car): ''' 밴 클래스 ''' def __init()__(self, owner): super().__init()__(owner) self.car_type="van" def open_door(self): ''' 문을 자동으로 연다 ''' print("문이 열렸습니다.") def close_door(self): ''' 문을 자동으로 닫는다''' print("문을 닫았습니다.") | cs |
- 서브클래스의 생성자에서 슈퍼클래스의 __init()__메서드를 호출한다. super()를 사용하면 슈퍼 클래스의 메서드를 호출할 수 있다.
1 2 3 4 5 6 7 8 | # 정의한 클래스를 포함한 모듈을 임포트한다. # car.py안에 정의한 함수와 클래스를 임포트할 수 있다. # 임포트 후 '모듈명.클래스명()'과 같은 형식으로 기술하면 클래스를 이용할 수 있다. import car car1 = car.Van("Gildong") car1.turn_left() # 슈퍼클래스에 있는 메서드를 사용할 수 있다. car1.turn_right() | cs |
3. 상속은 언제 사용할까?
- 자주 사용될 것 같은 요소들을 클래스의 형태로 묶어주자.
4. 메서드 오버라이드
1 2 3 4 5 6 7 8 9 10 11 12 | class SuperClass: def blar(self): print("SuperClass.blar") class SubClass(SuperClass): def blar(self): print("SubClass.blar") it = SubClass() it.blar() # SubClass.blar | cs |
- 슈퍼클래스와 서브 클래스 모두 같은 메서드를 정의하면, 상속받은 슈퍼클래스의 메서드가 서브 클래스의 메서드의 메서드로 새롭게 정의된다.
- 서브클래스에서 슈퍼클래스의 메서드를 오버라이드한 상태라도 슈퍼클래스의 메서드를 super()를 통해 호출할 수 있다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | class SuperClass: def blar(self, id): print("---") print("SuperClass.blar=", id) class SubClass(SuperClass): def blar(self, id): super().blar(id) print("SubClass.blar=",id) rc = SuperClass() rc.blar(100) # SuperClass.blar= 100 sc = SubClass() sc.blar(300) # SuperClass.blar= 300 # SubClass.blar= 300 | cs |
5. 다중상속
- 파이썬은 다중상속을 지원하는데, 여러 개의 클래스를 슈퍼클래스로 지정하는걸 의미한다.
class 서브 클래스명 ( 슈퍼 클래스1, 슈퍼 클래스2, 슈퍼 클래스3, ...):
서브 클래스 정의
- 다중상속을 지원하지 않는 언어도 있는데, 예를 들어 클래스A와 클래스B에 동일한 이름의 메서드가 정의되어 있고, 이를 클래스C가 상속하게 되면 어느 메서드를 사용하게 될까?
- 다중상속의 우선순위가 있는데, 파이썬에서는 왼쪽에 지정한 클래스가 가장 우선된다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | class A: def print(self): print("A") class B: def print(self): print("B") class C(A,B): pass obj = C() obj.print() # A | cs |