이제 메쏘드에 대해서는 다들 알고 계시겠죠?

메쏘드라는 것은 우리가 클래스를 만들면서 그 안에 만들어 넣은 함수를 말하지요?

만들어진 메쏘드를 사용하려면 객체.메쏘드()와 같은 형식으로 호출을 해주었구요.

 

오늘은 그런 일반적인 메쏘드들과는 조금 다른 특별한 메쏘드들에 대해 함께 알아보려고 합니다.

 

__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()를 만들어 주었지요.

그리고 __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… ^^

将把此主题..