<객체지향의 사실과 오해> 1장 리뷰
- 객체지향의 목표는 실세계의 모방이 아닌 새로운 세계의 창조
- SW 개발자의 역할은 실세계의 모방이 아닌 고객과 사용자를 만족시킬 수 있는 신세계의 창조
- 객체지향의 '협력' : 특정한 ‘책임’을 수행하는 ‘역할’들 간의 연쇄적인 ‘요청’과 ‘응답’을 통해 목표를 달성하는 과정
- 시스템은 각자의 ‘역할’과 ‘책임’을 수행하는 객체로 분할 가능함
- 시스템의 기능은 객체간의 연쇄적인 요청과 응답의 흐름으로 구성된 ‘협력’으로써 구현됨
- 객체지향 설계는 적절한 객체에게 적절할 책임을 할당하는 것에서 시작됨
- 책임 : 객체지향 설계의 품질을 결정하는 가장 중요한 요소
- 역할은 관련성 높은 책임의 집합
- 역할이라는 단어는 의미적으로 책임이라는 개념을 내포
- 특정한 역할은 특정한 책임을 암시
- 객체의 역할이 가지는 특징
- 여러 객체가 동일한 역할을 수행할 수 있다.
- 역할은 대체 가능성을 의미한다.
- 각 객체는 책임을 수행하는 방법을 자율적으로 선택할 수 있다.
- 하나의 객체가 동시에 여러 역할을 수행할 수 있다.
- 역할은 유연하고 재사용 가능한 협력 관계를 구축하는 데 중요한 설계 요소
- 대체 가능한 역할과 책임은 객체지향 패러다임의 다형성과도 깊이 연관됨
- 객체지향 애플리케이션의 아름다움을 결정하는 것이 협력이라면 얼마나 조화를 이루는지를 결정하는 것은 객체
- 객체가 갖춰야하는 덕목
- 충분히 협력적 : 다른 객체의 명령에 복종하는 것이 아닌 요청에 대한 응답을 결정할 뿐
- 충분히 자율적 : 요청에 따라 스스로 판단하고 행동하여 응답을 도출
- 객체가 협력 과정 속에서 자율적인 존재로 남기 위해서는 필요한 행동과 상태를 지니고 있어야 함
- 자율성을 위해서는 객체의 내외부를 명확히 구분해야 함
- 객체 내부 : 객체 스스로 관리하여 외부 간섭이 일체 차단되어야 함
- 객체 외부 : 접근을 허용한 수단을 통해서만 객체와 의사소통해야 함
- '무엇(What)'을 수행하는지는 알 수 있지만 '어떻게(How)' 수행하는지는 알 수 없어야 함
- 자율적인 객체로 구성된 공동체를 통해 유지보수가 쉽고 재사용이 용이한 시스템을 구축할 수 있음
- 객체지향의 세계에서 객체들은 오로지 '메세지(Message)'를 통해 소통
- 객체들을 자신의 책임을 다하기 위해 다른 객체에 메세지로 도움을 요청할 수 있음
- 송신자(Sender) : 메세지 송신 객체
- 수신자(Receiver) : 메세지 수신 객체
- 메세지를 수신한 객체는 자신만의 방법, '메서드(Method)'에 따라 메세지를 처리
- 객체지향 프로그래밍 언어에서 메서드는 클래스 내 함수 또는 프로시저를 통해 구현됨
- 수신자는 런타임에 메서드를 선택 가능 -> 객체지향 언어와 절차지향 언어의 차이점
- 외부 요청인 메세지와 요청 처리 방법인 메서드의 분리를 통해 객체들의 자율성이 증진됨
- 객체지향 패러다임의 캡슐화(Encapsulation) 개념과 깊이 관련됨
- 객체지향이란 무엇인가?
- 객체지향이란 시스템을 상호작용하는 자율적인 객체들의 공동체로 바라보고 객체를 이용해 시스템을 분할하는 방법
- 자율적인 객체란 상태와 행위를 함께 지니며 스스로 자기 자신을 책임지는 객체를 의미한다.
- 객체는 시스템의 행위를 구현하기 위해 다른 객체와 협력한다. 각 객체는 협력 내에서 정해진 역할을 수행하며 역할은 관련된 책임의 집합이다.
- 객체는 다른 객체와 협력하기 위해 메시지를 전송하고, 메시지를 수신한 객체는 메시지를 처리하는 데 적합한 메서드를 자율적으로 선택한다.
- 현재의 객체지향 세계에서 '클래스(Class)'는 에스키모인들의 '눈(Snow)'과 유사
- 클래스는 객체지향 세계의 도시전설
- 객체지향 선구자들의 초기 의도와 달리 대부분의 사람들은 객체지향을 클래스를 지향하는 것으로 생각
- 다양한 프로그래밍 언어와 관련 서적을 통해 클래스의 중요성이 과도하게 강조됨
- 많은 사람들이 객체지향이라는 단어에서 클래스를 연상하는 상황
- 클래스의 정의, 상속, 클래스 다이어그램, 객체지향 분석/설계의 목적(훌륭한 클래스의 식별)
- 결과적으로, 사람들은 객체지향의 중심에 있어야 할 객체로부터 멀어짐
- 클래스가 객체지향 프로그래밍 언어의 매우 중요한 구성요소(Construct)이나, 중심 개념은 아님
- 프로토타입(Prototype) 기반 객체지향 언어 : 자바스크립트 등
- 상속은 클래스가 아닌 객체 간 위임(Delegation) 메커니즘에 기반
- 클래스는 객체들의 협력 관계를 코드로 옮기는 도구에 불과
- 협력에 참여하는 객체들을 만드는데 필요한 구현 메커니즘
- 클래스를 강조하는 프로그래밍 언어적 관점은 객체의 캡슐화를 저해하고 클래스의 결합도를 높임
- 유연하고 확장 가능한 애플리케이션의 구축이라는 객체지향 패러다임에 위배됨