01 .협력하는 객체들의 공동체
흔히들 객체지향 프로그래밍을 이야기 할 때 현실 세계를 모방하여 만들어지는 것이 객체지향 프로그래밍의 방향성이라고 이야기 한다. 이러한 이야기가 사실은 아니지만 중대한 영향을 미치는 것은 사실이다. 여기서 우리의 현실을 예제로 살펴보자.
책에서는 카페의 상황을 예시로 들며 설명한다. 우리가 카페에 방문한 상황을 예시로 생각을 해보자. 우리는 카페에 커피를 마신다는 목적을 이루기 위해서 카페에 방문한다. 또한 카페를 운영하는 운영자는 커피를 판매하여 수익을 창출하기 위한 목적을 지니고 있다. 카페를 방문하는 우리 손님과 카페를 운영하는 직원은 서로의 목적을 이루기 위해서 서로 협력을 하게 된다. 여기서 어떠한 협력이 이루어지는지 살펴보자.
- 카페에 방문한 손님은 커피를 주문하기 위해 바리스타에게 메뉴를 보여줄 것을 요청한다.
- 바리스타는 요청에 따라 손님에게 가게의 메뉴를 보여준다.
- 손님은 바리스타에게 선택한 메뉴를 주문한다.
- 바리스타는 해당 메뉴에 대한 금액을 결제하기 위해 카드를 요청한다.
- 손님은 요청에 따라 카드를 바리스타에게 건네준다.
- 바리스타는 손님이 요청한 메뉴를 제조한다.
- 메뉴의 제조가 끝난 바리스타는 손님에게 커피가 나왔음을 알려준다.
- 손님은 커피를 받고 가게를 떠난다.
위의 예시는 중요한 특징들을 포함하고 있다. 우선 손님과 바리스타는 각자의 역할과 책임이 있다. 손님은 손님으로서의 역할과 자신이 주문한 메뉴를 갖고 나가야할 책임이 있고 바리스타는 바리스타로써의 역할과 이로 인해 손님이 주문한 메뉴를 완성하여 건네줘야 할 책임을 지닌다. 하지만 이러한 역할과 책임은 행동을 요청과 응답을 필수조건으로 한다.
위의 예제를 보자 손님이 바리스타에게 메뉴를 요청하지 않는 이상 바리스타는 커피를 제조할 수 없다. 또한 손님은 메뉴를 요청하고 이에 대한 응답으로 결제하기 위해 카드를 건네달라는 요청을 응답하지 않으면 커피를 먹을 수 없다. 이렇듯 서로가 협력을 통해 목적을 이루기 위해서는 요청과 응답이 반드시 필요하다.
이외에도 살펴볼 수 있는 몇 가지 특징이 있다. 객체지향에 있어서 중요하게 여겨지는 캡슐화에 대해서도 위의 예제를 통하여 살펴볼 수 있다. 우리가 바리스타에게 커피를 요청한 이후에 우리는 바리스타가 어떠한 방법으로 커피를 내리고 어떠한 방법으로 원두를 가는지에 대한 것은 간섭하지 못하고 알 수도 없습니다. 이러한 것이 캡슐화의 중요한 부분입니다. 우리는 바리스타에게 우리가 요청한 응답을 처리하는 방법에 대해서는 자율성을 부여하고 이에 대해 간섭하지 않는다는 것이 중요한 부분입니다.
- 여러 사람이 동일한 역할을 수행할 수 있다.
- 역할은 대체 가능성을 의미한다.
- 책임을 수행하는 방법은 자율적으로 선택할 수 있다.
- 한 사람이 동시에 여러 역할을 수행할 수 있다.
02. 이상한 나라의 객체
이 챕터에서는 이상한 나라의 엘리스를 예시로 객체에 대해서 설명하고 있다. 그 중 엘리스가 작아지는 물약을 마시고 바닥의 작아진 문을 통과하려 할 때를 예시로 이야기를 해보자.
우선 이야기 할 것은 엘리스와 물약은 서로 다른 두 객체라는 것이다. 이 두 객체에 대해서 설명을 해보자. 우선 물약은 마시면 키가 작아지는 능력 갖고 있고 대략으로 절반 50ml정도 남아 있다. 현재 엘리스의 키는 160cm라고 인데 엘리스가 바닥의 문을 통과하기 위해서는 130cm까지 줄어들어야 한다. 여기서 알 수 있는 것은 무엇이 있을까? 객체는 상태를 지닌다는 것이다. 엘리스의 현재 상태는 160cm 라는 것, 물약은 절반 정도인 50ml만 남아 있다는 상태를 지닌다는 것이다.
상태는 객체를 구별할 수 있는 식별자로도 사용이 된다. 값과 상태는 서로 다른 것을 의미한다. 숫자, 문자열, 남아 있는 물약의 양, 속도, 시간, 날씨, 참/ 거짓과 같은 단순한 값들을 통해 객체의 상태를 표현하고 이러한 값들을 통틀어 프로퍼티(property) 라고 하고 이러한 프로퍼티를 구성하는 값을 속성(attribute) 라고 한다. 또한 위의 예제처럼 서로의 상태가 영향을 미치는 상태는 링크(link) 되었다고 하는데 이는 객체와 객체 사이의 의미 있는 연결이 있는 상태이고 이러한 상태에 있는 객체들은 서로 협력이 가능하다.
- 객체의 상태는 객체에 존재하는 정적인 프로퍼티와 동적인 프로퍼티 값으로 구성이 된다.
- 객체의 프로퍼티는 단순한 값과 다른 객체를 참조하는 링크로 구분할 수 있다.
여기서 주의해야할 점 서로 다른 두 객체 간의 상태만으로는 두 객체가 서로 동일한지 판단할 수 없다. 객체는 유동적인 존재이기 때문에 시간이 흐를 수록 상태가 변화된다. 어느 한 시점에서 객체의 상태가 동일 할 수 있지만 두 객체는 서로 다른 객체이고 시간이 흐름에 따라 차이점을 드러내기 때문이다. 그렇기 때문에 객체는 서로 다른 식별자가 존재하고 이러한 식별자를 지칭하는 용어로 참조 객체(reference object), 또는 엔티티(entity) 라고 지칭한다.
상태를 가진다는 객체의 상태는 다음의 행동에도 영향을 미친다. 객체의 상태가 행동에 영향을 미친다는 것이 무슨 소리일까? 위의 예제 처럼 엘리스의 키와 남은 물약의 양이 상태로써 존재한다. 이때 엘리스는 문을 통과해야 한다는 목적을 지니고 있는데 이 목적을 다루기 위한 문의 크기 이하로 엘리스가 작아져야 한다. 또한 물약의 경우 엘리스가 문을 통과할 수 있을 만큼의 양이 남아 있어야 한다. 이러한 상태를 바탕으로 각각의 요청이 이루어진다. 현재 엘리스의 몸이 문보다 크기 때문에 물약을 마셔야 한다는 요청을 물약에게 전달하고 물약은 전달 받은 요청에 대해 응답하여 물약을 소비한다. 이러한 요청은 객체의 상태를 기반으로 이루어지고 객체가 요청에 응답하기 위한 행동이 이루어지는 것이다.
지금까지의 내용을 한 번 정리해보자.
- 상태는 특정 시점에 객체가 가지고 있는 정보의 집합으로 객체의 구조적 특성을 표현한다.
- 객체의 행동은 상태에 영향을 받는다.
- 객체의 행동은 상태를 변경시킨다.
- 행동이란 외부의 요청 또는 수신된 메시지에 응답하기 위해 동작하고 반응하는 활동이다.
- 객체는 상태를 변경하기 위해 다른 객체에게 메시지를 전달할 수 있고 이를 통해 서로 다른 객체간에 협력에 참여가 가능하다.