객체를 정의할 때 상태가 아닌 행동에 집중해라
객체는 하나의 개별적인 실체로 식별 가능한 물리적이고 개념적인 실체라면 객체가 될 수 있다. 객체를 효과적으로 설명하기 위해 상태(status), 행위(behavior), 식별자(identity)를 가진 실체로 본다.
상태
상태가 등장한 이유는 다음과 같다.
현재 행위의 결과를 설명하기 위해서는 과거에 발생한 행동의 이력을 알아야 한다. 모든 행동의 이력을 기록할 수는 없으니 상태를 이용한다.
객체의 상태는 단순한 값과 객체의 조합으로 표현된다. 객체의 상태를 구성하는 모든 특징을 통틀어 객체의 프로퍼티(property)라고 한다. 프로퍼티는 변경되지 않고 고정되기 때문에 '정적'이다. 반면 프로퍼티 값(property value)는 시간에 흐름에 따라 변경되기 때문에 '동적'이다.
객체와 객체는 메시지를 주고 받기 위해 링크(link)가 필요하다. 링크는 객체가 다른 객체를 참조할 수 있다는 것을 의미한다. 참조가능하다는 것은 한 객체가 다른 객체의 식별자를 알고 있다는 뜻이다.
객체를 제외한 프로퍼티인 단순한 값은 속성(attribute)라고 한다.
객체는 독립적이고 자율적인 존재이다. 객체는 다른 객체의 상태를 직접 접근할 수도 없고, 상태를 변경할 수도 없다.(독립) 객체는 스스로의 상태를 책임져야 한다.(자율)
외부의 객체가 객체를 간접적으로 접근하고 변경하는 방법이 필요한데 바로 '행위'이다.
행위
객체의 상태를 변경하는 것은 객체의 행위이다.
상태와 행위는 두 가지 관계를 갖는다.
- 객체의 행동은 상태에 영향을 받는다.
- 객체의 행동은 상태를 변경시킨다.
객체가 다른 객체와 협력하기 위한 유일한 방법은 다른 객체에 요청을 보내는 것이다. 요청을 받은 객체는 적절한 방법에 따라 행동한다.
행위이란 외부의 요청 또는 수신된 메시지에 응답하기 위해 동작하고 반응하는 활동이다. 행동의 결과로 객체는 자신의 상태를 변경하거나 다른 객체에 메시지를 전달한다. 객체는 행동을 통해 외부 객체와 협력하므로 행동(행위)는 가시적이어야 한다.
객체가 외부로 드러내는 것은 행동(행위) 뿐이며 상태는 외부로 노출하지 않는다. 이것은 상태를 캡슐 안에 감춰둔 채 외부로 노출하지 않는 의미로 캡슐화라고 한다. 캡슐화를 하는 이유는 요청을 보낸 객체에 의해서 행동이 발생하지만 외부 객체는 내부의 상태가 변경 여부 및 방법을 모른다는 것이다. 결과적으로 객체의 자율성을 높이고 협력을 단순하고 유연하게 만든다.
식별자
객체를 식별가능하다는 것은 객체를 서로 구별할 수 있는 특정한 프로퍼티가 객체 안에 존재한다는 것을 의미하며 이를 식별자로 한다.
반대로 단순한 값은 식별자를 가지지 않는다. 값의 상태는 불변 상태(immutable state)을 가지며 두 인스턴스의 상태가 같다면 두 인스턴스는 동일하다고 본다. 상태를 이용해 두 값이 같은지 판단할 수 있는 성질을 동등성(equality)라고 한다.
객체는 시간에 따라 상태를 변화하기 때문에 가변 상태(mutable state)를 갖는다. 상태가 변화하기 때문에 상태를 가지고 두 인스턴스가 동일하다고 판단할 수 없다. 객체는 식별자를 기반으로 객체가 같은지를 여부를 판단하며 그 성질을 동일성(identical)이라 한다.
특정 프로그래밍 언어에서는 값과 객체 모두 클래스로 구현되기 때문에 구분하기 위해서 별도의 용어를 사용한다. 객체를 참조 객체(reference object) 또는 엔티티(entity) 라고 한다. 값 객체(value object)는 식별자를 가지지 않은 값을 가리킨다.
행동이 상태를 결정한다
객체를 정의할 때는 상태가 아닌 행동(행위)에 집중해야 한다.
객체가 필요한 이유는 어플리케이션 기능을 위한 객체들의 협력 때문이다. 객체들의 협력을 하는 유일한 방법이 아닌 행동을 먼저 정의해야 객체가 외딴섬이 되지 않고 외부로 공개되지 말아야 할 정보를 노출하지 않으며(캡슐화) 객체의 재사용성이 높아진다.
은유와 객체
객체지향 세계는 현실 세계를 추상화하거나 모방하는 것이 아니다. 현실 속의 객체와 소프트웨어 객체 사이의 가장 큰 차이점은 현실 속에서 수동적인 존재가 소프트웨어 세계에서는 능동적인 존재가 된다는 것이다. 현실 세계와 소프트웨어 세계의 관계를 명확하게 설명할 수 있는 단어는 은유이다. 은유는 실제로 적용되지 않는 한 가지 개념을 이용해 다른 개념을 서술하는 대화의 한 형식이다. 현실 세계와 소프트웨어 세계의 사람이 이해할 수 있는 차이를 줄이기 위해서는 현실 세계의 객체 이름을 소프트웨어 세계의 객체의 이름으로 그대로 사용하여 이해하기 쉽고 유지보수하기 좋은 소프트웨어를 만들 수 있다.
참조
객체지향의 사실과 오해(위키북스) - 조영호
'cs > 객체지향' 카테고리의 다른 글
| 디자인 패턴 (0) | 2025.07.18 |
|---|---|
| 객체지향에서의 역할, 책임, 협력 (2) | 2025.03.17 |