클래스에 대한 정의를 공부하면 항상 나오는 예시가 있다. 붕어빵과 붕어빵을 만드는 틀이다.
붕어빵을 매번 만드는것이 아니라 붕어빵 틀을 만들어놓고 틀에 맞게 찍어내면 훨씬 효율적인 생산이 된다. 여기서 붕어빵은 객체
, 붕어빵의 틀은 클래스
의 역할을 한다.
붕어빵 = 객체
클래스 = 객체를 만드는 위해 필요한 설계도(틀)
class FishCakeMaker:
def __init__(self, parameter):
self._fish_name = parameter
pass # 작성할 코드 구현
__init__(self)
: 생성자. 클래스가 최초 생성될 때 호출 된다. 클래스가 생성이 되는 순간 그 때 실행이 되는 코드를 구현한다.
self()
: 클래스의 멤버 함수와 변수에는 항상 self
가 붙어야 한다.
위의 코드에서 매개변수인 parameter 값을 설정하고 싶으면 아래와 같이 추가해주면 된다.
class FishCakeMaker:
def __init__(self, parameter):
self._fish_name = parameter
pass # 작성할 코드 구현
self
가 들어감으로써 코드를 보고, '이 함수는 self
가 들어갔기 때문에 FishCakeMaker
클래스에 속하는 함수다. 또한 _fish_name
변수도 self
가 들어갔기 때문에 FishCakeMaker
클래스에 속하는 변수다.' 라고 이해할 수 있다.
파이썬에서는 클래스 내부에 생성된 함수와 클래스 밖에서 정의된 함수의 이름이 같은 경우 (1 번과 2번) 어디에 있는 함수를 사용하라는건지 구분할 수 있는 방법이 없다.
def show_name(): # ---------- 1
print("A")
class FishakeMaker:
def __init__(self, parameter):
self._fish_name = parameter
pass
def show_name(): # ----------- 2
print("A")
그렇기 때문에 클래스 내부에 있는 멤버 함수의 경우 클래스에 속해 있는 함수라는 것을 알려주기 위해서 self
를 사용한다.
자식클래스가 부모클래스의 기능을 물려받아서 부모클래스의 기능까지 사용할 수 있는 것
class MarketGoods(FishCakeMaker):
def __init__(self, margin=1000, **kwargs):
super().__init__(**kwargs)
self._market_price = self._price + margin
위에서 만든 FishCakeMaker
클래스를 새로운 클래스은 MaketGoods
가 상속받았다. 상속을 시키는것은 클래스를 정의할 때 뒤의 ()
에 상속 할 클래스를 적어주면 된다.
여기서 중요한 점은 부모 클래스의 기능을 사용하기 위해선 super()
를 사용해야한다는 것이다.
위의 예시를 보면 MaketGoods
클래스에서는 self._price
를 선언한 적이 없다. 하지만 FishCakeMaker
클래스를 상속받았고, 상속 해 준 부모 클래스인 FishCakeMaker
클래스에는 self._price
가 선언되어 있기 때문에 사용할 수 있게 된 것이다.
class MarketGoods(FishCakeMaker):
def __init__(self, margin=1000, **kwargs):
super().__init__(**kwargs)
self._market_price = self._price + margin
def show(self):
print(self._flavor, self._market_price)
fish1 = MarketGoods(size=20, price=500)
fish1.show()
실행결과
price
를 500
으로 했지만 결과는 1500
이 나왔다. 이러한 이유는 부모 클래스에서의 price 500
에 자식 클래스에서의 margin 1000
이 있기에 두 값이 더해져서 self.market_place
값이 1500
이 됐고, 그 값을 print
해주었기 때문이다.
이처럼 상속은 클래스를 확장해서 사용하는 경우에 주로 사용된다.