즐거운 휴일이에요~
오늘은 모처럼 학교에서 공부를 했답니다.
새로 산 노트북도 처음으로 갖고 나왔지요. 이럴 때 참 좋더군요. 흐흐흐…
요즘 게시판에 올려주시는 글들을 보고 제가 미처 몰랐던 부분을 많이 배우고 있답니다.
참 고맙기도 하고, 한편으로는 부족한 실력에 강좌를 쓴다는 것이 부끄럽기도 하네요.
앞으로도 많이 올려주세요. 아무리 쉬운 질문이나 간단한 예제라도 대환영입니다.
노트북을 쓰고 있으니 미션 임파서블의 주인공이 된 듯 하군요. 흠흠…
오늘은 객체 속에 객체를 집어넣는 임무를 수행하도록 하겠습니다.
코끼리를 냉장고에 넣는 방법을 아시나요?
아마 모르시는 분이 없겠죠? 제가 아는 유머는 온 국민이 다 알고 계시니까요.
1번, 냉장고 문을 연다.
2번, 코끼리를 넣는다.
3번, 냉장고 문을 닫는다. ^^;
이걸로 프로그램을 한번 짜볼까요?
|
# fridge.py class Fridge: isOpened = 0 foods = [] def open(self): self.isOpened = 1 print '냉장고 문을 열었어요...' def put(self, thing): if self.isOpened: self.foods.append(thing) print '냉장고 속에 음식이 들어갔네...' else: print '냉장고 문이 닫혀있어서 못넣겠어요...' def close(self): self.isOpened = 0 print '냉장고 문을 닫았어요...' class Food: pass |
위와 같이 냉장고와 음식 클래스를 갖고 있는 fridge.py 모듈을 만들어보았습니다.
냉장고 클래스에는 문이 열려있는지를 나타내는 isOpened라는 변수와 냉장고 안에 들어있는 음식들의 리스트인 foods가 있습니다.
또, 냉장고 문을 열고, 음식을 집어넣고, 문을 닫는 메쏘드도 각각 갖고 있지요.
음식에 대해서는 별로 쓸 말이 없더군요.
쓸 것이 없을 때는 pass라고만 써주면 된다고 해서 그렇게 했습니다.
속이 빈 음식 클래스를 만든 거지요.
이제 인터프리터를 띄워서 냉장고에다가 코끼리를 집어넣어 봅시다.
|
>>> import fridge >>> f = fridge.Fridge() >>> apple = fridge.Food() >>> elephant = fridge.Food() |
먼저 냉장고 클래스의 객체로 f라는 것을 만들고 음식 클래스의 객체는 apple과 elephant를 만들었습니다.
|
>>> f.open() 냉장고 문을 열었어요... >>> f.put(apple) 냉장고 속에 음식이 들어갔네... |
냉장고 문을 열고, 일단 준비운동으로 냉장고에 사과를 넣어봤는데 잘 들어갔지요?
그럼 코끼리도 넣어볼까요?
|
>>> f.put(elephant) 냉장고 속에 음식이 들어갔네... |
코끼리도 쏙 들어갔습니다~
냉장고 속에 사과랑 코끼리가 잘 들어갔는지 확인해볼까요?
냉장고 f의 foods 리스트에 뭐가 들어있는지 봅시다.
|
>>> f.foods [<fridge.Food instance at 007924AC>, <fridge.Food instance at 0079153C>] |
Food 클래스의 인스턴스(instance, 실체) 두 개가 들어있다고 나오는군요.
실체나 객체나 비슷한 말이겠죠?
자, 냉장고 객체는 foods라는 리스트를 갖고 있구요, foods 리스트는 음식 클래스의 사과와 코끼리 객체를 갖고 있습니다.
결국 냉장고 객체는 다른 객체들을 갖고 있다고도 할 수 있겠죠?
오늘 보신 것처럼 객체는 또 다른 객체를 포함할 수도 있답니다.
객체지향 프로그래밍에서는 이런 것을 composition(합성, 복합)이라고 하구요, “has-a” 관계라고도 합니다.
“f는 elephant를 갖고 있다(f has an elephant).” 말 되죠?
별로 어렵지는 않지만 잘 써먹을 수 있는 개념이니까 익혀두세요.
이렇게해서 오늘의 임무인 객체 속에 객체 집어넣기는 훌륭하게 완수했군요.
참고로 “has-a”관계를 나타낸 그림을 보여드리면서 마치도록 하겠습니다.
Fridge 클래스의 객체는 Food 클래스의 객체(elephant 등…)를 여러 개(*) 가질 수 있다는 것을 연결선 위아래에 *와 elephant라고 써줘서 나타낸 것이지요.

다들 수고하셨습니다~
