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

7.4. 개체 속의 개체

by 가므자 2012. 4. 6.

코끼리를 냉장고에 넣는 방법을 아시나요? 아마 모르시는 분이 없겠죠? 제가 아는 유머는 온 국민이 다 알고 계시니까요.

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라고 써줘서 나타낸 것이지요.

다들 수고하셨습니다~

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

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

Python 실습_Capitalize Even Items  (0) 2012.04.10
Python 실습_Range Step  (0) 2012.04.10
7.3. 대물림  (0) 2012.04.06
7.2. 변수와 메서드(Method)  (0) 2012.04.06
7.1. 클래스와 인스턴스  (0) 2012.04.06

댓글