목록기술서적/오브젝트 (6)
경주장
상속의 관점에서 다형성이 구현되는 기술적인 메커니즘을 살펴보자. 다형성이 런타임에 메시지를 처리하기에 적합한 메서드를 동적으로 탐색하는 과정을 통해 구현되며, 상속은 이런 메서드를 찾기 위한 일종의 탐색 경로를 클래스 계층의 형태로 구현하기 위한 방법이다. 내용은 기술적이지만 문체가 상당히 담백하게 느껴져서 크게 와닿는다. 이전 장에서 부주의한 상속의 문제점을 꾸준히 언급한것에 이어서 계속해서 같은 목소리를 다형성의 측면에서 재조명한다. 01 다형성 a. 오버로딩 다형성 클래스 내에서 하나의 메시지(메서드 명)가 여러 메서드를 가지는 경우를 일컫는다. b. 강제 다형성 동일한 연산자를 다양한 타입에 사용할 수 있는 방식을 가리킨다. c. 매개변수 다형성 - 제네릭 프로그래밍에서 클래스의 인스턴스 변수나 ..
상속 관계는 is-a 관계라고 부르고 합성 관계는 has-a 관계라고 부른다. 처음 해당 용어를 들었을 때에는 헷갈리고 와닿지 않았는데 책을 읽다보니 조금 정리가 되는 듯 하다. 상속 관계는 1대1로 발생하며 부모와 자식의 관계가 strict하게 딱 정해지는 효과가 있어 "is-a"와 같은 단정적인 표현이 어울리고 합성 관계는 1대 다로 발생하며 표현 자체도 딱 composite하게 인자로서 "has a"하는 느낌이 나는 듯 하다. 그리고 "has a" 는 "is a"보다는 아무래도 더 유연한 느낌이 든다. 상속 - 클래스 사이의 정적인 관계 합성 - 객체 사이의 동적인 관계 - 즉, 런타임에 동적으로 변경 할 수 있다. 상속을 합성으로 바꾸면 상속이 초래하는 세 가지 문제점을 해결 할 수 있다. 상속에..
DRY 원칙 = Don't Repeat Yourself = Once and Only Once 원칙 = 모든 지식은 시스템 내에서 단일하고, 애매하지 않고 정말로 믿을 만한 표현 양식을 가져야 한다. 중복 코드는 코드 수정에 필요한 노력을 몇 배로 증가시킨다. 중복과 변경 Call에는 통화의 시작시간, 끝 시간을 저장하는 LocalDateTime 변수가 두개 있고 Phone은 List calls를 가지며 전화요금을 계산해야 하는 상황을 고려해보자. 가장 간단한 구현 방법은 위와 같은 Class 구조이다. 1. 밤 10시 이후의 통화에 대해 요금을 할인 해주는 방식을 추가해야 한다는 요구사항이 접수됐다. a. 클래스 도입 이를 위와 같은 방식으로 구현하는 것은 옳지 않다. Phone과 NightlyDisco..
개방-폐쇄 원칙 (Open-Closed Principle, OCP) 소프트웨어 개체는 확장에 대해 열려있고, 수정에 대해서는 닫혀 있어야 한다. 컴파일타임 의존성을 고정시키고 런타임 의존성을 변경하라. OCP의 핵심 = 추상화에 의존하는 것 변하지 않는 것이 무엇인지를 이해하고 옳바른 추상화를 신중히 결정하자 생성 사용 분리 의존관계를 외부에 명시적으로 드러내라 Factory 추가 생성만을 전문으로 하는 Factory에게 구체 Class 선택의 결정권을 주고 생성을 담당하게 하라 생성된 객체를 사용하는 Client는 Factory에의해 생성된 객체를 이용해 Method를 실행한다. 의존성 주입 (Dependency Injection) 외부의 독립적인 객체가 인스턴스를 생성한 후 이를 전달해서 의존성을 해..
의존성과 결합도 의존성 자체는 객체사이의 협력을 위해 필수적이다. 하지만 너무 높은 의존성은 유연함을 막아 재사용 할 수 없는 클래스설계로 이어진다. 바람직한 의존성 (= 약한 결합도 )은 재사용성과 관련이 있다. 바람직한 의존성 (= 약한 결합도 )은 컨텍스트에 독립적인 의존성을 의미한다. 지식이 결합을 낳는다. : 하위 클래스에 대한 정보를 알변 알수록 강하게 결합된다. => 추상화에 의존하라! 아래 쪽으로 갈 수록(객체가 추상화 될 수록) 클라이언트가 알아야 하는 지식의 양이 적어지고 결합도가 느슨해진다. 구체 클래스 의존성(concrete class dependency) 추상 클래스 의존성(abstract class dependency) 인터페이스 의존성(interface dependency) 의..
.잘 설계된 객체지향 애플리케이션은 작고 응집도 높은 객체들로 구성된다. .작은 객체들은 단독으로 수행 할 수 있는 작업은 제한적이며 서로 협력해야 한다. .다른 객체들이 존재한다는 것, 자신이 다른 객체에게 어떤 메시지를 보낼 수 있는가를 미리 알고 있어야 하고 이런 지식이 객체 사이의 의존성을 낳는다. 의존성은 단뱡향성을 가진다. 의존성은 변경에 의한 영향의 전파 가능성을 암시한다. 실행 시점/구현 시점 의존성의 차이 - 실행 시점 : foward한 의존성을 의미한다. - 구현 시점 : backward한 영향을 의미한다. -> 둘 모두 foward한 의존성의 존재 아래 필연적으로 발생하는 상황이다 (의존성 자체는 단방향) 예를 들어 위와 같은 의존 관계에서 실행 시점에 MemberService객체는 ..