조영호님의 책 오브젝트를 보며 정리한 내용입니다.
문제가 될 시 해당글 삭제하겠습니다.
[의존성 이해하기]
변경과 의존성
- 실행 시점 : 의존하는 객체가 정상적으로 동작하기 위해서는 실행 시에 의존 대상 객체가 반드시 존재해야 한다.
- 구현 시점 : 의존 대상 객체가 변경된 경우 의존하는 객체도 함께 변경된다.
- 의존성은 방향성을 가지며 그 방향성은 항상 단방향이다.
- 객체가 의존하고 있는 객체가 의존하는 객체는 모두 의존관계이다.(의존성 전이)
- 직접 의존성 : 코드 안에서 명시적으로 드러나는 경우
- 간접 의존성 : 코드 안에서 명시적으로 드러나지 않는 경우
런타임 의존성과 컴파일타임 의존성
- 객체지향 어플리케이션에서 런타임에 주인공은 객체이다.
- 컴파일 타임에 주인공은 클래스이다.
- 중요한 것은 런타임 의존성과 컴파일 타임의 의존성을 다를 수 있고, 달라야 유연하고 재사용 가능한 코드를 만들 수 있다.
컨텍스트 독립성
- 클래스가 특정 문맥에 강하게 결합될수록 다른 문맥에서 사용하지는 더 어려워진다.
- 클래스가 사용될 특정한 문맥에 대해 최소한의 가정만으로 이뤄져 있다면 다른 문맥에서 재사용하기가 더 수월해진다
- 이를 '컨텍스트 독립성' 이라고 부른다!
의존성 해결
- 의존성을 해결하는 방법은 생성자 / setter / 메서드 인자 를 통한 방법이 있다.
- 이 중 가장 좋은 방법은, 생성자와 setter 를 함께 사용하는 방법이다.
[유연한 설계]
의존성과 결합도
- 의존성이 무조건 적으로 나쁜것은 아니다, 협력의 측면에서 의존성은 필수적이며, 긍정적이다.
- 의존성이 부정적일 때는, 그 정도가 과할 때 인것이다.(강한 or 단단한 결합도)
- 바람직한 의존성은 재사용성이 높을 때를 말한다!
자식이 결합을 낳는다.
- 더 많이 알수록 더 많이 결합된다.(인터페이스보다 인스턴스에 직접 의존할 때 단단하게 결합된다)
추상화에 의존하라.
- 추상화 : 어떤 양상, 세부사항, 구조를 좀 더 명확하게 이해하기 위해 특정 절차나 물체를 의도적으로 생략하거나, 감춤으로써 복잡도를 극복하는 방법!
- 일반적인 의존 대상의 구분
- 구체 클래스 의존성
- 추상 클래스 의존성
- 인터페이스 의존성
=> 의존하는 대상이 더 추상적일수록 결합도는 더 낮아진다!
new는 해롭다
- new 연산자를 잘못 사용하게 되면 결합도가 극단적으로 높아지게 된다.
- 이유
- new 연산자를 사용하기 위해 구체 클래스의 이름을 직접 기술해야 하는데,
추상화가 아닌 구체 클래스에 의존할 수 밖에 없기 때문에 의존성이 높아진다. - new 연산자는 구체 클래스 뿐 아니라 사용되는 인자 또한 알게 되는데,
이를 통해 클라이언트가 알아야 하는 지식이 늘어나기 때문에, 의존성이 높아진다.
- new 연산자를 사용하기 위해 구체 클래스의 이름을 직접 기술해야 하는데,
- 해결방법
- 생성자의 인자로 전달.
- setter 메서드 사용
- 실행 시 메서드의 인자로 전달
=> 결론적으로는 인스턴스를 생성하는 것이 아닌, 클래스에는 인스턴스에 메시지를 전송하는
코드만 남아있어야 한다!
가끔은 생성해도 무방하다.
- 트레이드오프의 대상은 결합도와 사용성이다.
- 구체 클래스에 의존하게 되더라도 클래스의 사용성이 더 중요하다면 결합도를 높이는 방향으로 코드를 작성할 수 있다.
- 그럼에도 가급적이면 구체 클래스에 대한 의존성을 제거할 수 있는 방법을 찾아보길 바란다.
'아키텍처 > OOP' 카테고리의 다른 글
[오브젝트] Chapter10, 11 상속과 코드 재사용 / 합성과 유연한 설계 (0) | 2022.11.09 |
---|---|
[오브젝트] Chapter9 유연한 설계 (0) | 2022.11.04 |
[오브젝트] Chapter7 객체 분해 (0) | 2022.11.03 |
[오브젝트] Chapter6 메시지와 인터페이스 (0) | 2022.11.03 |
[오브젝트] Chapter5 책임 할당하기 (0) | 2022.11.02 |