개발하는 프로 국밥러
article thumbnail

오브젝트

조영호님의 책 오브젝트를 보며 정리한 내용입니다.

문제가 될 시 해당글 삭제하겠습니다.


[의존성 이해하기]

변경과 의존성

  • 실행 시점 : 의존하는 객체가 정상적으로 동작하기 위해서는 실행 시에 의존 대상 객체가 반드시 존재해야 한다.
  • 구현 시점 : 의존 대상 객체가 변경된 경우 의존하는 객체도 함께 변경된다.
  • 의존성은 방향성을 가지며 그 방향성은 항상 단방향이다.
  • 객체가 의존하고 있는 객체가 의존하는 객체는 모두 의존관계이다.(의존성 전이)
    • 직접 의존성 : 코드 안에서 명시적으로 드러나는 경우
    • 간접 의존성 : 코드 안에서 명시적으로 드러나지 않는 경우

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

  • 객체지향 어플리케이션에서 런타임에 주인공은 객체이다.
  • 컴파일 타임에 주인공은 클래스이다.
  • 중요한 것은 런타임 의존성과 컴파일 타임의 의존성을 다를 수 있고, 달라야 유연하고 재사용 가능한 코드를 만들 수 있다.

컨텍스트 독립성

  • 클래스가 특정 문맥에 강하게 결합될수록 다른 문맥에서 사용하지는 더 어려워진다.
  • 클래스가 사용될 특정한 문맥에 대해 최소한의 가정만으로 이뤄져 있다면 다른 문맥에서 재사용하기가 더 수월해진다
  • 이를 '컨텍스트 독립성' 이라고 부른다!

의존성 해결

  • 의존성을 해결하는 방법은 생성자 / setter / 메서드 인자 를 통한 방법이 있다.
  • 이 중 가장 좋은 방법은, 생성자와 setter 를 함께 사용하는 방법이다. 

[유연한 설계]

의존성과 결합도

  • 의존성이 무조건 적으로 나쁜것은 아니다, 협력의 측면에서 의존성은 필수적이며, 긍정적이다.
  • 의존성이 부정적일 때는, 그 정도가 과할 때 인것이다.(강한 or 단단한 결합도)
  • 바람직한 의존성은 재사용성이 높을 때를 말한다!

자식이 결합을 낳는다.

  • 더 많이 알수록 더 많이 결합된다.(인터페이스보다 인스턴스에 직접 의존할 때 단단하게 결합된다)

추상화에 의존하라.

  •  추상화 : 어떤 양상, 세부사항, 구조를 좀 더 명확하게 이해하기 위해 특정 절차나 물체를 의도적으로 생략하거나,      감춤으로써 복잡도를 극복하는 방법!
  • 일반적인 의존 대상의 구분
    • 구체 클래스 의존성
    • 추상 클래스 의존성
    • 인터페이스 의존성
      => 의존하는 대상이 더 추상적일수록 결합도는 더 낮아진다!

new는 해롭다

  • new 연산자를 잘못 사용하게 되면 결합도가 극단적으로 높아지게 된다.
  • 이유
    • new 연산자를 사용하기 위해 구체 클래스의 이름을 직접 기술해야 하는데, 
      추상화가 아닌 구체 클래스에 의존할 수 밖에 없기 때문에 의존성이 높아진다.
    • new 연산자는 구체 클래스 뿐 아니라 사용되는 인자 또한 알게 되는데, 
      이를 통해 클라이언트가 알아야 하는 지식이 늘어나기 때문에, 의존성이 높아진다.
  • 해결방법
    • 생성자의 인자로 전달.
    • setter 메서드 사용
    • 실행 시 메서드의 인자로 전달
      => 결론적으로는 인스턴스를 생성하는 것이 아닌, 클래스에는 인스턴스에 메시지를 전송하는
      코드만 남아있어야 한다!

가끔은 생성해도 무방하다.

  • 트레이드오프의 대상은 결합도와 사용성이다. 
  • 구체 클래스에 의존하게 되더라도 클래스의 사용성이 더 중요하다면 결합도를 높이는 방향으로 코드를 작성할 수 있다.
  • 그럼에도 가급적이면 구체 클래스에 대한 의존성을 제거할 수 있는 방법을 찾아보길 바란다.
profile

개발하는 프로 국밥러

@gugbab2

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!