이 책에서는 프로그래밍 패러다임을 다음과 같이 설명한다.그리고 객체지향 또한 프로그래밍 패러다임 중의 하나라고 정의한다.천동설과 지동설이 공존할 수 없듯, 일반적인 패러다임에서 두가지의 패러다임은 공존할 수 없으나, 프로그래밍 패러다임에서는 그렇지 않다.오히려 서로 다
이 장에서는 티켓 판매 어플리케이션 예제를 통해 객체지향의 기본적인 개념에 대해 설명한다.어플리케이션의 간단한 명세는 다음과 같다.이벤트에 당첨된 관람객은 가지고 있는 초대장을 티켓으로 교환한 뒤 입장할 수 있다.그렇지 않은 관람객은 티켓을 구매한 뒤에 입장할 수 있다
대부분의 사람들은 클래스를 결정한 후 클래스에 어떤 속성과 메서드가 필요한지 고민한다. 하지만 진정한 객체지향 패러다임으로의 전환은 클래스가 아닌 객체에 초점을 맞출 때 얻을 수 있다.어떤 클래스가 아닌, 어떤 객체들이 필요한지 고민하라.객체를 독립적인 존재가 아닌
객체지향 패러다임의 관점에서 핵심은 역할, 책임, 협력이다.협력을 구성하기 위해 적절한 객체를 찾고 책임을 할당하는 과정이 구현보다 선행되어야 한다.그렇지 않고 너무 이른시기에 구현에 초점을 맞추는 것은 변경하기 어렵고 유연하지 못한 코드를 낳는 원인이 된다.협력은 어
객체지향 커뮤니티에서는 오랜 기간동안 좋은 설계의 특징을 판단할 수 있는 기준에 관한 다양한 논의가 있어왔다.객체를 사용하면 변경 가능성이 높은 부분은 내부에 숨기고 외부에는 상대적으로 안정적인 부분만 공개함으로써 변경의 여파를 통제할 수 있다.변경될 가능성이 높은 부
데이터 중심 설계에서 책임 중심의 설계로 전환하기 위해서는 다음의 두 가지 원칙을 따라야 한다.이전 장에서 언급된 것 처럼, 데이터에 초점을 맞추게 되면 객체의 캡슐화가 약화되면서 낮은 응집도와 높은 결합도를 가진 객체들로 넘쳐나게 된다.책임 중심의 설계에서는 "이 객
객체가 수신하는 메시지들이 객체의 퍼블릭 인터페이스를 구성한다.훌륭한 퍼블릭 인터페이스를 얻기 위해서는 유연하고 재사용 가능한 퍼블릭 인터페이스를 만드는데 도움이 되는 설계 원칙과 기법을 익히고 적용해야 한다.메시지는 오퍼레이션명과 인자로 구성되며 메시지 전송은 여기에
한번에 다뤄야 하는 정보의 수를 줄이기 위해 본질적 정보 외의 불필요한 세부사항을 걸러내면 문제를 단순화할 수 있다.이를 추상화 라고 한다.가장 일반적인 추상화 방법은 한번에 다뤄야 하는 문제의 크기를 줄이는 것이다.이처럼 큰 문제를 해결가능한 작은 문제로 나누는 작업
협력은 필수적이지만 과도한 협력은 설계를 곤경에 빠뜨릴 수 있다. 다른 객체와의 협력을 위해서는 자연히 객체간 의존성이 생겨난다.그리고 과도한 의존성은 애플리케이션을 수정하기 어렵게 만든다.객체지향 설계의 핵심은 협력을 위해 필요한 의존성은 유지하면서도 변경을 방해하
"소프트웨어 개체(클래스, 모듈, 함수 등)는 확장에 대해 열려있어야 하고 수정에 대해서는 닫혀 있어야 한다."확장에 대해 열려있다 : 애플리케이션의 요구사항이 변경될 때 이 변경에 맞게 새로운 '동작'을 추가해서 애플리케이션 기능을 확장할 수 있다.수정에 대해 닫혀있
중복 코드는 변경을 방해한다.중복 코드는 코드를 수정하는데 필요한 노력을 몇 배로 증가시킨다.중복 여부를 판단하는 기준은 변경이다.요구사항이 변경됐을 때 두 코드를 함께 변경해야 한다면 중복이다.모양이 유사하다는 것 만으로 중복은 아니다.신뢰할 수 있고 수정하기 쉬운
상속과 합성은 재사용의 대상이 다르다.상속은 부모 클래스 안에 구현된 코드 자체를 재사용하지만 합성은 포함되는 객체의 퍼블릭 인터페이스를 재사용한다.상속대신 합성을 사용하면 구현에 대한 의존성을 인터페이스에 대한 의존성으로 변경할 수 있다.상속으로 인해 결합도가 높아지
상속의 첫번째 용도는 타입 계층을 구현하는 것이다. 부모 클래스는 일반적인 개념을, 자식 클래스는 특수한 개념을 구현한다.두 번째 용도는 코드 재사용이다. 상속은 간단한 선언만으로 부모 클래스의 코드를 재사용할 수 있게 한다. 상속을 사용하는 일차적인 목표는 코드
객체는 협력을 위해 존재한다. 협력은 객체가 존재하는 이유와 문맥을 제공한다. 객체지향 설계의 목표는 적절한 책임을 수행하는 객체들의 협력을 기반으로 결합도가 낮고 재사용 가능한 코드 구조를 창조하는 것이다.유사한 요구사항을 계속 추가해야 하는 상황에서 각 협력이