1. 협력하는 사람들
📍 커피 공화국의 아침
역할, 책임, 협력이 모든 곳에 존재
예) 카페에서
- 캐시어: 손님에게 커피가 준비됐음을 알리는 역할
- 손님: 커피를 받아서 돌아가는 역할
📍 요청과 응답으로 구성된 협력
요청
- 손님 -> 캐시어: 커피 주문 요청
- 캐시어 -> 바리스타: 커피 제조 요청
응답
- 바리스타 -> 캐시어: 커피 제조 완료 응답
- 캐시어 -> 손님: 커피 준비 완료 응답
📍 역할과 책임
역할: 어떤 협력에 참여하는 특정한 사람이 협력 안에서 차지하는 책임이나 임무
예)
- 손님: 커피를 주문하는 임무
- 캐시어: 손님으로부터 주문을 받는 임무
- 바리스타: 주문된 커피를 제조할 책임
역할은 책임을 내포
- 예) 범죄자를 검거할 책임을 거부하면 경찰이 아니다
역할의 특징 4가지
1) 여러 사람이 동일한 역할을 수행할 수 있다
- 손님은 어떤 캐시어가 주문을 받는지 상관없음(캐시어의 역할 수행만 잘 하면 아무나 됨)
2) 역할을 대체 가능성을 의미
- 손님 입장에서 캐시어는 대체 가능함(substitutable)
3) 책임을 수행하는 방법은 자율적으로 선택할 수 있다
- 바리스타가 커피 만드는 순서나 방법을 다르게 할 수 있다. 결과물만 제대로 나오면 됨
- 다형성(polymorphism): 동일한 요청에 대해 서로 다른 방식으로 응답하는 능력
4) 한 사람이 동시에 여러 역할을 수행할 수 있다
- 한 사람이 캐시어도 하고 바리스타도 할 수 있음
2. 역할, 책임, 협력
📍 기능을 구현하기 위해 협력하는 객체들
앞선 카페 예시에서
사람→객체,
요청→메시지,
요청 처리 방법→메서드 로 바꾸면 객체지향 개념이 완성됨
📍 역할과 책임을 수행하며 협력하는 객체들
- 애플리케이션의 기능은 책임 단위로 잘게 쪼개져 분할됨
- 책임은 적절한 역할을 수행할 수 있는 객체에 의해 수행됨
시스템
- 역할과 책임을 수행하는 객체들로 구성됨
시스템의 기능
- 객체간의 연쇄적인 요청과 응답의 흐름으로 구성된 협력으로 구현됨
객체지향 설계
- 적절한 객체에게 적절한 책임을 할당하는 것에서 시작
- 책임을 명확하게 하는것이 중요
객체의 역할 특징 4가지
1) 여러 객체가 동일한 역할을 수행할 수 있다
2) 역할은 대체 가능성을 의미
3) 각 객체는 책임을 수행하는 방법(메서드)를 자유롭게 선택 가능
4) 하나의 객체가 동시에 여러 역할을 수행할 수 있다
3. 협력 속에 사는 객체
객체의 덕목
1) 객체는 협력적이어야 한다
- 혼자 모든 것을 해결하는 전지전능한 객체는 필요 없다
2) 객체는 자율적이어야 한다
- 협력에 참여하는 방법을 스스로 결정할 만큼 자율적이어야 함
- 객체의 사적인 부분은 외부에서 간섭하면 안됨
📍 상태와 행동을 함께 지닌 자율적인 객체
객체의 정의
- 상태(state)와 행동(behavior)을 함께 지닌 실체
- 상태와 행위를 하나의 단위로 묶는 자율적인 존재
전통적인 개발 vs 객체지향 개발
- 과거의 전통적인 개발 방법은 데이터와 프로세스를 엄격하게 구분
- 객체지향에서는 데이터와 프로세스를 객체라는 하나의 틀 안에 함께 묶음으로써 객체의 자율성 보장
📍 협력과 메시지
메시지
- 객체지향에서의 의사소통 방법
📍메서드와 자율성
메서드
- 객체가 수신된 메시지를 처리하는 방법
- 객체지향 프로그래밍 언어에서 메서드는 클래스 안에 포함된 함수 또는 프로시저를 통해 구현됨
📍 객체지향 언어 vs 절차적 언어
- 객체지향에서는 메시지를 수신한 객체가 런타임에 메서드를 선택할 수 있음
- 절차적 언어에서는 프로시저 호출에 대한 실행 코드를 컴파일 시간에 결정
4. 객체지향의 본질
- 객체지향: 시스템을 상호작용하는 자율적인 객체들의 공동체로 바라보고, 객체를 이용해 시스템을 분할하는 방법
- 자율적인 객체: 상태와 행위를 함께 지니며, 스스로 자기 자신을 책임지는 객체
- 객체는 시스템의 행위를 구현하기 위해 다른 객체와 협력. 각 객체는 협력 내에서 정해진 역할을 수행하며 역할은 관련된 책임의 집합
- 객체는 다른 객체와 협력하기 위해 메시지를 전송하고, 메시지를 수신한 객체는 메시지를 처리하는데 적합한 메서드를 자율적으로 선택
📍 객체를 지향하라
- 클래스는 객체들의 협력 관계를 코드로 옮기는 도구에 불과
- 객체지향의 핵심은 적절한 책임을 수행하는 역할 간의 유연하고 견고한 협력 관계를 구축하는 것. 클래스의 구조와 메서드가 아니라 객체의 역할, 책임, 협력에 집중해야 함