Media Log

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

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

저작자 표시 비영리 변경 금지
신고
  1. ZiNee at 2013.10.28 20:54 신고 [edit/del]

    먼저, 객체지향의 문법을 잘 설명해 주셔서 감사합니다. 조금씩 이해를 더하고 있습니다.
    그런데요, 궁금한 것이 있습니다.
    질문) IceCream 클래스의 생성자는 name, price 두 속성을 생성한 후에 초기화를 하잖아요.
    그런데, 소멸자에서는 self.name 객체가 소멸되었다고 나오는데요, 그럼, self.price 객체도 같이 소멸되는지요?
    name, price 는 객체인지요? 아니면, 속성(변수)인지요?

    Reply
    • BlogIcon EXYNOA at 2013.10.28 21:02 신고 [edit/del]

      저기서 아래와 같은 문장을 사용한건 객체를 구분하기 위해서 사용한 것입니다. 해당 객체가 사라지면 그 객체에 있는 변수 역시도 소멸이 되리라 생각합니다. 그리고 name과 price는 속성이라 할 수 있으며, 이 변수가 가리키는 것은 객체라고 할 수 있습니다.

    • ZiNee at 2013.10.29 01:47 신고 [edit/del]

      '객체가 사라지면 해당 객체에 있는 속성도 소멸됩니다.'라는 말씀중에 '객체'는 정확히 무엇인지 알고 싶습니다(객체라고 불리는 어떤 영어 글자는 무엇인지요?). IceCream 이 생성되고 소멸되는 객체인지요? 아님 무엇인지요?

    • BlogIcon EXYNOA at 2013.10.29 19:40 신고 [edit/del]

      예를 들어서 아래의 코드에서는 objectIc가 IceCream 클래스의 객체(Object)입니다.
      objectIc = IceCream("월드콘", 1000)

      더 궁금하신 점이 있으시면 네이트온으로 말씀해주세요.

    • ZiNee at 2013.10.30 13:46 신고 [edit/del]

      답변 감사합니다. 이제 궁금한 사항이 해결되었습니다.

  2. 와우우우 at 2014.04.10 16:50 신고 [edit/del]

    궁금한게 있습니다. 강좌 8-1에 있는 소스를 보면 생성자를 따로 쓰지 않았는데도 진행이 가능했는데
    이번 강좌처럼 항상 __init__으로 초기화 시켜줘야 하는겁니까?

    Reply
    • BlogIcon EXYNOA at 2014.04.12 13:46 신고 [edit/del]

      아닙니다. 굳이 생성자를 쓰지 않아도 객체를 생성할 수 있으며 생성자는 객체 생성시 초기화가 이루어지는 부분이라고 생각하셔도 됩니다. 생성자를 넣지 않으면 파이썬에서 따로 기본(default) 생성자를 제공합니다.

  3. 하아ㅏ아... at 2014.08.12 17:54 신고 [edit/del]

    __init__
    프로그래밍 왕초보 입니다..... 블로그보면서 정말 잘배우고 있습니다!!!감사합니다 ㅠㅠㅠ
    저 위에 꺼 언더바 두개인줄 모르고 하나로 쓰면서 하루종일 암것도 안돼서 맘고생 엄청했는데 ㅠㅠㅠ
    우여곡절 끝에 두개인거 알았네요ㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋ 다 이러면서 배우는거죠 뭐 ㅜㅜ 감사합니다!

    Reply
  4. 재밌네요파이썬 at 2014.11.14 02:16 신고 [edit/del]

    저 질문있습니다!! 그럼 프로그래밍하면서 사용하고난 변수또는 객체는
    그때그때 del메소드나 __del__을 이용해서 수시로 지워주는게 효율적인가요??
    아니면 그냥 그대로 두나요? c언어에서는 동적할당아니면 변수를 중간에 해제하지 않잖아요

    항상 명강의 잘보고있습니다!! 감사합니다~

    Reply
  5. 잘 배우고있습니다. at 2016.02.18 01:01 신고 [edit/del]

    저 질문이 있습니다
    예제를 따라 해보느라니 오유가 나왔습니다.
    파이선 3.4를 이용하고 있는데요.
    Student생성자의 aboutMe()함수에서 이름과 나이를 구분없이 print함수로 출력했는데,
    Can't Convert 'int' object to str implicitly.라는 에러메쎄지가 뜹니다.
    .... str라는 옹근수문자렬변환함수가 생각나 썼더니 잘 되네요...

    암툰 교재내용 잘 보고있습니다.

    복 받으시길~~

    Reply
  6. a.heat at 2016.09.18 23:24 신고 [edit/del]

    생성자를 만들때 이름은 다들 __init__로 사용하나요?? __init__가 자주 보이는것 같아서요 __init__가 보이면 생성자로 생각해도 되는건가요??

    Reply
  7. 테스트 at 2016.10.02 19:57 신고 [edit/del]

    프로그램이 커질때 소멸자를 호출하지않는경우
    메모리릭이 발생할수도있나요

    가비지컬렉터같은 처리는 없는건가요?

    Reply
  8. swyshy at 2017.01.22 15:16 신고 [edit/del]

    근데 왜 생산자일때는
    print(self.name ~~~~) 이런식으로 self. 이 붙고
    소멸자도 있을때는
    print(name~~~) 처럼 self. 이 안 붙나요? 둘다 클라스 내의 변수니가 self. 붙여야 하는거 아닌가요?

    Reply

submit

티스토리 툴바