[펌]파이썬 강좌 8-1편. 클래스(Class)

파이썬 강좌 8-1편. 클래스(Class)

1. 인스턴스(Instance)

 

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

 

2. 클래스(Class)

 

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

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

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

1
2
3
4
5
6
7
8
9
10
11
12
>>> class Student:
    name = "김철수"
    def info(self):
        print("제 이름은 " + self.name + "입니다.")
 
>>> inst = Student()
>>> type(inst)
<class '__main__.Student'>
>>> inst.name
'김철수'
>>> inst.info()
제 이름은 김철수입니다.

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

1
2
3
class 클래스명:
    문장
    ...

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

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

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

 

3. self

 

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

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

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

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

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


출처 : http://blog.eairship.kr