객체지향의 사실과 오해 (협력하는 객체들의 공동체)

유재우·2023년 1월 4일
0

책갈피

목록 보기
1/1

객체지향의 비유

객체지향을 쉽게 설명하기 위해 이 책에선 커피가게에 비유하였다.
이를 나의 방식으로 바꿔서 내가 이해한 것을 바탕으로 재구성하였다.


  1. 나는 코딩을 하다 모르는 문제에 막혀 이를 해결하기 위해 친구에게 물어봤다.
  2. 친구는 잠시 고민을 하다가 인터넷에 검색하여 좋은 소스코드를 보고 나에게 공유하였다.
  3. 그 소스코드를 이용하여 문제를 해결하였다.

객체지향은 일종의 요청의 연속이다.

나와 친구사이의 요청이 있었고
친구는 이를 해결하기 위해 인터넷과의 요청이 있었다.

나 -> 친구 -> 인터넷

또한 이 요청에 응답은 요청의 반대방향으로 연쇄적으로 전달된다.
인터넷은 좋은 소스코드라는 응답을 친구에게 해주었고
친구는 이 소스코드를 나에게 전달해주는 응답을 했다.

나 <- 친구 <- 인터넷

역할과 책임

역할은 다양한 책임의 집합으로 표현한다.

특정한 역할은 특정한 책임을 암시한다.

예를 들면, 경찰이라는 역할은 도둑을 잡아야하는 책임을 지니고, 의사는 사람의 병을 치료해야하는 책임을 내포하고 있다.

객체지향과 우리 사는 사회의 공통적인 중요한 개념이 몇가지 있다.

  • 여러사람이 동일한 역할을 수행
  • 역할은 대체 가능
  • 책임을 수행하는 방법은 자율적으로 선택
    '친구'가 고민을 하다 인터넷에 검색을 한거와 같이 자율적으로 선택이 가능
  • 한 사람이 동시에 여러 역할을 수행 가능

객체들의 기능구현

객체지향의 윤곽은 역할, 책임, 협력으로 이루어져있다.

애플리케이션의 기능은 작은 책임들로 분할되고
이 책임은 적절히 역할을 수행할 수 있는 객체에 의해 수행된다.
이 때 객체가 자신의 책임을 수행하는 도중 다른 객체에 도움을 요청하기도 한다.

사람 -> 객체
요청 -> 메시지
요청을 처리하는 방법 -> 메서드

위와 같이 단어를 변경하면 객체지향을 설명하는 개념이 된다.

객체지향의 설계는 적절한 객체에게 적절한 책임을 할당하는 것부터 시작이다.
여기서 책임은 객체지향 설계의 품질을 결정하는 가장 중요한 요소이다.


좋은 객체의 조건

좋은 객체의 조건으로 두가지가 있다

  • 협력적
  • 자율적

우선 객체가 협력적이면 다른 객체의 요청에 충실하고 또한 다른 객체에 요청할 것을 두려워해선 안된다.

또한 객체는 다른 객체의 명령을 수행하는 것이 아닌 요청에 응답하는 것이다.
어떤 방법으로 응답하는 지에 대한 것은 객체 스스로 판단하고 결정한다.


객체의 자율성

흔히 객체는 상태(state)와 행동(behavior)을 함께 지닌 실체로 정의한다.

객체가 협력에 참여하는 과정에서 스스로 판단하고 결정하는 자율적인 존재로 남기위해선 필요한 행동과 상태를 함께 지니고 있어야 하기 때문이다.


객체의 내부와 외부를 명확하게 구분하는 것으로 부터 나온다.

객체는 다른 객체가 무엇을 수행하는지 알수 있지만,
어떻게 수행하는지에 대해선 알수 없다.

메시지

객체지향에서의 한가지 의사소통 수단

전송: 객체가 메시지를 보내는것
송신자: 메시지를 전송하는 객체
수신: 객체가 다른 객체로부터 메시지를 받는 것
수신자: 메시지를 수신하는 객체


메시지의 자율성

메서드: 객체가 수신된 메시지를 처리하는 방법

'친구'는 '인터넷'에 좋은 소스코드를 찾음으로써 요청에 응답할 수 있었지만,
전공 서적에서 답안을 찾는 것도 가능하다.
여기서 각각의 선택지가 메서드라 할 수 있다.

'친구'는 스스로 고민하여 '인터넷'이라는 메서드를 택하였고,
이를 선택하는것은 '친구'라는 객체의 자유이다.

외부의 요청이 무엇인지 표현하는 메시지와 요청을 처리하기 위한 구체적인 방법인 메서드를 분리하는 것은 객체의 자율성을 높이는 핵심 메커니즘이다.


객체지향의 본질

  • 객체지향이란 시스템을 상호작용하는 자율적인 객체들의 공동체로 바라보고 객체를 이용해 시스템을 분할하는 방법
  • 자율적인 객체란 상태와 행위를 함께 지니며 자기 자신을 책임지는 객체
  • 객체는 시스템의 행위를 구현하기 위해 다른 객체와 협력
    각 객체는 협력 내에서 정해진 역할을 수행하고 역할은 관련된 책임의 집합
  • 객체는 다른 객체와 협력하기 위해 메시지를 전송하고, 메시지를 수신한 객체는 메시지를 처리하는 데 적합합 메서드를 자율적으로 선택

좋은 객체지향 설계자

흔히 객체지향하면 클래스를 얘기하지만 클래스보단 객체를 더 중요하게 보자
중요한 건 어떤 클래스가 필요한게 아닌 어떤 객체들이 어떤 메시지를 주고 받으며 협력하는가이다.

핵심은 적절한 책임을 수행하는 역할 간의 유연하고 견고한 협력 관계를 구축하는 것이다.

틀린 내용이나 수정이 필요해 보이는 부분은 댓글로 알려주시면 감사하겠습니다.

profile
끝없이 탐구하는 iOS 개발자 유재우입니다!

0개의 댓글