[객체지향의 사실과 오해] 5. 책임과 메시지

✨New Wisdom✨·2021년 1월 24일
2

📕 OOP 📕

목록 보기
5/8
post-thumbnail

"객체지향의 사실과 오해" 책 내용을 체화하기 위해 읽으며 기록하는 노트이다.

자율적인 책임

자율적인 객체란 스스로 정한 원칙에 따라 판단하고 스스로의 의지를 기반으로
행동하는 객체이다. 스스로의 의지와 판단에 따라 각자 맡은 책임을 수행하는 객체이다.
객체에게 할당되는 책임의 수준 역시 자율적이어야 한다.

하지만 책임은 협력에 참여하는 의도를 명확하게 설명할 수 있는 수준 안에서 추상적이어야 한다.

'어떻게'가 아닌 '무엇'을

'어떻게'는 객체가 할 책임의 방법 제한하게 된다.

메시지와 메서드

메시지

객체는 메시지를 전송함으로 다른 객체에 접근한다.
메시지 이름과 추가 정보가 필요할 경우 메시지의 인자를 함께 제공한다.

메시지를 수신한 객체는 자신이 해당 메시지를 처리할 수 있는지 확인하며,
처리할 수 있다는 것은 객체가 해당 메시지에 대한 행동을 수행해야 할 책임이 있음을 말한다.
객체는 메시지를 처리하기 위한 방법을 자율적으로 선택할 수 있다.

메서드

메시지를 처리하기 위해 내부적으로 선택하는 방법
클래스 안 함수 또는 프로시저를 통해 구현된다.
메시지는 '어떻게' 수행될 것인지 명시하지 않고 '무엇'을 수행할 지를 알려준다.

다형성

서로 다른 타입에 속하는 객체들이 동일한 메시지를 수신할 경우 서로 다른 메서드를 이용해
메시지를 처리할 수 있다.

서로 다른 객체들이 다형성을 만족시킨다는 것은 객체들이 동일한 책임을 공유한다는 것이다.
수신자들은 서로 다른 방식으로 처리하더라도 송신자 관점에서는 수신자들은
동일한 책임을 수행하는 것이다.
다형성은 동일한 역할을 수행할 수 있는 객체들 사이의 대체 가능성을 의미한다.
다형성은 수신자의 종류를 캡슐화 한다.

장점

  • 협력이 유연해진다.
  • 협력이 수행되는 방식을 확장할 수 있다.
  • 협력에 수행되는 방식을 재사용할 수 있다.

메시지를 따라라

객체지향 애플리케이션은 클래스를 이용해 만들어지지만 메시지를 통해 정의된다.
객체지향은 시스템을 클래스들의 집합으로 보는 것이 아닌 메시지를 주고받는
동적인 객체들의 집합으로 바라봐야 한다.

협력 관계 속에서 다른 객체에게 무엇을 제공해야 하고 다른 객체로부터
무엇을 얻어야하는가라는 관점에서 접근할 때 훌륭한 책임을 얻을 수 있다.

책임-주도 설계 다시보기

객체들 간 주고받는 메시지를 기반으로 적절한 역할과 책임, 협력을 발견하는 것이다.
메시지가 수신자의 책임을 결정한다.

what/who 사이클

어떤 행위가 필요한지를 먼저 결정한 후 이 행위를 수행할 객체를 결정하는 것
여기서 어떤 행위가 바로 메시지이다.
행위를 식별한 후 행위를 수행할 적절한 객체를 찾는다.

협력이라는 문맥 안에서 필요한 메시지를 먼저 결정한 후 메시지를 수신할 객체를 선택한다.
수신된 메시지가 객체의 책임을 결정한다.

묻지 말고 시켜라

메시지를 먼저 결정하고 객체를 선택하는 방식이면, 송신자는 수신자를 모르기 때문에
객체의 상태에 관해 캐물을 수 없다.

객체 인터페이스

인터페이스

특징

  • 사용법을 익히기만 하면 내부 구조를 몰라도 대상을 조작하거나 의사 전달이 가능하다.
  • 인터페이스 자체는 변경시키지 않고 내부 구성이나 작동 방식만을 변경하는 것은 인터페이스 사용자에게 어떤 영향도 미치지 않는다.
  • 대상이 변견되도 동일한 인터페이스를 제공하면 아무 문제 없이 상호작용할 수 있다.

메시지가 인터페이스를 결정한다.

객체의 인터페이스는 객체가 수신할 수 있는 메시지의 목록으로 구성되며 어떤 메시지를
수신할 수 있는지가 객체가 제공하는 인터페이스의 모양을 빚는다.

공용 인터페이스

외부에서 접근 가능한 공개된 인터페이스와 내부에서만 접근 가능한 감춰진 인터페이스로 구분된다.
외부에서 접근 가능한 공개된 인터페이스를 공용 인터페이스라고 한다.
모든 인터페이스는 메시지 전송을 통해서만 접근할 수 있다.

인터페이스와 구현의 분리

객체 관점에서 생각하는 방법

  • 좀 더 추상적인 인터페이스
  • 최소 인터페이스
  • 인터페이스와 구현 간에 차이가 있다는 점을 인식

구현

객체지향에서 내부 구조와 작동 방식을 가리키는 용어
객체를 구성하지만 공용 인터페이스에 포함되지 않는 모든 것

상태를 어떻게 표현할 것인가는 객체의 구현이다.
메서드를 구성하는 코드 자체는 객체의 구현이다.

인터페이스와 구현의 분리 원칙

객체 외부에 노출되는 인터페이스와 내부에 숨겨지는 구현을 명확히 분리해 고려해야 한다.
구현을 수정하더라도 객체 외부에 영향을 미쳐선 안된다.

캡슐화 (정보 은닉)

상태와 행위의 캡슐화

객체는 상태와 행위의 조합이다. 이를 캡슐화 하는 것을 데이터 캡슐화라고 한다.

사적인 비밀의 캡슐화

외부에서 객체와 의사소통할 수 있는 고정된 경로를 공용 인터페이스라고 한다.

객체의 자율성이란 객체의 내부와 외부를 엄격하게 분리하는 것이다.

책임의 자율성이 협력의 품질을 결정한다

자율적인 책임은 협력을 단순하게 만든다

세부사항을 무시함으로써 책임이 적절하게 추상화된다.

자율적인 책임은 외부와 내부를 명확히 분리시킨다

책임만 완수할 수 있으면 내부의 방법은 상관 없다.

책임이 자율적일 경우 책임을 수행하는 내부적인 방법을 변경하더라도 외부에 영향을 미치지 않는다

책임이 자율적일수록 변경에 의해 수정돼야 하는 범위가 좁아진다.

자율적인 책임은 협력의 대상을 다양하게 선택할 수 있는 유연성을 제공한다

책임이 자율적일수록 협력이 유연해지며 다양한 문맥에서 재활용이 가능해진다.

객체가 수행하는 책임들이 자율적일수록 객체의 역할을 이해하기 쉬워진다

책임들이 자율적일 수록 객체 존재 이유를 명확히 표현한다.

profile
🚛 블로그 이사합니다 https://newwisdom.tistory.com/

0개의 댓글