2 분 소요

상속(inheritance)

  1. 기존에 사용중인 클래스의 필드 중
    새롭게 만들 클래스에서 필요한 것들이 있다면
    상속을 받아서 그대로 사용한다.

  2. 여러 클래스를 선언할 때 중복되는 기능들이 존재한다면
    공통 기능들을 담아놓을 클래스를 선언한다.

  • 부모 클래스, 상위 클래스, 슈퍼 클래스, 기반 클래스 : 필드를 전달하는 쪽
  • 자식 클래스, 하위 클래스, 서브 클래스, 파생 클래스 : 필드를 전달받는 쪽

상속 문법

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()

image

  • 객체전달할때는 주소값이 같이 전달되기때문에 매개변수 반드시 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()

image

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)

image

댓글남기기