-
객체지향의 사실과 오해 3언어/객체지향 2023. 8. 2. 11:59
훌륭한 메시지가 훌륭한 객체지향 설계의 기반임을 강조
객체의 자율성과 설계의 유연성은 어떤 메시지를 선택하느냐에 달렸다.
5. 책임과 메시지
5.1 자율적인 책임
> 설계의 품질을 좌우하는 책임
- 기능 구현을 위해 협력하고 그 과정에서 책임을 다하기 위해 자율적 행동
- 객체가 어떤 행동을 하는 유일한 이유는 메시지의 수신 (책임)
> 자신의 의지에 따라 증언할 수 있는 자유
- 재판하라는 메시지에 자율적 책임을 다함
- 메시지 송신자는 어떤 방식으로 응답하는지는 관심이 없다.
- 어떤 메시지를 전하는냐에 따라 자율성을 침해할 여지가 있다.
- 충분히 자율적이기 위해선, 책임이 추상적일 필요가 있다(메시지가)
> 너무 추상적인 책임
- 협력의 의도를 명확하게 표현하지 않는 것도 문제
- 너무 과도한 자율성은 협력을 깨뜨릴 수 있다.
- 따라서 충분히 추상적이면서 협력의 의도를 드러내는 책임(메시지)가 필요
> 어떻게가 아니라 무엇을
> 책임을 자극하는 메시지
- 메시지는 책임을 수행하도록 외부에서 전달된 요청 (책임이 먼저 어떤 메시지를 통해서 책임을 수행할 것인가)
5.2 메시지와 메서드
- 메시지를 전송하여 다른 객체에 접근
- 증언하라 (메시지이름) 응답에 필요한 추가정보 -> 인자 증언하라(어제,왕국)
- 수신자까지 합쳐서 모자장수.증언하라(어제,왕국)
- 메시지를 처리한다 -> 메시지에 해당하는 행동을 수행할 책임이 있다.
* 객체가 서로 협력하기 위해 사용하는 수단 -> 메시지
메시지 수신 가능 -> 객체가 해당 책임을 수행할 수 있다는 것
외부 객체는 메시지만 볼 수 있고, 자율적 책임 수행 방식은 볼 수 없다.
> 책임은 한쪽 객체의 관점 - 다른 객체 존재 여부에 상관 없이 외부에 제공할 수 있는 행위
메시지는 송신자 수신자, 객체 간 상호 협력의 문맥 강조
- 한 객체는 메시지를 송신할 수 있고 다른 객체는 이를 수신하여 책임을 수행할 수 있음을 보는 것
- 메시지와 책임의 수준은 같지 않음, 책임은 객체가 협력에 참여하기 위해 수행해야하는 행위를 상위 수준에서 서술
- 책임이 결정된 후 실제로 협력하면서 메시지로 변환되면, 하나의 책임은 여러 메시지로 분할
(왕 -> 증언하라 -> 모자장수), (토끼 -> 증언하라 -> 모자장수) -> 모자장수 증언의 책임이 메시지로 변환
> 메서드
- 메시지 처리를 위해 선택할 수 있는 방법 (내부, 자율 선택)
> 다형성
- 메시지와 메서드의 분리
- 동일한 메시지에 서로 다른 반응
- 서로 다른 타입에 속하는 객체들이 동일한 메시지를 수신할 경우 서로 다른 메서드로 처리
- 다형성은 하나의 메시지와 하나 이상의 메서드의 관계이다.
- 다형성에서 중요한 것은 송신자의 관점 -> 다형적 수신자 구별할 필요가 없어 요청을 수행할 책임을 지닌다는 점에서 모두 동일
- 송신자는 동일 역할 수행하는 다양한 타입의 객체와 협력 (대체 가능성, 수신자의 캡슐화)
- 송신자와 수신자 간 객체 타입에 대한 결합도를 메시지에 대한 결합도로 낮춰서 달성
> 유연하고 확장 가능하고 재사용성이 높은 협력의 의미
- 송신자는 수신자에 대한 매우 적은 정보만으로 상호 협력이 가능하다.
1. 협력이 유연해진다.
2. 협력이 수행되는 방식을 확장할 수 있다.
3. 협력이 수행되는 방식을 재사용할 수 있다.
> 송신자와 수신자를 약하게 연결시키는 메시지
- 다형성을 지탱하는 메시지가 중요 송신자 수신자 사이 결합도를 낮춤
- 송신자는 오직 메시지만 바라본다. 수신자의 정확한 타입은 몰라도 된다.
5.3 메시지를 따라라
- 메시지 전송, 메시지 수신 -> 책임 수행 (자율적 방식)
- 클래스는 코드를 구현하기 위해 중요한 추상화 도구, 하지만, 객체지향의 강력함은 메시지로부터 나온다.
- 클래스를 이용해 만들어지지만, 메시지를 통해 정의된다.
- 클래스는 동적 객체의 특성과 행위를 정적 텍스트로 표현하기 위해 사용할 수있는 추상화 도구
- 객체들의 속성과 행위 식별이 먼저다
- 메시지를 주고받는 동적 객체들의 집합으로 시스템을 바라보자,
클래스에 담길 객체들의 공통적인 행위외 속성을 포착하기 위해서 협력하는 객체의 관점에서 시스템을 바라봐야 한다.
- 객체가 메시지를 선택하는게 아니라, 메시지가 객체를 선택해야함
>책임 주도 설계 다시 보기
- 메시지 기반으로 역할,책임,협력을 발견하는것
- 시스템 기능을 구현하기 위해 협력 관계를 시작할 적절한 객체를 찾아 책임을 할당해야한다.
- 어떤 메시지가 필요한지 결정하고, 메시지 수신하기에 적합한 객체를 선택한다. (메시지가 책임을 결정)
> what/who 사이클
- 어떤 행위 수행할 것인지 결정한 후에 누가 행위를 수행할 것인지 결정해야한다.
- 필요한 메시지를 먼저 결정한후 객체를 선책 수신된 메시지가 객체의 책임을 결정
- 수신 가능한 메시지가 모여 객체의 인터페이스를 구성 (메시지를 결정해야 인터페이스를 발견할 수 있다)
> 묻지말고 시켜라
- 다른 객체의 상태를 묻지말고, 어떻게가 아니라 무엇을 해야하는지 요청
*정리 객체가 어떤 메시지 수신하고 처리할 수 있는냐가 객체의 책임을 결정, 책임 주도 설계 방법은 what/who 사이클에 따라 협력에 참여할 객체를 결정하기 전에 메시지를 먼저 결정 이후에 수신할 후보를 선택
* 꼭 인터페이스 만들라는게 아니고, 메시지가 인터페이스나,상속과 같은 다형성을 구현할 수 있는 중요한 역할을 수행한다~
5.4 객체 인터페이스
> 인터페이스
- 일반적으로 두 사물이 마주하는 경계 지점에서 서로 상호작용 하도록 이어주는 방법이나 장치
ex 텔리비전-리모컨, UI 대상과 상호작요하려면, 인터페이스 사용법을 익혀야함
- 인터페이스의 특징
1. 사용법만 익히면 내부 동작,방식 몰라도 됨
2. 인터페이스 자체 변경이 아닌 내부 변경은 외부에 영향 없음
3. 대상이 변경되더라도 동일한 인터페이스 제공하면 문제 없이 작동
ex 모든 자동차는 동일한 인터페이스 제공, 하나의 인터페이스에 능숙 -> 어떤 자동차라도 운전
- 협력에 참여하는 객체도 인터페이스를 통해 가른 객체와 상호작용한다.
- 메시지가 인터페이스 결정
> 공용 인터페이스
- 외부에서 접근 가능한 인터페이스 (책임-메시지 한 쌍)
- 공용 인터페이스 자극하여 책임을 수행하게 하는 것은 객체에 메시지
- 책임은 메시지 수신 시에 수행할 객체의 행동
> 책임,메시지,인터페이스
- 협력에 참여하는 객체에 책임은 자율적 (행동,상태등으로 구체화)
- 객체의 인터페이스는 객체가 수신할 수 있는 메시지 목록으로 채워진다.
메시지와 메서드의 구분은 객체의 외부,내부를 분리함과 동시에 다형성을 통해 유연성을 부과한다.
- 객체가 메시지를 받기위한 통로인 인터페이스 -> 객체간 협력의 접점 -> 객체가 어떤 메시지를 수신할 수 있느냐가 인터페이스 모양 결정
5.5 인터페이스와 구현의 분리
> 객체 관점에서 생각하는 방법
- 좀 더 추상적인 인터페이스 : 자율적 책임, 추상적 수준의 메시지 수신 인터페이스 만들기
- 최소 인터페이스 : 외부에 사용할 필요가 없는 인터페이스 감춤, 메시지를 먼저 생각하고 객체를 나중에 생각
- 인터페이스와 구현 간 차이를 인식
> 구현
- 객체지향에서 내부 구조와 작동 방식을 가리키는 고유 용어이다.
- 객체를 구성하지만, 공용 인터페이스에 포함되지 않는 모든 것이 구현에 포함된다.
(상태, 행동)
- 외부와 내부를 분리하라는 것은 공용 인터페이스와 구현을 명확하게 분리하라는 것이다.
> 인터페이스와 구현의 분리 원칙
- 객체를 두 개의 분리된 요소로 분할해 설계하자 ( 외부와 내부를 나누자)
- 안전지대(내부) - 위험지대(외부) 나누기
- 메서드의 구현이 수정되더라도 외부에 영향을 미쳐서는 안된다. 객체 외부에 영향을 미치는 것은 공용 인터페이스를 수정했을 때 뿐이다.
> 캡슐화
- 객체의 자율성 보존을 위해 구현을 외부로부터 감추는 것을 의미한다. -> 정보 은닉
-> 상태와 행위의 캡슐화
- 객체는 상태와 행위의 조합, 스스로 상태를 관리 해야한다. 행위와 한쌍 (데이터 캡슐화)
- 데이터 캡슐화의 전제는 인터페이스와 구현을 분리하는 것
-> 사적인 비밀의 캡슐화
- 외부 객체가 내부 상태를 직접 관찰하거나 제어할 수 없도록 특별한 경로만 외부에 노출하자 (공용 인터페이스)
- 공용 인터페이스를 경계로 최대한 자율성을 보장받을 수 있다.
- 외부 객체는 공용 인터페이스에만 의존해야하고 세부 사항에 직접 의존해선 안됨
* 다시 한번 책임을 결정하는 것은 메시지, 자율적인 책임의 특성은 자율 책임을 수행하게 하는 메시지의 특성과 연결된다.
5.6 책임의 자율성이 협력의 품질을 결정한다.
- 객체의 책임이 자율적일 수록 협력이 이해하기 쉬워지고 유연하게 변경할 수 있게 된다.
1. 자율적인 책임은 협력을 단순하게 만든다.
- 충분히 추상적인 메시지를 전달하도록 해서 협력의 과정이 단순해 진다.
2. 자율적인 책임은 객체의 외부와 내부를 명확하게 분리한다.
- 자율적 책임으로 협력의 양상이 다른 객체와의 외부 협력과 객체 스스로 책임을 수행하는 내부 관점으로 분리된다.
- 캡슐화가 되기 때문에 인터페이스와 구현이 분리된다.
3. 자율적인 책임은 내부의 변경이 외부에 영향을 미치지 않는다.
- 자율적 책임으로 인해 변경의 파급효과가 객체 내부로 캡슐화되므로, 객체간 결합도가 낮아진다.
4. 자율적 책임은 협력의 대상을 다양하게 선택할 수 있는 유연성을 제공한다.
5. 책임이 자율적일 수록 객체의 역할을 이해하기 쉬워진다.
- 객체 존재 이유가 명확하게 표현된다.
- 객체들은 동일한 목적을 달성하는 강하게 연관된 책임으로 구성되므로, 객체의 응집도를 높은 상태로 유지하기 쉽다.
*책임이 자율적일수록 추상화되고, 응집도가 높아지고, 결합도는 낮아지며, 캡슐화가 증진되고, 인터페이스 구현이 분리되며, 설계의 유연성과 재사용성이 향상된다.
객체지향의 강력함을 누리기 위한 출발점은 책임을 자율적으로 만드는 것이고, 이는 어떤 메시지를 선택하느냐에 달렸다.
-> 협력의 관계에서 메시지의 강력함은,
메시지가 1. 책임을 결정하고, 객체의 자율성 수준을 결정
-> 자율적인 객체는 책임을 수행하며 인터페이스와 구현을 분리 : 캡슐화 증진
-> 캡슐화 증진으로 내부와 외부가 분리되며 객체 간 결합도가 낮아짐
2. 이러한 효과로 메시지를 통해 송신자와 수신자 결합도가 낮아져 다형성이 가능하게 된다
송신자 입장에서는 해당 메시지를 수신해서 결과만 받으면 됨 ( 수신자의 타입, 메시지 처리 방식은 몰라)
3. 위 두가지 효과 (캡슐화, 다형성 증진) 객체 역할을 이해하기 쉬워지고, 협력의 과정이 단순해지고, 설계가 유연해짐
6. 객체 지도
- 객체지향이 구조와 기능이라는 두 관점을 어떻게 조화시키는 지 설명
- 구조는 기능에 비해 더 안정적이다. 객체지향은 구조안에 기능을 녹여서 변화에 안정적인 소프트 웨어를 만들게 한다.
6.1 기능 설계 대 구조 설계
6.2 두 가지 재료: 기능과 구조
6.3 안정적인 재료 : 구조
6.4 불안정한 재료 : 기능
6.5 재료 합치기 : 기능과 구조의 통합
'언어 > 객체지향' 카테고리의 다른 글
객체 지향과 디자인 패턴 - 다형성과 추상 타입 (0) 2023.08.13 객체지향과 디자인패턴 2 (0) 2023.08.13 객체지향과 디자인패턴 1 (0) 2023.08.11 객체지향의 사실과 오해 2 (0) 2023.08.02 객체지향의 사실과 오해 (0) 2023.08.01