앞 절에서 만든 Counter 클래스에는 약간의 문제가 있습니다. Counter 클래스로 객체를 생성한 후에는 항상 reset()을 호출하여야 합니다.
인스턴스 변수를 생성하기 위해서입니다. 객체가 생성될 때 자동적으로 초기화 메소드가 호출되면 좋을 것입니다.
이것이 바로 생성자 메소드입니다.
객체를 만들다보면 객체가 생성될 때, 인스턴스 변수가 기본값들을 가지고 있으면 좋을 것입니다. 객체가 생성될 때, 인스턴스 변수가 초기값들을 가지게 할 수 있을까요?
생성자(constructor)는 객체가 생성될 때 객체를 기본값으로 초기화하는 특수한 메소드입니다.
파이썬에서는 인스턴스 변수가 생성되는 곳이기도 합니다. 객체가 생성될 떄, 생성자는 자동으로 호출됩니다.
우리가 객체를 생성할 때, 클래스 이름과 동일한 메소드를 호출하는데, 바로 이것이 생성자입니다.
a = Counter()
생성자는 객체의 인스턴스 변수들을 정의하고 초기화합니다. 생성자는 초기화 작업을 마치고 객체의 참조값을 반환합니다.
이 참조값이 a와 같은 변수에 저장되는 것입니다.
파이썬에서는 생성자의 이름으로 __init__() 을 사용합니다. __init() 이라는 이름은 초기화(initialize)한다는 의미입니다.
앞 절의 Counter 클래스에 생성자를 추가하여 다시 작성해보면 다음과 같습니다.
class Counter:
def __init__(self): # __init__() 메소드가 생성자입니다. 여기서 객체의 초기화를 담당합니다.
self.count = 0
def reset(self): # 메소드 정의
self.count = 0 # 인스턴스 변수 생성
def increment(self):
self.count += 1
def get(self):
return self.count
Counter 클래스에는 인스턴스 변수가 count뿐이므로 count만 생성하고 초기화하면 됩니다. 생성자의 첫 번째 매개변수는 self이어야 합니다.
self는 현재 초기화되고 있는 객체를 가리킵니다. 파이썬에서는 변수를 초기화하면 변수가 생성된다는 점에 유의합니다.
위의 생성자에도 count 변수가 생성되면서 동시에 초기화되고 있습니다.
class 클래스 이름:
def __init__(self, ...): # __init__() 메소드가 생성자입니다. 여기서 객체의 초기화를 담당합니다.
...
파이썬에서는 클래스 당 하나의 생성자만을 허용합니다. 이것이 좀 불편할 수도 있지만 매개변수의 기본값을 줄 수 있는 기능을 사용하면 어느 정도 보완됩니다.
생성자도 함수의 일종이므로 매개변수를 가질 수 있습니다. 예를 들어서 Counter 클래스의 생성자에서 카운터의 초기값을 받아서 그 값으로 초기화한다고 합시다.
만약 사용자가 초기값을 주지 않으면 0으로 생각합니다.
class Counter:
def __init__(self, initValue = 0): # 생성자가 매개 변수를 가지고 있으며 만약 사용자가 값을 전달하지 않았으면 0으로 생각합니다.
self.count = initValue
...
사용자는 다음과 같이 2가지 방법으로 생성자를 호출할 수 있습니다.