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