조각들

 

내용

41pg, 객체란 인간이 분명하게 인지하고 구별할 수 있는 물리적인 또는 개념적인 경계를 지닌 어떤 것이다.

 

48pg, 상태를 이용하면 과거의 모든 행동 이력을 설명하지 않고도 행동의 결과를 쉽게 예측하고 설명할 수 있다.

 

50pg,

결론적으로 모든 객체의 상태는 단순한 값과 객체의 조합으로 표현할 수 있다. 이때 객체의 상태를 구성하는 모든 특징을 통틀어 객체의 프로퍼티(property)라고 한다. 앨리스의 경우 키, 위치, 음료가 앨리스의 프로퍼티가 된다.

 

51pg,

객체와 객체 사이의 의미있는 연결을 링크(link)라고 한다. 객체와 객체 사이에는 링크가 존재해야만 요청을 보내고 받을 수 있다. 즉, 객체의 링크를 통해서만 메세지를 주고받을 수 있다.

 

링크는 객체가 다른 객체를 참조할 수 있다는 것을 의미하며, 이것은 일반적으로 한 객체가 다른 객체의 식별자를 알고 있는 것으로 표현된다.

 

객체 간의 선으로 표현되는 링크와 달리 객체를 구성하는 단순한 값은 속성(attribute)이라고 한다. 

객체의 프로퍼티는 속성과 링크라는 두 가지 종류의 조합으로 표현할 수 있다.

 

52pg,

객체지향의 기본 사상은 상태와 상태를 조작하기 위한 행동을 하나의 단위로 묶는 것이라는 점을 기억하라.

객체의 상태를 변경하는 것은 객체의 자발적인 행동뿐이다.

객체는 스스로의 행동에 의해서만 상태가 변경되는 것을 보장함으로써 객체의 자율성을 유지한다.

 

53pg,

객체의 행동은 상태에 영향을 받는다. -> 앨리스의 키가 40cm 이하라면 문을 통과할 수 있다.

객체의 행동은 상태를 변경시킨다. -> 문을 통과한 후에 앨리스의 위치는 아름다운 정원으로 바뀌어야 한다.

 

54pg,

객체가 어떤 행동을 하도록 만드는 것은 객체가 외부로부터 수신한 메세지다. 객체는 수신된 메세지에 따라 적절히 행동하면서 협력에 참여하고 그 결과로 자신의 상태를 변경한다. 객체는 협력에 참여하는 과정에서 자기 자신의 상태뿐만 아니라 다른 객체의 상태 변경을 유발할 수도 있다.

 

55pg, 

행동이란 외부의 요청 또는 수신도니 메세지에 응답하기 위해 동작하고 반응하는 활동이다. 행동의 결과로 객체는 자신의 상태를 변경하거나 다른 객체에게 메세지를 전달할 수 있다. 객체는 행동을 통해 다른 객체와의 협력에 참여하므로 행동은 외부에 가시적이어야 한다.

 

앨리스 객체의 키를 작게 만드는 것이 앨리스 자신인 것처럼 음료 객체의 양을 줄이는 것은 음료 자신이어야 한다. 앨리스는 단지 음료를 마셨다는 메세지를 전달할 뿐이다. 음료의 양을 줄이는 것은 메세지를 전달받은 음료 스스로의 몫이다.

 

56pg, 

메세지 송신자는 메세지 수신자의 상태 변경에 대해서는 전혀 알지 못한다. 이것이 캡슐화가 의미하는 것이다. 객체는 상태를 캡슐 안에 감춰둔 채 외부에 노출하지 않는다. 객체가 외부에 노출하는 것은 행동뿐이며, 외부에서 객체에 접근할 수 있는 유일한 방법 역시 행동뿐이다. 

 

상태를 외부에 노출시키지 않고 행동을 경계로 캡슐화하는 것은 결과적으로 객체의 자율성을 높인다.

 

결론적으로 상태를 잘 정의된 행동 집합 뒤로 캡슐화하는 것은 객체의 자율성을 높이고 협력을 단순하고 유연하게 만든다. 이것이 상태를 캡슐화해야 하는 이유다.

 

57pg,

객체가 식별 가능하다는 것은 객체를 서로 구분할 수 있는 특정한 프로퍼티가 객체 안에 존재한다는 것을 의미한다. 이 프로퍼티를 식별자라고 한다. 모든 객체는 식별자를 가지며 식별자를 이용해 객체를 구별할 수 있다.

 

값과 객체의 가장 큰 차이점은 값은 식별자를 가지지 않지만 객체는 식별자를 가진다는 점이다.

 

상태를 이용해 두 값이 같은지 판단할 수 있는 성질을 동등성(equality)이라고 한다. 값은 오직 상태만을 이용해 동등성을 판단하고 값의 상태는 변하지 않기 때문에 값은 인스턴스를 구별하기 위한 별도의 식별자를 필요로 하지 않는다.

 

58pg,

식별자를 기반으로 객체가 같은지를 판단할 수 있는 성질을 동일성(identical)이라고 한다. 상태를 기반으로 객체의 동일성을 판단할 수 없는 이유는 객체는 가변 상태(mutable state)를 가지기 때문이다. 

 

값은 식별자를 가지지 않기 때문에 상태를 이용한 동등성 검사를 통해 두 인스턴스를 비교해야 한다.

객체는 상태가 변경될 수 있기 때문에 식별자를 이용한 동일성 검사를 통해 두 인스턴스를 비교할 수 있다.

 

59pg,

참조 객체(reference object), 또는 엔티티(entity)는 식별자를 지닌 전통적인 의미의 객체를 가리키는 용어다.

값 객체(value object)는 식별자를 가지지 않는 값을 가리키는 용어다.

 


느낀점

객체가 가지고 있는 상태와 행동에 대한 내용이 많이 나왔다.

왜 자바와 같은 객체지향 프로그래밍에서 매번 캡슐화가 강조되는지,

그 이유를 오늘에서야 조금 알게된 것 같다.

 

핵심은 객체들 간의 협력인데 이것이 잘 이루어지려면 

각각의 객체가 자신이 맡은 역할과 책임을 잘 수행해낼 수 있어야 한다.

그리고 이것을 위해서는 필히 자율적이어야 할 것이다.

이 자율성을 높여주는 것이 캡슐화이다.

캡슐화를 통해서 비로소 각자의 역할과 책임에 더 집중할 수 있게 된다.

 

각자가 자신의 역할과 책임을 잘 수행해주면 협력이 단순해진다.

객체들 간의 협력이 핵심인데 이 과정이 단순해진다는 것은 큰 의미일 것이다.

 

내 생각이 틀릴 수도 있다. 그런데 당장은 이렇게 생각을 하고 있다.

아직 구체적인 사례로 이 효용에 대해 직접 체감해본 적은 없지만

그동안 캡슐화를 왜 해야 하는지 잘 몰랐는데 어렴풋이나마 알게되었다.