본문 바로가기
Python/왕초보를 위한 파이썬

7.5. 특별한 메서드들

by 가므자 2012. 4. 12.

이제 메서드에 대해서는 다들 알고 계시겠죠? 메서드라는 것은 우리가 클래스를 만들면서 그 안에 만들어 넣은 함수를 말하지요? 만들어진 메서드를 사용하려면 객체.메서드()와 같은 형식으로 호출을 해주었구요. 오늘은 그런 일반적인 메서드들과는 조금 다른 특별한 메서드들에 대해 함께 알아보려고 합니다.

__init__ 메서드 (초기화)

# bookstore.py

class Book:

    def setData(self, title, price, author):
        self.title = title
        self.price = price
        self.author = author

    def printData(self):
        print '제목 : ', self.title
        print '가격 : ', self.price
        print '저자 : ', self.author

    def __init__(self):
        print '책 객체를 새로 만들었어요~'

예제로 Book(책) 클래스를 갖는 bookstore(책방) 모듈을 만들어 보았습니다.

책 클래스의 메서드로는 책 제목, 가격, 저자와 같은 자료들을 입력할 때 사용할 setData()이런 자료들을 출력해주는 printData()를 만들어 주었지요.

*클래스 안에서의 함수 선언부분. 사용할 인수 이외에 self를 꼭 써줘야 한다. self를 사용해야한다는 게 새롭다...

그리고 __init__이라는 메서드도 있지요? 이것이 바로 파이썬에서 특별하게 약속된 메서드 가운데 하나로, 초기화(initialize) 메서드라고도 합니다.

어떤 클래스의 객체가 만들어질 때 자동으로 호출되어서 그 객체가 갖게 될 여러 가지 성질을 정해주는 일을 하지요. 그럼 책 클래스의 객체를 하나 만들어볼까요?

>>> import bookstore
>>> b = bookstore.Book()
책 객체를 새로 만들었어요~

Book()해서 Book 객체를 만들자마자 초기화 메서드가 실행되었군요. 나머지 setData와 printData 메서드들은 다음과 같이 사용하시면 됩니다.

>>> b.setData('누가 내 치즈를 먹었을까', '300원', '미키')
>>> b.printData()
제목 :  누가 내 치즈를 먹었을까
가격 :  300원
저자 :  미키

이제 초기화 메서드가 뭔지 대충 감을 잡으셨으면 __init__ 메서드를 사용해서 실제로 객체를 초기화 시켜보도록 하겠습니다. __init__ 메서드를 아래와 같이 수정해보세요.

    def __init__(self, title, price, author):
        self.setData(title, price, author)
        print '책 객체를 새로 만들었어요~'

객체를 생성시킬 때 제목, 가격, 저자를 인자로 받아서, setData 메서드에게 넘겨주도록 했죠? 물론 초기화 메서드에서 직접 변수를 다뤄도 상관없지만 setData 메서드를 미리 만들어뒀으니까 이용을 한 것입니다. 이제부터 책 객체를 만들 때는 다음과 같이 세 개의 인자를 넘겨줘야합니다.

>>> reload(bookstore)
>>> b2 = bookstore.Book('내가 먹었지롱', '200원', '미니')
책 객체를 새로 만들었어요~

그런대로 쓸 만 하죠? 값이 잘 들어갔는지도 확인해보세요. 참고로 말씀드리면, 초기화 메서드와 같은 것을 다른 객체지향 언어에서는 생성자(constructor)라고 부른답니다.

__del__ 메서드 (소멸자)

__init__ 메서드와 반대로 객체가 없어질 때 호출되는 메서드도 있습니다. 이런 것을 소멸자(destructor)라고 하는데, 파이썬에서는 __del__ 메서드가 소멸자의 역할을 맡고 있죠.

객체가 없어지는 수도 있냐구요? 뭐하려고 없애냐구요? del 문을 사용해보세요. 당장 없어집니다. 또, 만들어 둔 객체가 더 이상 필요 없어지면 파이썬이 알아서 처리해주기도 하구요.

그건 직접 __del__ 메서드를 만들어서 테스트해보시면 잘 아실 수 있겠죠? 그냥 다른 메서드와 똑같이 작성하시면 됩니다.

어떤 객체가 없어지기 전에 뭔가 처리를 필요로 한다면 소멸자가 유용하게 쓰이겠지요?

__repr__ 메서드 (프린팅)

이번엔 printData와 같은 메서드를 호출하는 대신, 파이썬의 기본문인 print 문을 사용해서 책 제목을 찍어보도록 하겠습니다. 이런 일을 가능하게 해주는 것은 바로 __repr__ 메서드이지요. 책 클래스에 아래와 같이 __repr__ 메서드를 추가해주세요.

    def __repr__(self):
        return self.title

별 다른 것은 없구요, return 문을 사용했다는 것만 눈여겨보시면 됩니다. __repr__ 메서드는 ‘문자열’을 ‘return’ 한다고 생각하시면 되겠죠? 그럼 책방 모듈을 재적재하고 새 책을 만들어서 테스트해보세요.

>>> b3 = bookstore.Book('나두 좀 줘', '100원', '쥐벼룩')
책 객체를 새로 만들었어요~
>>> print b3
나두 좀 줘

__add__ 메서드 (덧셈)

이제 책방은 문을 닫고 세모, 네모, 동그라미 같은 도형을 만들어볼까요?

# shape.py

class Shape:

area = 0 def __add__(self, other): return self.area + other.area

학교에서 도형에 대해 배울 때는 늘 넓이에 대해 생각을 하지요? 여기서는 두 도형의 넓이를 더하는 __add__ 메서드를 만들어보았습니다. 두 개의 객체 self와 other를 인자로 받아서 그 둘의 넓이를 더한 값을 돌려주는 일을 하도록 했지요.

>>> a = shape.Shape()
>>> a.area = 20
>>> b = shape.Shape()
>>> b.area = 10
>>> a + b
30

도형 a와 b를 덧셈 연산자(+)로 더했더니 두 도형의 넓이가 더해졌죠? 마치 보통의 두 숫자를 더하는 것처럼 간단하게 말입니다. 이와 같이 특별한 메서드를 사용해서 연산자가 하는 일을 정의하는 것을 연산자 중복(overload)이라고 부른답니다. 연산자 중복을 이용하면 사용자가 직접 만든 클래스의 객체에 대해서도 연산자를 쓸 수 있게 되지요. 마치 파이썬 자체에서 제공하는 자료형처럼 말입니다.

아직도 사태의 심각성을 이해하지 못하고 "a + b가 뭐 어쨌길래? 원래 그냥 더하면 되는 거잖아~"라고 하시는 분들! --
#Shape 클래스에 __add__ 메서드를 넣지 말고 객체 두 개를 만든 다음에 더해보세요.
지나가던 뱀이 웃습니당…--;

그리고 벌서 눈치채신 분도 있겠지만, 덧셈 연산자 대신 __add__ 메서드를 직접 호출해도 그 결과는 똑같답니다.

>>> a.__add__(b)
30

그럼 도형 객체 간에 뺄셈도 할 수 있도록 __sub__ 메서드도 만들어보세요~.

__cmp__ 메서드 (비교)

이제 연산자 중복에 대해서 어느 정도 감이 잡히시죠? 파이썬에서 제공하는 연산자 중복 메서드는 이외에도 많이 있기 때문에 모두 살펴보기는 힘들겠네요. 마지막으로 두 개의 객체를 비교하는 비교 연산자(<, >, ==)를 쓸 수 있도록 해주는 메서드를 살펴보면서 정리를 하도록 하겠습니다.
Shape 클래스에 아래와 같이 __cmp__ 메서드를 추가해주세요.

    def __cmp__(self, other):
        if self.area < other.area :
            return -1
        elif self.area == other.area :
            return 0
        else :
            return 1

두 객체 self와 other를 비교해서 self가 크면 1을, other가 크면 –1을 돌려주고, 두 수가 같을 땐 0을 돌려주도록 했습니다. 이제 두 숫자를 비교하듯이 두 객체를 그냥 비교하면 되겠죠? shape 모듈을 재적재하고 새로운 객체들을 만들어서 각각 area 값을 정해준 다음, 두 객체를 비교해보세요.

>>> if c > d: print 'c가 더 넓어요~'
...
c가 더 넓어요~

비교가 잘 되나요?

오늘 강좌는 좀 길어졌군요. 아까도 말씀드렸지만 연산자 중복 메서드는 오늘 보여드린 것 말고도 많이 있으니 다른 자료도 찾아보시기 바랍니다.

그럼…

I’ll be back… ^^

출처 : wikidocs 왕초보를 위한 파이썬

'Python > 왕초보를 위한 파이썬' 카테고리의 다른 글

09. GUI  (0) 2012.04.12
08. 예외처리  (0) 2012.04.12
Python 문자열  (0) 2012.04.10
Python 실습_Replace at Index  (0) 2012.04.10
Python 실습_After Index  (0) 2012.04.10

댓글