로마
- 결합도는 의존의 정도, 협력하는 두 요소가 서로에 대해 얼마나 알고 있는가를 의미합니다.
- 강한 결합은 두 객체가 서로에 대해 많은 정보를 알고 있는 경우를 의미하며 주로 구현클래스를 직접 의존하는 경우입니다. 이 경우에는 의존 대상에 대한 구체적인 구현 로직까지 알게되므로 요구사항의 변경이 생길 경우 의존하고있는 구현 클래스를 변경해야하므로 변경에 유연하지 않은 구조를 가집니다.
- 느슨한 결합은 반대로 두 객체가 서로에 대해 자세히 알고있지 않는 경우입니다. 주로 추상클래스나 인터페이스를 통해 의존하는 경우입니다. 추상화에 의존하게되면 협력에 필요한 정보만을 의존할 수 있게 되므로 변경에 유연한 코드를 작성할 수 있습니다. 바람직한 의존관계라고 볼 수 있습니다.
- 의존하는 대상이 더 추상적일 수록 결합도는 낮아진다.
- 구체 클래스 -> 추상 클래스 -> 인터페이스
- 추상 클래스는 구체 클래스보다는 메서드 내부 구현, 자식 클래스 종류에 대한 지식을 숨길 수 있지만 협력 대상이 속한 클래스 상속 계층이 무엇인지에 대해서는 알고 있어야 하므로 인터페이스보다는 결합도가 높음
- 인터페이스는 어떤 메시지를 수신할 수 있는지에 대한 정보만 남기 때문에 결합도가 낮음
- 위에서 말했듯이 강한 결합은 바람직한 의존성이 아닙니다. 특정 컨텍스트에 강하게 결합되어있다보니 요구사항의 변경에 유연하게 대처하지 못하고 재사용하기 어려운 점 등 OCP에서 말하는 문제점들이 발생합니다. 따라서 강한 결합을 느슨하게 풀어주는 것이 중요하게 됩니다.
- 객체 내부에서 new 하는 것은 결합도를 끌어올린다. (* 표준클래스에 대한 의존은 해롭지 않음)
- 일단, 구체클래스에 대해서 알아야함
- 그리고 그 구체클래스의 생성자의 인자와 인자의 순서에 의존하게 됨
- 또 그 구체 클래스의 생성자의 인자로 다른 구체 클래스가 들어오면 거기와도 의존하게 되므로 결합도가 엄청 올라감
- 의존성은 명시적이여야한다. 즉, 퍼블릭 인터페이스에 의존관계가 표현되어있으면 좋다. 의존 관계가 숨겨져있다면( 내부에서 생성해서 사용 ) 코드에 의존성을 파악하기 위해 코드 구현을 살펴봐야하는 어려움이 있고, 다른 컨텍스트에서 해당 클래스를 재사용할 경우 내부 구현을 직접 변경해야 하는 번거로움이 생길 수 있다.
- 스프링에서 필드주입보다 생성자주입을 더 선호하는 이유 중에 하나로 추가될 수 있겠다.
- 오브젝트 ( 조영호 저 ) 8장 의존성 관리하기