본 게시물은 조영호님의 저서 오브젝트를 학습하면서 정리한 내용입니다.

객체지향 개발자라면 꼭 알아야할 내용들이 가득한 책이기 때문에 참고만하시고 반드시 책을 구매해서 읽어보길 권해드려요!

(네이버 도서 구매링크 클릭)

저작물에 대한 문제가 발생할 경우 비공개 처리하겠습니다.


 

  • 객체지향 패러다임의 관점에서 핵심은 역할, 책임, 협력
  • 객체지향의 본질은 협력하는 객체들의 공동체를 창조하는 것
    • 협력을 구하기 위해 적절한 객체를 찾음 → 적절한 책임을 할당
  • 협력을 위한 역할과 책임을 고민하는 것이 중요

 

협력

  • 객체지향 원칙을 따르면 애플리케이션의 제어 흐름이 다양한 객체들에게 균형있게 분배됨
    • 어떤 하나의 객체에 의해 통제되지 않음
  • 객체들 사이에 메시지를 주고 받으면서 상호작용을 함 ( 협력 )
  • 자율적인 객체들의 공동체
  • 기능을 구현하는 유일한 방법
  • 메시지를 받은 객체는 메서드를 실행해서 응답
    • 메시지에 대한 처리방법은 수신한 객체가 스스로 선택(메서드)

 

자율적인 객체

  • 자신의 상태를 직접 관리하고 스스로 결정에 따라 행동하는 객체
  • 필요한 정보, 정보에 기반한 행동을 같은 객체 안에 모아야 함
  • 가장 기본적인 방법으로는 내부 구현을 캡슐화하는 것

 

협력이 설계를 위한 문맥을 결정한다

  • 객체가 협력에 참여하기위해 적절한 행동을 보유해야 함
  • 객체의 행동은 협력의 필요에 따라 결정되어야 함
    • 협력이 바뀌면 행동도 바뀌어야 함
  • 협력은 객체가 필요한 이유, 객체가 수행하는 행동의 동기를 제공
    • 왜 이 객체가 필요한가? → 협력하고 있기 때문이다.
    • 이 객체는 왜 이러한 행동을 하는가 → 협력에 참여하고 있기 때문이다.
  • 협력은 객체지향 설계에서의 문맥
  • 상태는 객체가 행동하는데 필요한 정보에 의해 결정

 

💡
객체들이 서로 상호작용하는 것, 이러한 메시지의 흐름을 협력이라고 부르는데 Context라는 모호해서 어려운 키워드를 명확하게 이해할 수 있는 부분이다.

 

책임

책임이란 무엇인가

  • 협력에 참여하기위해 객체가 수행하는 행동
  • 객체에 의해 정의되는 응집도 있는 행위의 집합
  • 객체의 정보와 행동으로 구성
    • 하는 것
      • 객체가 스스로 수행하는 것 ( 직접 계산 등..)
      • 다른 객체의 행동을 시작시키는 것
      • 다른 객체의 활동을 제어하고 조절하는 것
    • 아는 것
      • 사적인 정보 (private data)
      • 관계된 객체에 관해 아는 것 (합성)
      • 자신이 유도하거나 계산할 수 있는 것에 관해 아는 것
  • 협력 안에서 객체에게 할당한 책임외부의 인터페이스내부의 속성을 결정
  • 적절한 협력 → 적절한 책임을 제공, 적절한 책임을 객체에게 할당 → 유연한 설계 가능
  • 객체에게 얼마나 적절한 책임을 할당하느냐가 설계 품질을 결정함

 

책임과 메시지

  • 일반적으로 책임과 메시지의 크기는 다름
  • 책임은 객체가 수행할 수 있는 행동 ( 종합적, 간략하고 서술 )→ 메시지보다 추상적인 개념
  • 단순한 책임이 여러 개의 메시지로 분할 되기도 함
  • 하나의 객체가 수행할 수 있다고 생각했던 책임이 여러 객체들의 협력으로 만들어지기도 함

 

CRC 카드

  • 객체지향설계를 돕기위해 고안된 방법
  • 각각이 후보, 책임, 협력을 뜻 함
    • 후보
      • 카드 뒤에 후보의 목적을 기술
        • 후보가 외부에 제공해야 하는 서비스를 한 문장으로 기술
    • 책임
      • 카드 앞면에 선을 긋고 한쪽에 목적을 세분화해서 무엇을 알고 무엇을 해야하는가 기재
    • 협력
      • 책임을 수행하려면 협력할 협력자 나열
  • 설계를 하면서 직접 눈으로 보고 손으로 만질 수 있을때 효과적

 

책임할당

  • 자율적인 객체를 만드는 가장 기본적인 방법→ 책임을 수행하는데 필요한 정보를 가장 잘 아는 전문가에게 책임 할당
  • ⇒ 협력에 필요한 지식과 방법 잘 알고 있는 객체에게 도움을 요청
  • 책임을 할당하는 것만으로도 상태와 행동을 함께 가지는 자율적인 객체를 만들 가능성이 높아짐

 

책임할당의 순서

  • 협력이라는 문맥을 정의
    • 시스템이 제공하는 기능을 하나의 책임으로 바라보는 것부터 시작
  • 시스템 책임을 완료하는데 필요한 작은 책임을 찾아내고 객체에 할당하길 반복
    • 메시지의 이름을 결정하는 것으로 책임을 할당
      • 책임을 수행하는 유일한 방법은 메시지이기 때문
    • 메시지를 처리할 객체를 선택
      • 정보를 소유하고 있거나 정보의 소유자를 잘 아는 전문가를 찾는 것

⇒ 이렇게 결정된 메시지는 퍼블릭 인터페이스가 됨

 

책임 주도 설계

  • 책임을 찾고 수행할 객체를 찾아 할당하는 방식의 설계를 말함
  • 어떤 책임을 선택하느냐에 따라 전체적인 설계의 방향과 흐름이 결정됨
  • 객체의 구현이 아닌 책임에 집중할 수 있게 함
    • 유연하고 견고한 객체지향 시스템의 가장 중요한 재료
  • 책임을 할당할 때 가장 중요한 요소
    • 메시지가 객체를 결정
    • 행동이 상태를 결정

메시지가 객체를 결정한다

  • 책체가 메시지를 선택하는 것이 아님 → 메시지가 객체를 선택
  • 최소한의 인터페이스를 갖게 하기 위함
    • 필요한 메시지가 식별될 때까지 퍼블릭 인터페이스에 추가되는 것이 없음→ 꼭 필요한 크기의 인터페이스를 갖게 됨
  • 추상적인 인터페이스를 갖게 하기 위함

 

행동이 상태를 결정한다

  • 상태는 객체가 행동을 정상적으로 수행하기위해 필요한 재료일 뿐
  • 객체의 행동은 객체가 협력에 참여할 수 있는 유일한 방법
  • 객체의 상태에 초점을 맞추면 객체의 내부 구현이 객체의 퍼블릭 인터페이스에 노출됨→ 캡슐화 저해

 

💡
책임을 수행하는 방법은 메시지 뿐이다. 유일한 방법이기때문에 힌트는 여기에 있었다. 책임들의 흐름인 협력( 문맥 )을 완성하기 위해서는 결국 메시지를 정하고 메시지를 수행할 객체(역할)을 확정하면 되는 것이었다. 단순하게 머릿속의 흐름대로 개발을 하면 자연스럽게 상태와 구현을 그대로 노출하는 자율성을 잃어버린 객체를 만들게 될 것이다.

 

역할

역할과 협력

  • 역할 : 협력안에서 수행하는 책임의 집합
    • 다른 것으로 교체할 수 있는 책임의 집합
  • 협력을 모델링할 때 → 특정한 객체가 아니라 역할에게 책임을 할당한다고 생각해야 함
  • 책임을 할당한다는 것을 분해
    • 역할을 찾음
    • 역할을 수행하는 객체를 선택

유연하고 재사용 가능한 협력

  • 역할의 중요성 : 역할을 통해 유연하고 재사용 가능한 협력을 얻을 수 있음
  • 역할은 하나의 슬롯
  • 구체적인 객체를 포괄하는 추상화의 개념
  • 역할을 기반으로 불필요한 중복 코드를 제거하고 하나로 통합하는 것이 가능
  • 역할에 의해 변경과 확장이 용이한 유연한 설계가 가능함

 

객체 대 역할

  • 협력에 적합한 책임을 수행하는 댓아이 여러 종류면 역할이라고 부름
  • 협력에 적합한 책임을 수행하는 대상이 한 종류면 객체로 간주해도됨
  • 역할을 협력 안에서 각자의 위치를 가지는 객체들에 대한 별칭이라고 정의하기도 함

 

역할과 추상화

  • 역할의 큰 장점은 설계 요소를 추상화 할 수 있다는 것
  • 추상화의 장점과 동일한 장접을 갖게됨
    • 세부적인 사항을 무시하고 추상화에 집중할 수 있음
    • 설계를 유연하게 만들 수 있음

 

배우와 배역

  • 무대에서의 배우, 배역과 객체지향에서의 역할이 유사함
    • 객체는 협력(실행 문맥) 안에서 특정한 역할을 수행
    • 협력이 끝나면 원래의 객체로 돌아올 수 있음
    • 객체가 협력에 참여하는 동안에만 존재하는 일시적인 개념
    • 객체는 여러 역할을 가질 수 있으나 특정한 협력 안에서는 일시적으로 오직 하나의 역할만 바라볼 수있음

+ Recent posts

"여기"를 클릭하면 광고 제거.