본문 바로가기
독서

객체지향의 사실과 오해 - 4장 역할, 책임, 협력

by tempus 2022. 5. 25.
반응형

아래 내용은 조영호 님의 "객체지향의 사실과 오해"를 읽고 공부한 내용을 개인적으로 정리하였습니다.

 

📕 최후통첩 게임을 통해 본 인간

  • 인간이 가지는 본연의 특성이라는 관점에서 인간은 이기적이고 합리적인 존재다.
  • But, 타인과 관계를 맺는 과정 속에서 인간은 본연의 특성을 배제하고 자신의 이익을 최소화하는 불합리한 선택을 하게 된다.

⇒ 이는 개인이 처해 있는 정황 또는 문맥이 인간의 행동 방식을 결정한다는 것을 알 수 있다.

⇒ 여기서 문맥은 타인과의 협력이다.

 

객체의 세계에서도 협력이라는 문맥이 객체의 행동 방식을 결정한다. 중요한 것은 개별 객체가 아니라 객체들 사이에 이뤄지는 협력이다. 객체지향 설계의 전체적인 품질을 정하는 것은 여러 객체들이 모여 이뤄내는 협력의 품질이다. ⇒ 우리는 객체들 간의 협력에 초점을 맞추어 애플리케이션을 설계해야 한다.

 

👉 point. 협력이 어떤 식으로 객체의 외양과 특성을 결정하는지 배워보자

 

📕 협력

👉 협력의 본질은 요청과 응답으로 연결되는 사람들의 네트워크

 

어떤 객체가 특정한 요청을 받아들일 수 있는 이유는 그 요청에 대해 적절한 방식으로 응답하는데 필요한 지식과 행동 방식을 가지고 있기 때문이다. 그리고 요청과 응답은 협력에 참여하는 객체가 수행할 책임을 정의한다.

 

📕 책임

객체지향 세계에서 어떤 객체가 어떤 요청에 대해 대답을 해줄 수 있거나, 적절한 행동을 할 의무가 있는 경우 해당 객체가 책임을 가진다고 말한다.

책임의 구성

  • 하는 것(doing)
    • 객체를 생성하거나 계산을 하는 등의 스스로 하는 것
    • 다른 객체의 행동을 시작시키는 것
    • 다른 객체의 활동을 제어하고 조절하는 것
  • 아는 것(knowing)
    • 개인적인 정보에 관해 아는 것
    • 관련된 객체에 관해 아는 것
    • 자신이 유도하거나 계산할 수 있는 것에 관해 아는 것

⇒ 책임은 객체의 외부에 제공해 줄 수 있는 정보와 외부에 제공해 줄 수 있는 서비스의 목록이다. (객체의 공용 인터페이스를 구성한다.)

책임과 메시지

객체가 다른 객체에게 전송한 요청은 그 요청을 수신한 수신한 객체의 책임이 수행되게 한다. ⇒ 이처럼 객체가 다른 객체에게 주어진 책임을 수행하도록 요청을 보내는 것을 메시지 전송이라고 한다.

👉 객체 간의 협력은 메시지를 통해 이루어진다.

우리는 객체지향 설계를 시작할 때 어떤 객체가 어떤 책임을 가지고 어떤 방식으로 서로 협력해야 하는지에 더 집중해야 한다.

 

📕 역할

어떤 객체가 수행하는 책임의 집합은 객체가 협력 안에서 수행하는 역할을 암시한다. ⇒ 역할은 재사용 가능하고 유연한 객체지향 설계를 낳는 매우 중요한 구성요소이기 때문이다.

역할은 협력 내에서 다른 객체로 대체할 수 있음을 나타내는 일종의 표식이다. → 협력 안에서 역할은 “이 자리는 해당 역할을 수행할 수 있는 어떤 객체라도 대신할 수 있다.”를 의미한다.

 

단, 역할은 대체할 수 있는 객체는 동일한 메시지를 이해할 수 있는 객체로 한정된다. ⇒ 동일한 책임의 집합을 수행할 수 있다는 것을 의미한다.

 

역할을 통해 우리는 협력이 좀 더 유연해질 수 있다.

 

역할은 객체지향 설계의

  1. 단순성
  2. 유연성
  3. 재사용성

을 뒷받침하는 핵심 개념이다.

 

역할의 가장 크 가치는 하나의 협력 안에 여러 종류의 객체가 참여할 수 있게 함으로써 협력을 추상화할 수 있다는 것이다.

역할의 대체 가능성은 해당 객체가 동일한 책임을 수행할 수 있어야 한다는 것을 의미한다.

 

📕 객체의 모양을 결정하는 협력

객체지향 입문자들은 데이터나 클래스를 중심으로 애플리케이션을 설계하는 오류를 저지른다. 그 이유는 협력이라는 문맥을 고려하지 않고 각 객체를 독립적으로 바라보기 때문이다.

그래서 우리는 올바른 객체를 설계하기 위해서는 먼저 견고하고 깔끔한 협력을 설계해야 한다. ⇒ 설계에 참여하는 객체들이 주고받을 요청과 응답의 흐름을 결정하는 것을 의미

 

1) 협력이라는 문맥에서 객체가 수행하게 될 2) 적절한 책임을 부여하고 그 행동을 수행하는데 3) 필요한 데이터를 고민하자. ⇒ 이렇게 협력에 참여하기 위해 데이터와 행동이 어느 정도 정해졌다면 클래스 구현 방법을 결정해야 한다.

 

결론적으로 객체를 충분히 협력적으로 만든 후에 협력이라는 문맥 안에서 객체를 충분히 자율적으로 만들어야 한다.

 

📕 객체지향 설계 기법

역할, 책임, 협력의 관점에서 애플리케이션을 설계하는 유용한 3가지 방법

 

  • 책임 주도 설계 - 협력에 필요한 책임들을 식별하고 적합한 객체에서 책임을 할당하는 방식
  • 디자인 패턴 - 전문가들이 반복적으로 사용하는 해결 방법을 정의해 놓은 설계 템플릿 모음
  • 테스트 주도 개발 - 테스트를 먼저 작성하고 테스트를 통과하는 구체적인 코드를 추가하며 애플리케이션을 완성해나가는 방식
반응형

댓글


loading