About Python – “클래스(2) – 생성자, 소멸자”
About Python – “클래스(2) – 생성자, 소멸자”
파이썬의 생성자(Constructor)
생성자(영어: constructor, 혹은 약자로 ctor)는 객체 지향 프로그래밍에서 객체의 초기화를 담당하는 서브루틴을 가리킨다. 생성자는 객체가 처음 생성될 때 호출되어 멤버 변수를 초기화하고, 필요에 따라 자원을 할당하기도 한다. 객체의 생성 시에 호출되기 때문에 생성자라는 이름이 붙었다.
생성자는 대체로 멤버 함수와 같은 모양을 하고 있지만, 값을 반환하지 않는다는 점에서 엄밀한 의미의 함수는 아니다.
위키백과
이전 글 에서 만들었던 클래스를 살펴봅시다.
class ScoreManage:
def getscore(self, data1, data2):
self.name1, self.score1 = data1
self.name2, self.score2 = data2
def average(self):
average = (self.score1 + self.score2)/2
return average
def winner(self):
if self.score1 > self.score2:
return self.name1, self.score1
else:
return self.name2, self.score2
a = ScoreManage()
a.getscore(("민수", 50), ("동현", 80))
print(a.winner())
마지막 세 줄을 보면, a.getscore()
코드를 통해서 이름과 점수를 얻어왔습니다. 코드의 윗부분에서 정의한 메서드인 average()
, winner()
들을 사용하려면 getscore()
메서드로 이름과 점수를 입력받는 것이 필수로 선행되어야 합니다. 점수와 이름이 없는데, 평균을 구하고 누가 더 시험을 잘 봤는지를 구할 수는 없는 노릇이니까요.
a.getscore(("민수", 50), ("동현", 80))
의 코드와 같이 객체에게 필수로 초깃값을 정해줄 필요가 있을 때에 사용하는 것을 생성자(constructor) 이라고 합니다. 파이썬에서는 __init__
이라는 이름을 통하여 생성자를 정의할 수 있습니다.
class ScoreManage:
def __init__(self, data1, data2): # 생성자
self.name1, self.score1 = data1
self.name2, self.score2 = data2
def average(self):
average = (self.score1 + self.score2)/2
return average
def winner(self):
if self.score1 > self.score2:
return self.name1, self.score1
else:
return self.name2, self.score2
a = ScoreManage()
# TypeError: ScoreManage.__init__() missing 2 required positional arguments: 'data1' and
# 'data2'
위와 같이 __init__
을 통하여 생성자를 만들면a = ScoreManage()
처럼 객체를 만들 때에 생성자가 자동으로 호출됩니다. 자동으로 메서드가 호출되기 때문에, 위의 코드를 바로 실행하면 에러가 납니다.ScoreManage.__init__() missing 2 required positional arguments
– 클래스의 생성자가 호출되었고, 그 생성자에는 2개의 아규먼트가 들어가야 하지만 그것이 누락되었다는 것입니다.
파이썬의 소멸자(Destructor)
소멸자는 객체가 소멸될 때 자동으로 발생하는 메소드이다. 이것은 생명 주기가 다른 객체에 삽입되었거나 동적으로 할당돼서 명시적으로 풀려나는 경우에, 자신의 생명주기가 범위에 묶여있고 실행이 변수 영역을 떠날 때 발생한다.
위키백과
class ScoreManage:
def __init__(self, data1, data2): # 생성자
print("객체 생성됨.")
self.name1, self.score1 = data1
self.name2, self.score2 = data2
def __del__(self): # 소멸자
print("객체 소멸됨.")
def average(self):
average = (self.score1 + self.score2)/2
return average
def winner(self):
if self.score1 > self.score2:
return self.name1, self.score1
else:
return self.name2, self.score2
a = ScoreManage(("수혁", 50),("수형",20))
print(a.winner())
print(a.average())
# 객체 생성됨.
# ('수혁', 50)
# 35.0
# 객체 소멸됨.
def __del__(self):
로 소멸자를 정의했습니다. 정상적으로 소멸자가 작동한다면 객체가 사라지며 "객체 소멸됨."
이 출력될 것입니다. 파이썬에서는__del__
라는 이름을 통해서 소멸자를 정의할 수 있습니다. 프로그램이 종료되고 객체가 소멸되며 소멸자가 호출되는 것을 볼 수 있습니다.
About Python – “클래스(3) – 클래스의 상속, 메소드 오버라이딩” 에서 이어집니다.