-
오브젝트 리뷰 - 5개발/아키텍처 2021. 7. 27. 20:00
https://book.naver.com/bookdb/book_detail.nhn?bid=15007773
의존성 관리하기
의존성 이해하기
어떤 객체가 예정된 작업을 정상적으로 수행하기 위해 다른 객체를 필요로 하는 경우 두 객체 사이에 의존성이 존재한다고 말한다. 의존성은 방향성을 가지며 항상 단방향이다 (p254)
의존성은 전이될 수 있기 때문에 의존성의 종류를 직접 의존성(direct dependency)와 간접 의존성(indirect dependency)로 나누기도 한다. 직접 의존성이란 한 요소가 다른 요소에 직접 의존하는 경우를 가리킨다. 간접 의존성이란 직접적인 관계는 존재하지 않지만 의존성 전이에 의해 영향이 전파되는 경우를 뜻한다. (p257)
런타임 의존성은 실행 시점에 객체 간의 의존성을 뜻한다. 컴파일 타임은 코드 상에서 클래스 간의 의존성을 뜻한다. 런타임 의존성과 컴파일타임 의존성이 다를 수 있다. 유연하고 재사용 가능한 코드를 설계하기 위해서는 두 종류의 의존성을 서로 다르게 만들어야 한다. 런타임 의존성과 컴파일 타임 의존성 사이의 거리가 멀면 멀수록 설계가 유연해진다. (p258)
클래스가 사용될 특정한 문맥에 대해 최소한의 가정만으로 이뤄져 있다면 다른 문맥에서 재사용하기가 더 수월해진다. 이를 컨텍스트 독립성이라고 부른다. 설계가 유연해지기 위해서는 가능한 자신이 실행될 컨텍스트에 대한 구체적인 정보를 최대한 적게 알아야한다. (p260)
유연한 설계
바람직한 의존성은 재사용성과 관련이 있다. 어떤 의존성이 다양한 환경에서 클래스를 재사용할 수 없도록 제한한다면 그 의존성은 바람직하지 못한 것이다. 컨텍스트에 독립된 의존성은 다양한 환경에서 재사용 될 수 있는 가능성을 열어 놓는다(p265, 266)
바람직한 의존성을 가질 때 두 객체는 느슨한 결합도(loose coupling) 또는 약한 결합도를(weak coupling) 가진다고 말한다. 반대로 바람직하지 못한 의존성을 가질 때 두 객체는 단단한 결합도(tight coupling) 또는 강한 결합도(strong coupling)을 가진다고 말한다. (p266)
결합도의 정도는 한 요소가 자신이 의존하고 있는 다른 요소에 대해 알고 있는 정보의 양으로 결정된다. 한 요소가 다른 요소에 대해 더 많은 정보를 알고 있을 수록 두 요소는 강하게 결합된다. 반대로 더 적은 정보를 알고 있을 수록 두 요소는 약하게 결합된다. 더 많이 알수록 더 많이 결합된다. 더 많이 알고 있다는 것은 더 적은 컨텍스트에서 재사용 가능하다는 것을 의미한다. 결합도를 느슨하게 만들기 위해선 협력하는 대상에 대해 필요한 정보 외에는 최대한 감추는 것이 중요하다(p267)
추상화란 어떤 양상, 세부사항, 구조를 좀더 명확하게 이해하기 위해 특정 절차나 물체를 의도적으로 생략하거나 감춤으로써 복잡도를 극복하는 방법이다. 구체 클래스에 비해 추상 클래스는 클라이언트가 알아야하는 지식의 양이 더 적기 때문에 구체 클래스보다 추상 클래스에 의존하는 것이 결합도가 더 낮다. 인터페이스에 의존하면 추상 클래스의 상속 계층을 모르더라도 협력이 가능해진다. 인터페이스 의존성은 협력하는 객체가 어떤 메시지를 수신할 수 있는지에 대한 지식만을 남기기 때문에 추상 클래스보다 결합도가 낮다. 의존하는 대상이 추상적일수록 결합도는 더 낮아진다는 것이 핵심이다. (p268)
의존성이 퍼블릭 인터페이스에 노출되는 경우 명시적 의존성이라고 한다. 반대로 퍼블릭 인터페이스에 노출되지 않는 경우 숨겨진 의존성이라고 한다. 의존성이 명시적이지 않으면 클래스를 다른 컨텍스트에서 재사용하기 위해 내부 구현을 직접 변경해야 할 수 있다 (p270, 271)
'개발 > 아키텍처' 카테고리의 다른 글
오브젝트 리뷰 - 6 (0) 2021.08.09 오브젝트 리뷰 - 4 (0) 2021.07.25 오브젝트 리뷰 - 3 (0) 2021.07.21 오브젝트 리뷰 - 2 (0) 2021.07.12 오브젝트 리뷰 - 1 (0) 2021.07.11