객체지향은 클래스가 아닌 객체에 초점을 맞춰야 한다. 캡슐화를 통해 데이터와 기능을 객체 내부로 숨기는데, 객체를 자율적인 존재로 만들기 위해서다...
메시지 전송은 객체 사이의 협력을 위해 사용할 수 있는 유일한 수단이다. 객체는 다른 객체의 상세한 내부 구현에 직접 접근할 수 없기 때문에 오직 메시지 전송을 통해서만 자신의 요청을 전달할 수 있다.메시지를 수신한 객체는 메서드를 실행해 요청에 응답한다. 자신이 할
GRASP 패턴을 이해하고 나면 응집도와 결합도, 캡슐화 같은 다양한 기준에 따라 책임을 할당하고 결과를 트레이드오프할 수 있는 기준을 알게 된다.책임 중심의 설계로 전환하기 위해서는 다음의 두 가지 원칙을 따라야 한다.데이터보다 행동을 먼저 결정하라협력이라는 문맥 안
책임을 할당하는 작업이 응집도와 결합도 같은 설계 품질과 깊이 연관돼 있다는 것이다. (SOLID원칙에 의하면, 단일책임원칙은 높은 응집도와 낮은 결합도를 만들어 낸다)결합도와 응집도를 합리적인 수준으로 유지하려면 객체의 상태가 아니라 객체의 행동에 초점을 맞춰야 한다
객체가 다른 객체에게 접근할 수 있는 유일한 방법은 메시지를 전송하는 것 뿐이다.메시지는 객체의 타입에 따라 실행되는 메서드가 달라질 수 있다. 반면 메서드는 코드의 의미가 컴파일 시점과 실행 시점에 동일하다. 메시지와 메서드의 구분은 메시지 전송자와 메시지 수신자가
하향식 기능 분해는 시스템을 최상위의 가장 추상적인 메인 함수로 정의하고, 메인 함수를 구현 가능한 수준까지 세부적인 단계로 분해하는 방법이다. 하향식 기능 분해 방식으로 설계한 시스템은 메인 함수를 루트로 하는 ‘트리’로 표현할 수 있다. 하향식 기능 분해는 다음과
협력을 위해서는 의존성이 필요하지만 과도한 의존성은 애플리케이션을 수정하기 어렵게 만든다. 객체지향 설계의 핵심은 협력을 위해 필요한 의존성은 유지하면서도 변경을 방해하는 의존성은 제거하는 데 있다.의존성은 실행시점과 구현시점에 서로 다른 의미를 가진다.실행시점 : 의
소프트웨어 개체(클래스, 모듈, 함수 등)는 확장에 대해 열려 있어야 하고, 수정에 대해서는 닫혀 있어야 한다.개방-폐쇄 원칙은 컴파일타임 의존성은 유지하면서 런타임 의존성의 가능성을 확장하고 수정할 수 있는 구조라고 할 수 있다.추상화개방-폐쇄 원칙의 핵심은 추상화의
중복코드는 변경을 방해한다. 이것이 중복 코드를 제거해야 하는 가장 큰 이유이다. 요구사항이 변경됐을 때 두 코드를 함께 수정해야 한다면 이 코드는 중복이다.DRY는 '반복하지 마라'라는 뜻의 Don't Repeat Yourself로 동일한 지식을 중복하지 말라는 것이
상속에서 부모 클래스와 자식 클래스 사이의 의존성은 컴파일타임에 해결되지만 합성에서는 런타임에 해결된다. 상속관계는 is-a 관계라고 부르고 합성관계는 has-a관계라고 부른다.합성은 구현에 의존하지 않는다는 점에서 상속과 다르다. 내부에 포함되는 객체의 구현이 아닌
상속의 목적은 코드 재사용이 아니고 타입 계층을 구조화하기 위해 사용해야 한다.컴퓨터 과학에서는 다형성을 하나의 추상 인터페이스에 대해 코드를 작성하고 이 추상 인터페이스에 대해 서로 다른 구현을 연결할 수 있는 능력을 말한다.다형성은 여러가지로 분류할 수 있지만 객체
상속의 두 가지 용도타입 계층 안에서 부모 클래스는 일반적이 개념을 구현하고 자식 클래스는 특수한 개념을 구현한다.코드의 재사용이다. 그러나 재사용을 위해 상속을 사용할 경우 부모와 자식 클래스가 강하게 결합되는 문제가 있다.동일한 메시지에 대해 서로 다르게 행동할 수
재사용을 위해서는 객체들의 협력 방식을 일관성 있게 만들어야 한다. 일관성 있는 설계가 가져다 주는 더 큰 이익은 코드가 이해하기 쉬워진다는 것이다. 유사한 기능을 서로 다른 방식으로 구현해서는 안된다. 객체지향에서 기능을 구현하는 유일한 방법은 객체 사이의 협력을