끝나지 않는 프로그래밍 일기

1. 생성자(Constructor)

 

이번에는 생성자와 소멸자에 대해서 알아보도록 하겠습니다. 우선은 생성자부터 알아보고, 그 다음 소멸자에 대해 알아보는 순서로 공부를 할 생각입니다.

 

클래스라는 개념을 처음 접해보신 분들은 생성자라는 이름이 생소하시겠지만, 이름과 연관지어 생각을 해봅시다. 생성자라고 하면 '무언가 생성할 때 호출되는 녀석', '무언가 생성하기 위해 호출되는 녀석' 등 여러가지 추측을 해볼 수 있습니다. 파이썬의 생성자는 객체를 생성할 때 호출되는 함수로써, 객체 생성 시 초기화 작업을 위해 존재하는 녀석입니다. 생성자라는 녀석이 파이썬에서는 어떻게 표현이 되는지 확인해보도록 합시다.

class 클래스명:
	...
	def __init__(self):
		문장
		...

위를 보시면 파이썬에는 생성자가 __init__라는 이름으로 미리 정의되어 있습니다. 이 생성자를 통해서 객체가 생성될 때 어떤 변수의 값을 세팅하는 등 여러가지 작업을 할 수 있습니다. 우선은 생성자를 통해 값을 초기화하는 예제를 보면서 이해를 해보도록 합시다.

>>> class Book:
	def __init__(self, bookName):
		self.name = bookName
		print("객체가 생성되었습니다. 책의 이름은 " + bookName + "입니다.")

>>> objectBook = Book("열혈 C++ 프로그래밍")
객체가 생성되었습니다. 책의 이름은 열혈 C++ 프로그래밍입니다.

위 예제에서는 Book이란 이름을 가진 클래스가 정의되어 있습니다. 이 Book 클래스의 안을 보시면 생성자가 정의되어 있으며, bookName이란 인자를 받습니다. 넘겨준 bookName을 가지고 클래스 내부의 name이란 변수의 값을 초기화 시키며, 객체가 생성되었음을 알리고 넘겨준 책의 이름을 출력합니다. 한가지 예를 더 보도록 할까요?

>>> class Student:
	def __init__(self, name, age):
		self.name = name
		self.age = age
	def aboutMe(self):
		print("제 이름은 " + self.name + "이며, 제 나이는 " + str(self.age) + "살입니다.")
	
>>> objectStudent = Student("김철수", 18)
>>> objectStudent.aboutMe()
제 이름은 김철수이며, 제 나이는 18살입니다.

위 예제에서는 Student이란 이름을 가진 클래스가 정의되어 있으며, 이 클래스 안에는 생성자와 자기를 소개하는 aboutMe이라는 함수가 정의되어 있습니다. 생성자에서는 name과 age를 인자로 받으며, 넘겨받은 인자를 가지고 self.name과 self.age의 값을 초기화 시킵니다. aboutMe 함수에서는 self.name와 self.age의 값을 가지고 이름과 나이를 출력하고 있습니다. 간단하죠? 반면에 이렇게 객체가 생성될 때 호출되는 함수랑은 반대로 객체가 소멸할때 호출되는 함수도 존재합니다. 한번 소멸자에 대해서 알아보도록 할까요?

 

2. 소멸자(Destructor)

 

객체가 생성될 때 호출되는 생성자가 있다면, 반대로 객체가 소멸할 때 호출되는 소멸자라는 녀석이 존재합니다. 생성자와 마찬가지로 파이썬에서는 소멸자라는 녀석이 __del__라는 이름으로 미리 정의가 되어 있습니다. 이 소멸자는 리소스 해제 등의 종료 작업을 하기 위해 사용됩니다. 우선은 소멸자가 파이썬에서 어떻게 표현이 되는지 한번 보도록 합시다.

class 클래스명:
	...
	def __del__(self):
		문장
		...

이번에는 바로 생성자와 소멸자를 함께 사용해 보도록 합시다. 생성자를 통해 값을 초기화하고 객체가 생성되었음을 알리며, 소멸자를 통해 객체가 소멸되었음을 알리는 문구를 출력해보도록 합시다.

>>> class IceCream:
	def __init__(self, name, price):
		self.name = name
		self.price = price
		print(self.name + "의 가격은 " + str(price) + "원 입니다.")
	def __del__(self):
		print(self.name + " 객체가 소멸합니다.")
	
>>> objectIc = IceCream("월드콘", 1000)
월드콘의 가격은 1000원 입니다.
>>> del objectIc
월드콘 객체가 소멸합니다.

위 예제를 보시면 IceCream이라는 클래스가 정의되어 있으며, 이 안에는 생성자와 소멸자가 존재합니다. 먼저 생성자는 이름을 의미하는 name과, 값을 의미하는 price라는 인자 두개를 받습니다. 넘겨받은 두 인자를 가지고 self.name과 self.price의 값을 초기화 시킵니다. 그리고 소멸자에서는 객체가 소멸되었다는 문구를 출력합니다. 실제로, 객체가 소멸되면 'xxx 객체가 소멸합니다'라는 문구가 출력됨을 확인하실 수 있습니다. 참고로, 생성자나 소멸자와 같이 앞뒤에 '__'가 붙은 경우에는 특별한 용도로 사용하기 위해 미리 정의하여 둔 것이라고 생각하시면 됩니다.