python-20: 상속
상속(inheritance)
-
기존에 사용중인 클래스의 필드 중
새롭게 만들 클래스에서 필요한 것들이 있다면
상속을 받아서 그대로 사용한다. -
여러 클래스를 선언할 때 중복되는 기능들이 존재한다면
공통 기능들을 담아놓을 클래스를 선언한다.
- 부모 클래스, 상위 클래스, 슈퍼 클래스, 기반 클래스 : 필드를 전달하는 쪽
- 자식 클래스, 하위 클래스, 서브 클래스, 파생 클래스 : 필드를 전달받는 쪽
상속 문법
class A :
A필드
class B(A, C, D) :
A, C, D, B필드
다중 상속
- 부모 클래스가 한 개가 아닌 여러 개이다. 이러한 기법을 다중 상속이라고 한다.
모호성
- 여러 부모의 필드 중 같은 이름의 필드를 자식 클래스에서 사용한다면,
- 어느 부모의 필드인지 알 수가 없기 때문에 이러한 성질을 모호성이라고 한다.
생성자
- 부모 클래스에 생성자가 선언되어 있고,
- 자식 클래스에는 기본 생성자가 있다면 부모 클래스 생성자를
- 자동으로 호출해준다. 하지만 자식 클래스에서 생성자를 직접 선언하면
- 부모 생성자를 자식 생성자에서 직접 호출해 주어야 한다.
자식 클래스에 생성자가 있을 때
- 부모에 있는 필드와 자식에서 필요한 필드가 있을 때
- 부모 생성자를 호출하여 부모 필드를 초기화 해주고
- 추가된 자식 필드를 추가로 초기화 해주어야 할 때
자식 클래스에 생성자가 없을 때(기본 생성자만 있을 때)
- 부모의 필드 외에 추가적인 필드가 없을 때, 부모 생성자를 그대로 사용한다.
다형성(polymorphism) /overriding
- 재정의 : 부모 필드에서 수정하고 싶은 메소드는 자식 필드에서 같은 이름으로 재선언 할 수 있다.
- 항상 부모 생성자가 먼저 호출되어 부모 필드가 메모리에 할당된다.
- 먼저 할당된 부모 필드에 a라는 메소드가 있다면, 나중에 할당되는
- 자식 필드의 a메소드의 기능(소스코드의 주소값)으로 덮어 씌워 진다.
data = 10 : 부모
data = 20 : 자식
print(data) == 20출력
inheritance test
class A:
def __init__(self, data = 10):
self.data = data
print("부모 생성자 호출")
def printData(self):
print(self.data)
def show(self):
print("부모 메소드")
class B(A):
# pass
def __init__(self, data, data2):
# A.__init__(self, data) // 부모 클래스는 super()로 대체가능
super().__init__(data) // 부모 클래스와 self를 같이 호출
# self.data = data //부모생성자를 불러서 초기화할꺼임
self.data2 = data2
# def printData2(self):
# print(self.data, self.data2)
#Overriding
def printData(self):
print(self.data, self.data2)
# b = B()
# b.printData()
# b.show()
b = B(30, 20)
b.printData()
# b.printData2()
- 객체전달할때는 주소값이 같이 전달되기때문에 매개변수 반드시 self해야함
inheritance test2
class Car:
wheel = 4
def __init__(self, brand, color, price):
self.brand = brand
self.color = color
self.price = price
def engineStart(self):
print(self.brand + "열쇠로 시동 킴")
def engineStop(self):
print(self.brand + "열쇠로 시동 끔")
class SuperCar(Car):
def __init__(self, brand, color, price, mode):
super().__init__(brand, color, price)
self.mode = mode
#Overriding
def engineStart(self):
print(self.brand + "음성으로 시동 킴")
def openRoof(self):
print("지붕 열림")
def closeRoof(self):
print("지붕 닫힘")
ferrari = SuperCar("ferrari", "red", 35000, "daily")
ferrari.engineStart()
ferrari.engineStop()
ferrari.openRoof()
ferrari.closeRoof()
class variable
class A:
seq = 0
def __init__(self):
A.seq += 1
self.num = A.seq
def test(self):
self.seq = 10
obj1 = A()
obj2 = A()
obj3 = A()
obj4 = A()
obj1.test()
print(obj1.num)
print(obj1.seq)
print(obj2.num)
print(obj3.num)
댓글남기기