본문 바로가기
소프트웨어공학/OOP

[OOP] 정적 의존관계 vs 동적 의존관계

by 클레어몬트 2024. 8. 20.
 

ㅇ정적 의존관계(Static Dependency): 컴파일 시간에 결정되며, 주로 클래스 간의 관계를 의미

쉽게 이야기해서 프로그램을 실행하지 않고, 클래스 내에서 사용하는 타입들만 보면 쉽게 의존관계를 파악할 수 있다.

특징:

  • 컴파일 타임: 정적 의존관계는 코드가 컴파일될 때 결정된다. 즉, 소스 코드에서 어떤 클래스가 다른 클래스를 참조하거나 사용하는 경우, 이 의존관계가 컴파일러에 의해 확인된다.
  • 명시적 선언: 클래스가 다른 클래스를 사용하는 경우, 그 클래스의 인스턴스를 생성하거나 메서드를 호출하는 코드가 명시적으로 작성된다.
  • 파일 참조: Java에서는 import 문을 통해 다른 클래스를 참조하거나 사용하는 것을 확인할 수 있다.

 

 

 

ㅇ동적 의존관계(Dynamic Dependency): 프로그램이 실행되는 런타임에 확인할 수 있는 의존관계

인자로 어떤 객체가 전달될지는 프로그램을 실행해 봐야 알 수 있다. 어떤 경우에는 A 인스턴스가 넘어올 수 있고, 또 어떤 경우에는 B 인스턴스가 넘어올 수 있다. 이렇게 런타임에 어떤 인스턴스를 사용하는지를 나타내는 것이 동적 의존관계이다.

특징:

  • 런타임: 동적 의존관계는 프로그램이 실행되는 동안 발생한다. 이는 실행 시점에 어떤 객체들이 서로 상호작용 하는지를 나타낸다.
  • 다형성: 동적 의존관계는 다형성(polymorphism)에 의해 영향을 받을 수 있다. 예를 들어, 인터페이스를 통해 객체를 참조하면, 실행 시점에 어떤 실제 클래스의 인스턴스가 사용될지 결정된다.
  • 의존성 주입: 객체의 의존성을 런타임에 주입(DI, Dependency Injection)할 때 동적 의존관계가 형성된다.

 

 

 

[정적 의존관계 vs 동적 의존관계]

  • 결정 시점: 정적 의존관계는 컴파일 시점에 결정되며, 동적 의존관계는 런타임 시점에 결정된다.
  • 유연성: 정적 의존관계는 비교적 고정된 관계를 가지지만, 동적 의존관계는 런타임에 유연하게 변경될 수 있다. 예를 들어, 다형성이나 의존성 주입을 통해 동일한 코드가 다른 구현체와 협력할 수 있다.
  • 코드 작성 방식: 정적 의존관계는 코드 내에서 명시적으로 드러나며, 어떤 클래스가 어떤 클래스를 사용하는지 코드만으로 확인할 수 있다. 반면 동적 의존관계는 실행 시점에 객체 간의 상호작용을 통해서만 파악할 수 있다.
  • 의존성 주입: 동적 의존관계는 주로 의존성 주입 기법(DI)을 통해 구현되며, 이는 객체 간의 결합도를 낮추고 코드의 유연성을 높이는 데 기여한다. 정적 의존관계는 코드 레벨에서 직접 객체를 생성하거나 호출하여 결합도가 더 높을 수 있다.

※ 보통 단순히 의존관계, 또는 어디에 의존한다고 한다면 주로 정적 의존관계를 뜻하는 것이다.