객체 지향의 사실과 오해 - 객체, 그리고 소프트웨어 나라
객체 지향의 사실과 오해를 읽고 정리한 글
섹션 - 02. 이상한 나라의 객체
내용
하나의 개별적인 실체로 식별 가능한 물리적인 또는 개념적인 사물은 어떤 것이라도 객체가 될 수 있다. 그리고 그 객체를 상태, 행동, 식별자를 지를 통해 구분하면 객체들 간의 협력 관계를 유연하고 간결하게 정의할 수 있다.
상태
객체가 주변 환경과의 상호작용에 어떻게 반응하는가는 그 시점까지 객체에 어떤 일이 발생했느냐에 좌우된다. 상태를 이용하면 과거에 얽매이지 않고 현재를 기반으로 객체의 행동 방식을 이해할 수 있다. 상태는 근본적으로 세상의 복잡성을 완화하고 인지 과부하를 줄일 수 있는 중요한 개념이다.
상태와 프로퍼티
모든 객체의 상태는 단순한 값과 객체의 조합으로 표현할 수 있고, 객체의 상태를 구성하는 모든 특징을 통틀어 객체의 프로퍼티라고 한다. 일반적으로 프로퍼티는 정적이지만, 프로퍼티에 저장되는 값은 동적이다.
다른 객체가 특정 개체의 상태를 표현할 때
- 객체와 객체 사이의 의미 있는 연결을 링크(link)라고 한다. 링크가 존재해야만 객체 간의 요청을 보내고 받을 수 있다. 링크가 존재하지 않으면 객체 간의 요청을 할 수 없다.
객체 상태를 단순한 값으로 표현할 때
- 객체를 구성하는 값이 단순한 값이라면 그 값을 속성이라 한다.
💡 상태는 특정 시점에 객체가 가지고 있는 정보의 집합으로 객체의 구조적 특징을 표현한다. 객체의 상태는 객체에 존재하는 정적인 프로퍼티와 동적인 프로퍼티 값으로 구성된다. 객체의 프로퍼티는 단순한 값인 속성과 객체를 참조하는 링크로 구분이 된다.
상태로는 객체간 상호작용에 따른 값을 변경할 수 없다.
여기서 제일 중요한 것은 객체는 다른 객체의 상태에 직접적으로 접근할 수도, 상태를 변경할 수도 없다. 자율적인 객체는 자신의 상태를 책임져야 한다. 그래서 외부의 객체가 간접적으로 특정 객체의 상태를 변경하기 위해서는 행동이 필요하다.
행동
행동이란 외부의 요청 또는 수신된 메시지에 응답하기 위해 동작하고 반응하는 활동이다.
상태와 행동
객체의 상태를 변경하는 것은 자발적인 행동뿐이다. 객체의 행동은 객체 자신의 상태를 변경시킨다. 객체의 행동에 의해 객체의 상태가 변경되는다는 것은 부수 효과(side effect)를 초래한다는 것이다.
객체의 행동은 객체의 상태를 변경시키지만 행동의 결과는 객체의 상태에 의존적이다. 상태라는 개념을 이용하면 행동을 두 가지 관점에서 서술할 수 있다.
- 상호작용이 현재의 상태에 어떤 방식으로 의존하는가(객체의 행동은 상태에 영향을 받는다.)
- 상호작용이 어떻게 현재의 상태를 변경시키는가(객체의 행동은 상태를 변경시킨다.)
협력과 행동
객체가 다른 객체와 협력하는 유일한 방법은 다른 객체에게 요청을 보내는 것이다. 요청을 수신한 객체는 요청을 받아들일지 받아들이지 않을지는 수신한 객체가 직접 판단한다.
객체의 행동으로 인해 발생하는 결과는 두 가지 관점에서 설명할 수 있고, 이 두 가지 관점의 부수효과를 이용해 객체의 행동을 서술할 수 있어야 한다.
- 객체 자신의 상태 변경
- 행동 내에서 협력하는 다른 객체에 대한 메시지 전송
💡 행동이란 외부의 요청 또는 수신된 메시지에 응답하기 위해 동작하고 반응하는 활동이다. 행동의 결과로 객체는 자신의 상태를 변경하거나, 다른 객체에게 메시지를 전달할 수 있다. 객체는 행동을 통해 다른 객체와의 협력에 참여하므로 행동은 외부에 가시적이어야 한다.
상태 캡슐화
객체지향에서 모든 객체는 자신의 상태를 스스로 관리하는 자율적인 존재이고, 메시지를 송신한 객체는 메시지를 수신하는 객체의 상태가 변경되는지 전혀 모른다. 객체의 행동을 유발하는 것은 외부에서 전달된 메시지이지만, 객체의 상태를 변경할지 여부는 객체 스스로 결정하고, 메시지를 전달하는 객체는 메시지를 수신하는 객체의 상태가 변경되었는지 모른다. 메시지 송신자는 메시지를 전달할 뿐 변경 여부는 메시지 수신 객체의 자율적인 판단이다.
상태는 외부로 노출하지 않기, 외부에 노출되는 것은 행동 뿐
객체는 상태를 캡슐 안에 감춰둔 채 외부로 노출하지 않는다. 객체가 외부에 노출하는 것은 행동뿐이며, 외부에서 객체에 접근할 수 있는 방법 역시 행동뿐이다.
상태를 캡슐화해야 하는 이유
상태를 외부에 노출시키지 않고 행동을 경계로 캡슐화하는 것은 결과적으로 객체의 자율성을 높인다. 자율적인 객체는 스스로 판단하고 스스로 결정하기 때문에 객체의 자율성이 높아질수록 지능도 높아지고 지능이 높아질수록 협력은 유연하고 간결해진다. 이것이 상태를 캡슐화하는 이유이다.
식별자
객체 안의 프로퍼티를 식별자라고 하며, 모든 객체는 식별자를 가지며 식별자를 이용해 객체를 구별할 수 있다. 객체가 가지는 프로퍼티 타입은 객체나 값 중 하나가 될 수 있는데 가장 큰 차이점은 값은 식별자를 가지지 않지만, 객체는 식별자를 가진다.
상태 안 값을 이용한 비교
값은 변하지 않기 때문에 값의 상태는 불변 상태(immutable state)를 가진다.
상태 안 값이 같으면 두 인스턴스는 동일한 것으로 판단할 수 있고, 값을 이용해 같은지 같지 않은지 판단할 수 있는 성질을 동등성(equality)이라 한다.
식별자를 이용한 비교
객체는 행동을 통해 상태가 변경된다. 따라서 객체는 가변 상태(mutable state)를 가진다.
객체의 상태가 다르더라도 식별자가 같다면 두 객체를 같은 객체로 판단할 수 있고, 식별자를 기반으로 객체가 같은지 판단할 수 있는 성질을 동일성(identical)이라 한다.
프로그래밍에서
객체는 참조 객체(reference object) 또는 엔티티(entity)라고 불리고, 값은 값 객체(value object)라는 용어를 가진다.
정리
- 모든 객체는 상태를 가지며 상태는 변경 가능하다. 객체의 상태를 변경시키는 것은 객체의 행동이다. 객체는 어떤 생태에 있더라도 유일하게 식별 가능하다.
- 상태는 행동의 과정과 결과를 단순하게 표현하기 위해 고안되었다. 객체의 상태를 구성하는 모든 특징의 집합을 프로퍼티라고 한다. 프로퍼티는 정적이지만, 프로퍼티 안의 값은 외부로 인한 메시지로 인해 변할 수 도 있는 동적인 값을 가진다. 그리고 객체의 상태만을 이용해 협력할 수 없기 때문에 행동을 이용해 협력해야 한다.
- 행동이란 외부의 요청 또는 수신된 메시지에 응답하기 위해 동작하고 반응하는 활동이다. 행동의 결과로 객체는 자신의 상태를 변경하거나, 다른 객체에게 메시지를 전달할 수 있다. 상태를 캡슐화해 외부에 노출시키지 않고 행동으로만 객체들 간의 협력을 하면 각 객체들 간 자율성이 높아지고 협력이 유연해지고 간결해진다.
- 식별자란 객체 안의 프로퍼티를 말하고 행동을 통해 상태가 변경된다. 객체는 식별자를 통해 식별할 수 있고, 동일성을 가진다.