객체지향의 사실과 오해

2019. 4. 1. 21:38coding

  1. 상태
    1. 객체가 주변 환경과의 상호작용에 어떻게 반응하는가는 그 시점까지 객체에 어떤 일이 발생했느냐에 좌우된다.
    2. 모든 객체의 상태는 단순한 값과 객체의 조합으로 표현할 수 있다. 이때 객체의 상태를 구성하는 모든 특징을 통틀어 객체의 프로퍼티 (property) 라 한다. 일반적으로 프로퍼티는 변경되지 않고 고정되기 때문에 정적이다. 반면 프로퍼티 값 (property value)는 시간의 흐름에 따라 변경되기 때문에 동적이다.
    3. 객체와 객체 사이의 의미있는 연결을 링크 (link) 라고 한다. 객체와 객체 사이에는 링크가 존재해야만 요청을 보내고 받을 수 있다. 즉, 객체의 링크를 통해서만 메세지를 주고받을 수 있다. 링크는 객체가 다른 객체를 참조할 수 있다는 것을 의미하며, 이것은 일반적으로 한 객체가 다른 객체의 식별자를 알고 있는 것으로 표현된다.
    4. 객체간의 선으로 표현되는 링크와 달리 객체를 구성하는 단순한 값은 속성(attribute) 이라 한다. 객체의 프로퍼티는 단순한 값인 속성과 다른 객체를 가리키는 링크라는 두가지 종류의 조합으로 표현할 수 있다.
    5. 상태란 특정 시점에 객체가 가지고 있는 정보의 집합으로 객체의 구조적 특징을 표현한다. 객체의 상태는 객체에 전재하는 정적인 프로퍼티와 동적인 프로퍼티 값으로 구성된다. 객체의 프로퍼티는 단순한 값과 다른 객체를 참조하는 링크로 구분할 수 있다.
  2. 행동
    1. 객체가 취하는 행동은 객체 자신의 상태를 변경시킨다. 객체의 행동에 의해 객체의 상태가 변경된다는 것은 행동이 부수 효과(side effect)를 초래한다는 것을 의미한다.
    2. 객체의 행동은 객체의 상태를 변경시키지만 행동의 결과는 객체의 상태에 의존적이다. 객체의 행동은 상태에 영향을 받으며 상태를 변경시킨다.
    3. 객체가 다른 객체와 협력하는 유일한 방법은 다른 객체에게 요청을 보내는 것이다. 객체는 다른 객체와 메세지를 통해서만 의사소통 할 수 있다.
  3. 식별자
    1. 모든 객체는 식별자를 가진다. 값은 식별자를 가지지 않지만 객체는 식별자를 가진다.
    2. 값(value) : 변하지 않는 양을 모델링한다. 값의 상태는 변하지 않기 때문에 불변상태를 가진다. 값의 경우 두 인스턴스의 상태가 같다면 두 인스턴스를 같은 것으로 판단한다. 이 성질을 동등성(equality) 라고 한다. 값의 상태는 변하지 않기 때문에 어떤 시점에 동일한 타입의 두 값이 같다면 두 값은 동등한 상태를 유지할 것이다.
    3. 객체 : 시간에 따라 변경되는 상태를 포함하며, 행동을 통해 상태를 변경한다. 객체는 가변상태를 가진다. 이 때 두 객체의 상태가 다르더라도 식별자가 같다면 두 객체를 같은 객체로 판단할 수 있다. 이처럼 식별자를 바탕으로 객체가 같은지를 판단할 수 있는 성질을 동일성(equality) 이라고 한다.
  4. 기계로서의 객체
    1. 일반적으로 객체의 상태를 조회하는 작업을 쿼리(query) 라고 하고, 객체의 상태를 변경하는 작업을 명령(command)라고 한다. 객체가 외부에 제공하는 행동의 대부분은 쿼리와 명령으로 구성된다.
  5. 행동이 상태를 결정한다
    1. 상태를 먼저 결정하고 행동을 나중에 결정하는 방법은 설계에 나쁜 영향을 끼친다.
      1. 상태를 먼저 결정할 경우 캡슐화가 저해된다. 상태에 초점을 맞추면 상태가 객체 내부로 깔끔하게 캡슐화되지 못하고 공용 인터페이스에 그대로 노출되어버릴 확률이 높아진다.
      2. 상태를 먼저 고려하는 방식은 협력에 적합하지 못한 객체를 창조할 수 있다.
      3. 상태에 초점을 맞춘 객체는 다양한 협력에 참여하기 어렵기 때문에 재사용성이 저해될 수 있다.