Media Log

 

 

1. 인스턴스(Instance)

 

이번에는 객체지향 프로그래밍에서 핵심이 되는 요소 중 하나인 클래스(Class)에 대해서 알아보도록 하겠는데, 그 전에 인스턴스(Instance)란 개념에 대해 먼저 알아보도록 하겠습니다. 여기서 인스턴스와 객체(Object)는 같은 의미인데, 인스턴스는 클래스에 의해 만들어진 객체를 인스턴스라고 합니다. 이 설명에서 한가지 유추해보자면, 클래스는 인스턴스를 만드는 하나의 틀이라고 볼 수 있습니다. 우리가 앞으로 배울 클래스란 녀석을 통해서 인스턴스를 계속 만들어 낼 수 있습니다. 이제는 한번 클래스가 무엇인지 살펴보도록 합시다.

 

2. 클래스(Class)

 

앞에서 인스턴스에 대해서 간단히 알아보았는데, 파이썬에서의 클래스를 간단하게 설명하자면 변수와 함수를 모아넣은 것이라고 할 수 있습니다. 클래스가 어떠한 역할을 하는지 한가지 예를 들어볼까요? 우리가 쿠키를 만들때, 쿠키의 모양을 내기 위하여 모양틀을 이용하는 경우가 대부분입니다. 여기서 모양틀에 찍혀져서 만들어지는 어떤 모양의 쿠키를 인스턴스라 할 수 있으며, 모양틀을 클래스라 할 수 있습니다.

<그림 1-1. 다양한 모양의 틀>

정리하자면, 모양을 찍어낼 수 있는 틀을 가지고 서로 각각의 모양을 지닌 내용물을 만들어 낼 수 있는데 여기서 클래스는 그저 틀일 뿐이고, 인스턴스는 틀을 가지고 만들어진 내용물과 같은 것입니다. 우선은, 클래스의 이해를 돕기 위해 간단한 예제를 먼저 살펴보면서 클래스를 어떻게 선언하는지, 클래스란 어떤 것인지 알아보도록 하겠습니다.

>>> class Student:
	name = "김철수"
	def info(self):
		print("제 이름은 " + self.name + "입니다.")

>>> inst = Student()
>>> type(inst)
<class '__main__.Student'>
>>> inst.name
'김철수'
>>> inst.info()
제 이름은 김철수입니다.

위 예제를 보시면 1행~4행 까지는 Student라는 이름의 클래스를 선언하는것 이라고 보시면 됩니다. 클래스를 선언하는 방법은 위 예제를 통해 아래와 같은 형식을 따른다는 것을 알 수 있습니다.

class 클래스명:
	문장
	...

이어서 2행을 보시면 변수가 Student 클래스 내에 위치해있다는 것을 알 수 있습니다. 그리고 3~4행에서는 info라는 함수도 Student 클래스 안에 있다는 것 역시 보실 수 있습니다. 위에서 말했던대로, 클래스는 변수와 함수를 모아넣은 집합체라고 말할 수 있습니다. 6행에서는 인스턴스 객체를 만드는데 여기서 클래스의 이름을 호출하고 이를 변수에 집어넣음으로써 간단하게 인스턴스 객체를 만들 수 있습니다. 7행에서 type라는 내장 함수를 사용하여 변수 inst의 형식을 알아보는데, 8행의 결과를 통해 Student라는 클래스를 통해 생성된 인스턴스 객체임을 알 수 있습니다.

>>> inst.name
'김철수'
>>> inst.info()
제 이름은 김철수입니다.

위 코드에서의 1행은 인스턴스 객체인 inst의 name 변수를 가져오는 것이며, 3행은 info 함수를 호출하는 것이라고 볼 수 있습니다. 그런데, 코드를 자세히 훑어보니 이상한 점이 하나 보이지 않나요? Student 클래스 내의 info 함수의 인자를 보시면 첫번째로 self라는 녀석이 와있는 것을 확인하실 수 있습니다. 이 self라는 녀석이 어떤 기능을 하는 녀석인지 한번 보도록 할까요?

 

3. self

 

이 self는 현재의 인스턴스 객체를 가리키는 기능을 하는 녀석으로써, 쉽게 말하자면 self의 사전적 의미 그대로 자기 자신을 의미합니다. 이 self라는 지시어는 이름공간(namespace)와 물론 관련이 있지만, 우선은 간단하게만 알아두고 이름공간에 대해서는 나중에 자세히 다루도록 하겠습니다. 주의하실 점이 있다면, 클래스 내에서 함수가 정의될 경우에는 첫번째 매개변수로 self가 와야 합니다. 아래와 같이 말입니다.

>>> class Dog:
	def cry(self):
		print("왈왈!")

위와 같이 첫번째 매개변수에 self를 넣어주고, 여기서 class.method(instance)와 instance.method()이 같은데 이는 위의 예제에서 Dog.cry(instance)와 instance.cry()가 같다는 말입니다. 만약 self를 없애버린다면, 인스턴스 객체를 통해 cry 함수를 호출할 수 없을 것입니다. 또한 클래스 내부의 변수에 접근할때도 앞에 self.를 붙여주어야 합니다.

>>> class Dog:
	name = "멍멍이"
	def cry(self):
		print(self.name + ": 왈왈!")

만약 위 예제에서 self.를 제외한다면, "global name 'name' is not defined"와 같은 에러의 내용 그대로 전역 영역에서 name이란 변수를 찾게 됩니다. 즉, 전역 영역에 name이 정의되지 않았다는 겁니다. 왜 self를 붙여야 하는지에 대해서는 잠시 생각을 접어두고, 자신 내에 있는 변수나 함수의 첫번째 매개변수에 self가 들어가야 한다는 것을 꼭 기억해두도록 합시다.

저작자 표시 비영리 변경 금지
신고
  1. ehoto at 2013.10.23 22:06 신고 [edit/del]

    제가 프로그래밍 문외한이라 클래스 개념이 잘 안 들어왔는데 첫 문단에서 바로 해결을 하고 들어가시는군요!
    클래스 강의에 더 추가될 내용이 기다려집니다~!

    Reply
  2. ZiNee at 2013.10.26 10:45 신고 [edit/del]

    명강의 잘 읽었습니다. 이제 객체지향에 대해서 조금씩 알아가는 기분입니다. 감사합니다.

    Reply
  3. 씹오지네요 at 2014.02.27 23:18 신고 [edit/del]

    왜이렇케 강의 잘하세요

    Reply
  4. 고맙습니다 at 2014.03.05 16:08 신고 [edit/del]

    >>> instance = Student() <--------요기서 많이 놀랐습니다.
    instance <-----이렇게 써야만 인스턴스가 되는줄알고요.
    혹시나해서
    >>> a = Student() <-------이렇게 써도 되길래 쥔장님의 뜻을 알았습니다.

    고맙습니다 ^^

    Reply
    • BlogIcon EXYNOA at 2014.03.05 20:11 신고 [edit/del]

      죄송합니다.. 예제를 들었던게 오해를 살 수 있을만한 예제여서 괜히 혼란을 끼쳐드려 시간만 뺏은것 같습니다. 우선은 강좌 내용을 살짝 수정했습니다. 감사합니다 ^ㅡ^*

  5. 루팡 at 2014.05.22 16:11 신고 [edit/del]

    3.Self 부분이 너무 어렵네요 ㅠㅠ

    Reply
  6. 이제시작 at 2014.06.02 14:15 신고 [edit/del]

    파이썬 공부중인데.. 책보다는 EXYNOA님의 강좌로 기초 잡아가는 중입니다 ^^
    근데 self 부분이 저도 어렵긴 하네요..

    클래스내의 선언된 함수(cry())에서 동일한 클래스내의 변수(name)에 접근하려면 self 를 붙이라는 것 같은데-
    위의 강의 문구 중에 "함수의 첫번째 매개변수에 self가 들어가야 한다"는 게 이해가 좀 안되네요 ㅠ 그럼 두번째 매개변수엔 안들어가도 되는건가요..?;;

    Reply
    • BlogIcon EXYNOA at 2014.06.03 15:16 신고 [edit/del]

      네, 말 그대로 받아들이시면 됩니다. 첫번째 매개변수에는 self가 오고, 두번째 매개변수 부터는 이미 첫번째 매개변수에 self가 있으니 쓰지 않으셔도 됩니다.

  7. BlogIcon 867 at 2014.07.28 00:08 신고 [edit/del]

    그냥 쭉쭉 넘어가네요ㅋㅋ 님 천재임ㅋ

    Reply
  8. Dk at 2014.08.07 10:58 신고 [edit/del]

    너무 감사합니다. 책 보다가 막히는게 술술풀리네요.

    Reply
  9. at 2015.01.27 19:37 [edit/del]

    비밀댓글입니다

    Reply
  10. 이해굿 at 2015.01.27 19:39 신고 [edit/del]

    아 실수로 비밀댓글 체크해서 다시올려요 ㅠㅠ 죄송합니다 진짜 궁금하거든요..
    >>> class 물건:
    def __init__(self,name,price):
    self.name = name
    self.price = price
    def info(self):
    print("이 물건의 정보\n이름:", name, "\n가격:", price, "\n입니다.")
    이렇게 클래스 정의해놓고
    한번 쳐보면
    >>> coffee = 물건("커피",1500)
    >>> coffee.name
    '커피'
    >>> coffee.price
    1500
    >>> coffee.info
    <bound method 물건.info of <__main__.물건 object at 0x01706C30>>
    info만 오류가 납니다..뭐 어떻게해야하죠?ㅠㅠ

    Reply
    • 데자와 at 2015.02.02 12:23 신고 [edit/del]

      coffee.info뒤에 ()를 붙이셔야 합니다. info는 정의된 클래스의 함수니까요. ()안에 매개변수를 주지 않아도 되는건 매개변수가 self로 정의되어있기때문에 그냥 coffee.info()를 써주면 됩니다

submit

티스토리 툴바