참고 자료
https://www.py4e.com/lessons/servces
찰스 세브란스. 『데이터를 다루며 배우는 파이썬』. 인사이트, 2019.
일반적으로, 변수의 생성과 파괴에 대해서는 그다지 신경 쓸 일이 없지만, 객체가 좀 더 복잡해지면, 객체가 생성된 직후에 필요한 초기 설정이나 객체가 삭제될 때 정리하는 작업이 필요합니다.
객체의 생성 시점이나 종료 시점을 알고 싶다면, 아래처럼 객체에 특별한 이름의 메서드를 추가합니다.
class PartyAnimal:
x = 0
def __init__(self):
print('I am constructed')
def party(self) :
self.x = self.x + 1
print('So far',self.x)
def __del__(self):
print('I am destructed', self.x)
an = PartyAnimal()
an.party()
an.party()
an = 42
print('an contains',an)
# Code: https://www.py4e.com/code3/party4.py
이 코드의 실행 결과는 다음과 같습니다.
I am constructed
So far 1
So far 2
I am destructed 2
an contains 42
파이썬은 객체를 생성할 때 __init__ 메서드를 호출하기 때문에 객체에 필요한 기본값, 초깃값 등을 여기서 설정할 수 있습니다. 파이썬이 아래 줄을 만나면,
an = 42
지금까지 사용하던 PartyAnimal 객체를 멀리 던져버립니다. 그래서 변수 an을 재 사용해서 42라는 새로운 값을 저장할 수 있게 합니다. 이 순간에 an 객체는 소멸자 __del__이 호출되면서 파괴됩니다. 벼수가 파괴되는 걸 막을 수는 없지만, 객체가 더는 존재하지 않게 되기 직전에 필요한 종료 처리를 할 수 있습니다.
객체를 만들 때 생성자를 추가해서 객체의 초깃값을 설정하는 일은 자주 있지만, 객체에 대한 소멸자가 필요한 경우는 상대적으로 드뭅니다.
객체 지향의 진정한 힘은 클래스 인스턴스를 여러개 생성할 때 발휘됩니다.
클래스에서 여러 개의 객체를 생성할 때는 각각의 객체별로 다른 초깃값을 설정하고 싶은 경우가 많습니다. 이 경우는 생성자에 데이터를 전달해서 각 객체마다 다른 초깃값을 가지도록 할 수 있습니다.
class PartyAnimal:
x = 0
name = ''
def __init__(self, nam):
self.name = nam
print(self.name,'constructed')
def party(self) :
self.x = self.x + 1
print(self.name,'party count',self.x)
s = PartyAnimal('Sally')
j = PartyAnimal('Jim')
s.party()
j.party()
s.party()
# Code: https://www.py4e.com/code3/party5.py
생성자는 객체 인스턴스를 가리키는 self 매개변수 외에 추가 매개변수를 가지며 이들은 객체가 생성될 때 전달됩니다.
s = PartyAnimal('Sally')
생성자에서 아래 줄은,
self.name = nam
nam에 전달된 매개변수를 객체 인스턴스 내부의 name 속성으로 복사합니다.
프로그램의 출력 결과를 보면, 각 객체(s 와 j)가 자신만의 고유한 x 및 name 값을 가지고 있음을 보여줍니다.
Sally constructed
Jim constructed
Sally party count 1
Jim party count 1
Sally party count 2