8장 - HONGDAE-OBJECT/OOP GitHub Wiki
8 의존성 관리하기
8.1 의존성 이해하기
의존성 : 객체와 객체 간의 협력
과도한 의존성 -> 앱 수정 어려움
실행 시점 : 의존하는 객체가 정상적으로 동작하기 위해서는 실행 시에 의존 대상 객체가 반드시 존재해야 한다.
구현 시점 : 의존 대상 객체가 변경될 경우 의존하는 객체도 함께 변경된다.
UML
- PeriodCondition --> DiscountCondition : 실체화 관계
- PeriodCondition --> Screening : 의존 관계
- PeriodCondition --> DayOfWeek : 연관 관계
:star: 의존성 전이 : 의존하고 있는 객체가 다른 객체에 의존하는 경우 자동적으로 다른객체에 의존하게 된다.
- 의존성은 함께 변경될 수 있는 가능성을 의미, 모든 경우에 의존성이 전이 되는것은 아니다.
- 직접 의존성, 간접 의존성(의존성 전이)
- 컴파일 타임 의존성 : 코드 작성 시점
- 런타임 의존성 : 실행 시점
- 컴파일 타임 구조와 런타임 구조 사이의 거리가 멀수록 설계가 유연해지고 재사용 가능해진다.
컨텍스트 독립성 : 클래스가 될 특정한 문맥에 대해 최소한의 가정만으로 이뤄져 있다면 다른 문맥에서 재사용하기가 더 수월해진다.
:star: 의존성 해결하기(컴파일 의존성 -> 런타임 의존성으로 교체)
- 객체를 생성하는 시점에 생성자를 통해 의존성 해결
- 객체 생성 후 setter 메서드를 통해 의존성 해결
- 메서드 실행시 인자를 이용해 의존성 해결
8.2 유연한 설계
- 의존성의 정도는 문제가 된다.
- 의존성를 바람직하게 만든다.
- 바람직한 의존성 : 재사용성 높음 -> 느슨한 결합도
- 느슨한 결합도를 위해서는 협력 대상의 필요한 정보 외에는 최대함 감춘다. -> 추상화
추상화 : 어뗜 양상, 세부사항 구조를 좀더 명확하게 이해하기 위해 특정 절차나 물체를 의도적으로 생략하거나 감춤으로써 복잡도를 극보하는 방법이다.
- 구체 클래스 의존성
- 추상 클래스 의존성
- 인터페이스 의존성
[결합도 높음] 구체 > 추상 > 인터페이스 [결합도 낮음]
- 명시적인 의존성 (주입)
- 숨겨진 의존성 (내부생성)
:star: new는 해롭다.
- 구체 클래스의 이름을 직접 기술해야 한다. 따라서 클라이언트는 추상화가 아닌 구체 클래스에 의존 할수 밖에 없기 때문에 결합도 상승
- 생성하려는 구체 클래스뿐만 아니라 어떤 인자를 이용해 클래스의 생성자를 호출해야 하는지도 알아야 한다. 따라서 클라이언트가 알아야하는 지식양 증가, 결합도 상승
new를 사용하는 경우가 유용한 경우가 있다. (설계에 따라 다름)
[해결방법] => 인스턴스 생성과 사용을 분리
- 표준클래스에 대한 의존은 해롭지 않다.
유연하고 재사용 가능한 설계는 작은 객체들의 행동을 조합함으로써 새로운 행동을 이끌어낼 수 있는 설계이다.
객체지향 설계란 객체가 어떻게 하는지를 표현하는 것이 아니라 객체들의 조합을 선언적으로 표현함으로써 객체 들이 무엇을 하는지를 표현 하는 설계이다.
핵심은 의존성 관리