조영호 님의 "오브젝트" 책을 정리한 글입니다.
1. 협력
영화 예매 시스템 돌아보기
- 기능을 완성하기 위해 다앙한 객체들이 메시지를 주고받으면서 상호작용함
협력
- 애플리케이션이 기능을 구현하기 위해 객체 간의 상호작용을 수행하는 과정
요소 | 설명 |
메시지 전송 | 객체 간 협력을 위한 커뮤니케이션 수단 |
메서드 | 객체가 메시지를 수신하면 실행하여 요청에 응답 |
캡슐화 |
객체가 자율적으로 작업을 수행하기 위해 내부 구현을 숨김
|
객체의 역할
개념 | 설명 |
책임 | 객체가 협력에 참여하기 위해 수행하는 행동 |
역할 | 객체들이 협력 안에서 수행하는 책임들의 집합 |
협력이 설계를 위한 문맥을 결정한다
객체의 상태와 행동을 어떤 기준으로 결정해야 하는가?
요소 | 설명 |
행동 | 객체가 참여하는 협력에 의해 결정됨 (객체가 필요한 이유와 행동의 동기를 제공) |
상태 | 객체의 행동 수행에 필요한 정보에 따라 결정됨 (행동이 상태를 정의함) |
- 즉, 협력은 객체를 설계하는데 필요한 문맥을 제공함
2. 책임
책임이란 무엇인가
- 객체가 협력에 참여하기 위해 수행하는 행동
책임 할당
객체지향에서 가장 중요한 요소
- 책임을 적절하게 할당하는 것이 설계의 전체적인 품질을 결정함
정보 전문가 패턴
- 책임을 수행하는데 필요한 정보를 가장 잘 알고 있는 전문가에게 맡기는 것
- 올바른 책임 할당을 위해 협력의 문맥을 먼저 정의해야 함
책임 주도 설계
- 책임을 찾고 책임을 수행할 적절한 객체를 찾아 책임을 할당하는 방식으로 협력을 설계하는 방법
과정
- 시스템이 사용자에게 제공하는 기능을 시스템이 담당할 하나의 책임으로 두기
- 해당 책임을 더 작은 책임으로 분해하고 적절한 객체에게 할당
- 단, 모든 책임 할당과정이 해당 정보 전문가에게 할당되지 않음
- 결합도, 응집도 측면에서 다른 객체에 책임을 할당하는 경우가 더 적절한 경우도 있음
- 협력에 참여할 정보전문가 객체간의 인터페이스 구성
- 시스템의 최종적인 결과물은 인터페이스와 오퍼레이션 목록
메시지가 객체를 결정한다
- 책임을 할당하는데 먼저 필요한 메시지부터 식별하기
- 메시지를 처리할 객체를 나중에 선택
- 즉, 메시지가 객체를 선택해야 함
장점
장점 | 설명 |
최소한의 인터페이스 유지 | 객체가 꼭 필요한 메시지만 가지게 됨 |
추상적인 인터페이스 구성 가능 |
"어떻게"가 아니라 "무엇을 수행할지"에 초점을 맞춤
(무엇을 수행할지에 초점을 맞출 수 있음) |
유연한 설계 가능 | 객체 설계를 유연하게 하여 유지보수가 쉬워짐 |
행동이 상태를 결정한다
구분 | 데이터 주도 설계 (Data-Driven Design) |
책임 주도 설계 (Responsibility-Driven Design)
|
초점 | 객체의 상태에 집중 | 객체의 행동(책임) 에 집중 |
설계 방식 | 상태를 먼저 정의하고 필요한 행동을 결정 | 협력을 고려하면서 객체의 책임을 먼저 정의 |
캡슐화 | 저하됨 (내부 구현이 인터페이스에 노출) |
강화됨 (구현을 감추고 메시지를 중심으로 설계)
|
변경의 전파 | 내부 상태 변경 시 인터페이스도 변경됨 → 유지보수 어려움 |
구현을 뒤로 미루고 협력을 먼저 고려 → 유연한 설계 가능
|
객체 설계 접근법 | 데이터를 중심으로 설계 | 객체 간 협력을 중심으로 설계 |
3. 역할
역할과 협력
- 역할: 객체가 어떤 특정한 협력 안에서 수행하는 책임의 집합
- 협력 모델링: 특정한 객체가 아니라 역할에게 책임을 할당한다고 생각하는게 좋음
유연하고 재사용 가능한 협력
역할을 활용한 협력
개념 | 설명 |
유연성과 재사용성 확보 |
역할을 정의하면 객체를 변경하지 않고 협력을 확장 가능
|
역할을 중심으로 협력 구성 |
메시지에 응답할 수 있는 대표자를 고려하면 협력을 통합할 수 있음
|
추상화 활용 |
역할이 서로 다른 구체적인 객체들을 포괄하여 코드 중복 제거
|
유연한 협력 가능 |
새로운 협력을 추가하지 않고도 객체만 추가하면 확장 가능
|
객체 대 역할
구분 | 객체 (Object) | 역할 (Role) |
정의 | 특정 책임을 수행하는 하나의 실체 | 책임을 수행할 수 있는 자리 (어떤 객체든 이 역할을 수행할 수 있으면 그 자리에 들어갈 수 있음) |
사용 조건 | 협력에서 한 종류의 객체만 참여할 경우 | 협력에서 여러 종류의 객체가 참여할 경우 |
유연성 | 특정 객체에 고정됨 | 다양한 객체가 역할을 수행할 수 있어 확장 가능 |
예시 | "User" 객체가 로그인 기능 수행 | "로그인 가능한 역할"을 여러 객체가 수행 (ex. User, Admin) |
역할과 추상화
배우와 배역
'Code > OOP' 카테고리의 다른 글
[오브젝트] 5. 책임 할당하기 (0) | 2025.04.03 |
---|---|
[오브젝트] 4. 설계 품질과 트레이드오프 (0) | 2025.04.03 |
[오브젝트] 2. 객체지향 프로그래밍 (1) | 2025.04.02 |
[객체지향의 사실과 오해] 2. 이상한 나라의 객체 (1) | 2025.04.02 |
[객체지향의 사실과 오해] 1. 협력하는 객체들의 공동체 (0) | 2025.04.02 |