객체지향의 사실과 오해 - 1 정리

협력하는 객체들의 공동체

클래스의 구조와 메서드가 아니라 객체의 역할,책임, 협력에 집중하라 객체지향은 객체를 지향하는 것이지 클래스를 지향하는 것이 아니다.

 

  • 책임은 객체지향 설계의 품질을 결정하는 가장 중요한 요소다. 책임이 불분명한 객체는 애플리케이션의 미래 역시 불분명하게 만든다. 얼마나 적절한 책임을 선택하느냐가 애플리케이션의 아름다움을 결정한다.

 

  • 자율적인 객체란 상태와 행위를 함께 지니며 스스로 자기 자신을 책임지는 객체를 의미
  • 객체는 협력 내에서 정해진 역할을 수행하며 역할은 관련된 책임의 집합이다.
  • 객체는 다른 객체와 협력하기 위해 메시지를 전송하고, 메시지를 수신한 객체는 메시지를 처리하는 데 적합한 메서드를 자율적으로 선택한다.

 

  • 객체지향의 핵심은 클래스가 아니다. 적절한 책임을 수행하는 역할 간의 유연하고 견고한 협력 관계를 구축하는 것이다.
  • 객체지향의 중심에는 클래스가 아니라 객체가 위치하며, 중요한 것은 클래스들의 정적인 관계가 아니라 메시지를 주고받는 객체들의 동적인 관계이다.

 

이상한 나라의 객체

객체지향 세계에서 모든 객체는 자신의 상태를 스스로 관리하는 자율적인 존재이다.
객체는 다른 객체와 협력하기 위해 존재한다. 객체의 행동은 객체가 협력에 참여하는 유일한 방법이다.

 

  • 현실세계에서는 사람이 직접 주문 금액을 계산하지만 소프트웨어 세계에서는 주문 객체가 자신의 금액을 계산한다.
  • 실행 중인 객체지향 어플리케이션의 내부는 현실 세계와 유사해 보이지만 본질적으로는 매우 이질 적이다.

 

  • 객체는 상태를 가지며 상태는 변경이 가능하다.
  • 객체의 상태를 변경 시키는 것은 행동이다.
    • 행동의 결과는 상태에 의존적이다.
    • 행동의 순서가 결과에 영향을 미친다.
      • 행동에 따라 상태가 변화 할 수 있으므로
  • 객체는 어떤 상태에 있더라도 유일하게 식별 가능하다.

 

  • 자율적인 객체는 스스로 자신의 상태를 책임져야 한다.
    • 객체지향 세계에서 객체는 다른 객체의 상태에 직접적으로 접근할 수도, 상태를 변경할 수도 없다.

 

  • 객체의 행동은 상태에 영향을 받는다.
  • 객체의 행동은 상태를 변경시킨다.

 

  • 객체는 상태를 캡슐 안에 감춰둔 채 외부로 노출하지 않는다.
  • 객체가 외부에 노출하는 것은 행동뿐이며, 외부에서 객체에 접근할 수 있는 유일한 방법 역시 행동뿐이다.

 

타입과 추상화

  • 진정한 의미에서 추상화란 현실에서 출발하되 불필요한 부분을 도려내가면서 사물의 놀라운 본질을 드러나게 하는 과정이라고 할 수 있다.

 

  • 추상화란 어떤 양상, 세부사항 구조를 좀 더 명확하게 이해하기 위해 특정 절차나 물체를 의도적으로 생략하거나 감춤으로써 복잡도를 극복하는 방법이다.
    • 첫 번째 차원은 구체적인 사물들 간의 공통점은 취하고 차이점은 버리는 일반화를 통해 단순하게 만드는 것
    • 두 번째 차원은 중요한 부분을 강조하기 위해 불필요한 세부 사항을 제거함으로써 단순하게 만드는 것
  • 객체지향 패러다임은 객체라는 추상화를 통해 현실의 복잡성을 극복한다.

 

객체의 내부 표현 방식이 다르더라도 어떤 객체들이 동일하게 행동한다면 그 객체들을 동일한 타입에 속한다.

 

 

  • 어떤 객체가 어떤 타입에 속하는지를 결정하는 것은 객체가 수행하는 행동이다.
  • 어떤 객체들이 동일한 행동을 수행할 수 있다면 그 객체들을 동일한 타입으로 분류 될 수 있다.
  • 객체의 내부적인 표현은 외부로부터 철저하게 감춰진다. 객체의 행동을 가장 효과적으로 수행할 수만 있다면 객체 내부의 상태를 어떤 방식으로 표현하더라도 무방하다.
    • 객체의 타입과 객체 내부 표현은 아무런 상관이 없다.

 

  • 다형성 이란 동일한 요청에 대해 서로 다른 방식으로 응답할 수 있는 능력이다.
  • 캡슐화 외부에 행동마을 제공하고 데이터를 행동 뒤로 감춰야 한다.

 

  • 결국 타입은 추상화다
  • 타입을 이용하면 객체의 동적인 특성을 추상화할 수 있다.
  • 시간에 따른 객체의 상태 변경이라는 복잡성을 단순화 할 수 있는 효과적인 방법이다.

 

역할, 책임, 협력

객체지향 개발에서 가장 중요한 능력은 책임을 능숙하게 소프트웨어 객체에 할당하는 것

 

  • 객체 지향의 세계는 동일한 목적을 달성하기 위해 협력하는 객체들의 공동체
  • 객체들 사이의 요청과 응답을 통해 협력이 이루어진다.
  • 요청과 응답은 협력에 참여하는 객체가 수행할 책임을 정의한다.

 

  • 객체지향 세계에서는 어떤 객체가 어떤 요청에 대해 대답해 줄 수 있거나 적절한 행동을 할 의무가 있는 경우 해당 객체가 책임을 가진다고 말한다.
  • 협력에 참여하는 객체들은 목표를 달성하는 데 필요한 책임을 수행한다.
  • 책임은 객체에 의해 정의되는 응집도 있는 행위에 집합으로, 객체가 알아야 하는 정보와 객체가 수행할 수 있는 행위에 대해 개략적으로 서술한 문장이다.

 

  • 메시지 전송 : 객체가 다른 객체에게 주어진 책임을 수행하도록 요청을 보내는 것
  • 책임 != 메시지 전송
    • 책임은 객체가 협력에 참여하기 위해 수행해야 하는 행위를 상위 수준에서 개략적으로 서술한 것이다.

 

객체지향 설계는 협력에 참여하기 위해 어떤 객체가 어떤 책임을 수행해야 하고 어떤 객체로 부터 메시지를 수신할 것인지를 결정하는 것으로 부터 시작된다.

 

  • 역할은 협력 한에서 구체적인 객체로 대체될 수 있는 추상적인 협력자다.
  • 역할을 가장 큰 가치는 하나의 협력 안에 여러 종류의 객체가 참여할 수 있게 함으로써 협력을 추상화 할 수 있다는 것이다.

 

올바른 객체를 설계하기 위해서는 먼저 견고하고 깔끔한 협력을 설계해야 한다. 협력을 설계한다는 것은 설계에 참여하는 객체들이 주고받을 요청과 응답의 흐름을 결정한다는 것을 의미한다. 이렇게 결정된 요청과 응답의 흐름은 객체가 협력에 참여하기 위해 수행될 책임이 된다.

 

객체지향 시스템을 설계하는 절차

  1. 시스템이 사용자에게 제공해야 하는 기능인 시스템 책임을 파악한다.
  2. 시스템 책임을 더 작은 책임으로 분할한다.
  3. 분할된 책임을 수행 할 수 있는 적절한 객체 또는 역할을 찾아 책임을 할당한다.
  4. 객체가 책임을 수행하는 중에 다른 객체의 도움이 필요한 경우 이를 책임질 적절한 객체 또는 역할을 찾는다.
  5. 해당 객체 또는 역할에게 책임을 할당함으로써 두 객체가 협력하게 된다.

댓글



Designed by JB FACTORY