8장 정리

객체지향 애플리케이션은 객체들의 역할, 책임, 협력을 통해 이루어진다.
협력을 위해서는 의존성이 필요하지만 과도한 의존성은 애플리케이션을 수정하기 어렵게 만들어 개발자를 곤경에 빠트린다.
객체지향 설계의 핵심은 협력을 위해 필욯나 의존성은 유지하면서도 변경을 방해앟는 의존성은 제거하는데 있다.
이런 관점에서 객체지향 설계란 의존성을 관리하는 것이고 객체가 변화를 받아들일 수 있게 의존성을 정리하는 기술이라고 할 수 있다.

의존성 이해하기

변경과 의존성

지금까지 설계와 관련된 대부분의 용어들은 변경과 관련이 있었다.
두 요소 사이의 의존성 역시 의존되는 요소가 변경될 때 의존하는 요소도 함께 변경될 수 있다.
따라서 의존성은 변경에 의한 영향의 전파 가능성을 암시한다.

런타임 의존성과 컴파일타임 의존성

의존성은 런타임 의존성과 컴파일타임 의존성으로 나눌 수 있다.
유연하고 재사용 가능한 코드를 설계하기 위해서는 런타임 시점과 컴파일 시점의 의존성을 서로 다르게 만들어야 한다.

컨텍스트 독립성

클래스가 사용될 특정한 문맥에 대해 최소한의 가정만으로 알고 있는 것을 컨텍스트 독립성이라고 부른다.
클래스가 자신과 협력할 객체의 구체적인 클래스를 알고 있다면 그 클래스는 특정한 문맥에 강하게 결합된다.
반면 협력할 객체의 추상적인 클래스를 알고 있다면 구체적인 문맥은 컴파일 타임 의존성을 어떤 런타임 의존성으로 대체하느냐에 따라 달라진다.
클래스가 특정한 문맥에 강하게 결합될수록 다른 문맥에서 사용하기는 더 어려워진다.
클래스가 사용될 특정한 문맥에 대해 최소한의 가정만으로 이뤄져 있다면 다른 문맥에서 사용하기 더 수월해진다.
따라서 유연한 설계를 위해서는 가능한 한 자신이 실행될 컨텍스트에 대한 구체적인 정보를 최대한 적게 알아야 한다.

의존성 해결하기

컴파일 시점에 추상적인 클래스를 의존하면 런타임 시점에 구체적인 클래스로 교체해야하며, 이를 의존성 해결이라고 부른다.
의존성 해결의 방법에는 다음과 같은 세 가지 방법이 있다.

  • 객체를 생성하는 시점에 생성자를 통해 의존성 해결
  • 객체 생성 후 setter 메서드를 통해 의존성 해결
  • 메서드 실행 시 인자를 이용해 의존성 해결

유연한 설계

의존성을 관리하는데 유용한 몇 가지 원칙과 기법을 알아본다.

의존성과 결합도

객체지향 프로그래밍에서는 객체들 간의 협력을 통해 기능을 구현한다.
객체들이 협력 위해서는 서로를 알아야하고, 이는 객체들 간의 의존성을 낳는다.
따라서 모든 의존성이 나쁜 것은 아니지만, 의존성이 과하면 문제가 될 수 있다.
바람직한 의존성을 판단하는 기준은 재사용성이다.
어떤 의존성이 다양한 환경에서 클래스를 재사용할 수 없도록 제한하면 그 의존성은 바람직하지 못한 것이다.
반대로 다양한 환경에서 클래스를 재사용할 수 있도록 컨텍스트에 독립적인 의존성은 바람직한 의존성이다.
결합도의 측면에서 본다면 의존성이 재사용을 쉽게 허용한다면 결합도가 느슨하다고 하며, 재사용을 방해한다면 결합도가 강하다고 표현한다.

추상화에 의존하라

추상화란 세부사항, 구조를 좀 더 명확하게 이해하기 위해 특정 절차나 물체를 의도적으로 감추는것이다.
추상화를 통해 대상에 대해 알아야 하는 지식의 양을 줄일 수 있고, 따라서 결합도를 느슨하게 유지할 수 있다.
의존성을 객체의 퍼블릭 인터페이스에 드러내는것을 명시적인 의존성이라고 하며, 퍼블릭 인터페이스에 노출하지 않고 내부 구현으로 주입받은 의존성을 숨겨진 의존성이라고 부른다.
의존성이 명시적이지 않으면 의존성을 파악하기 위해 내부 구현을 직접 살펴봐야하므로 클래스를 다른 컨텍스트에서 재사용하기 위해 내부 구현의 수정을 야기할 수 있다.
수정은 곧 버그 발생의 가능성을 내포하므로 의존성은 명시적으로 표현돼야 한다.

new는 해롭다

new를 쓰면 구체적인 클래스의 인스턴스를 만들어야 하므로 결합도가 높아진다.
따라서 new 를 쓸 수록 더 많은 것에 의존하게 되고, 변경에 취약해진다.

인상깊었던 점

"모든 의존성이 나쁜 것은 아니지만, 의존성이 과하면 문제가 될 수 있다."
이 문장이 이번 장을 정리하는 문장인것 같습니다.
의존성이 생기는건 피할 수 없지만 생각없이 이것 저것 의존시키지 말고 적절하게 유지하는것의 중요함을 느꼈습니다.
최근 과제 전형을 해보면서 스프링 없이 순수 자바 코드로 요구사항을 만족시키는 애플리케이션을 만들고 있어요.
스프링이 너무 당연하다보니까 간과했었는데 스프링이 의존성 관리를 정말 편하게 해주고 있다는걸 느끼고 있습니다.
과제와 관련지어서 보니까 또 새로 보이는게 있었던거 같습니다.

'공부방 > 북스터디' 카테고리의 다른 글

[오브젝트] 10장  (0) 2024.03.04
[오브젝트] 9장  (0) 2024.02.20
[오브젝트] 7장  (0) 2024.01.29
[오브젝트] 6장  (0) 2024.01.23
[오브젝트] 5장  (0) 2024.01.15

+ Recent posts