Dependency(의존 관계) : A가 B를 의존한다.
ex) 자바 프로그래머는 자바에 의존한다.
public class Programmer {
private final JavaLanguage javaLanguage = new JavaLanguage();
}
프로그래머가 자바가 아닌 파이썬을 사용하고 싶을 때 프로그래머 클래스의 코드 변경이 일어난다.
즉, '프로그래머는 자바에 의존한다'고 볼 수 있다.
이는 SOLID 원칙 중 OCP(개방-폐쇄 원칙)에 위반하며 코드의 양이 많아질수록 유지보수 또한 어려워진다.
이러한 문제를 해결하기 위해 Dependency Injection(의존 관계 주입)을 사용한다.
public class Programmer {
private final JavaLanguage javaLanguage;
public Programmer(JavaLanguage javaLanguage) {
this.javaLanguage = javaLanguage;
}
public JavaLanguage getInstance() {
return javaLanguage;
}
}
Programmer javaProgrammer = new Programmer(new JavaLanguage());
생성자를 사용하여 외부에서 인스턴스를 생성 후 객체에 넘겨주고 있지만, 언어를 변경하기 위해서는 프로그래머 클래스의 코드 변경이 필요하다. 또한, SOLID 원칙 중 DIP(의존관계 역전 원칙)를 위반한다.
구현 클래스에 의존하지 않기 위해 인터페이스를 사용하여 문제를 해결한다.
public interface Language {
}
public class JavaLanguage implements Language{
}
public class Programmer {
private final Language language;
public Programmer(Language language) {
this.language = language;
}
public Language getInstance() {
return language;
}
}
프로그래머 클래스는 Language 인터페이스에 의존하고 있고 어떠한 구현 클래스에는 의존하지 않고 있다. 또한, 자바에서 파이썬으로 언어 변경이 필요할 때는 외부에서 파이썬 클래스를 구현하여 의존 관계 주입을 해주면 된다.
public class PythonLanguage implements Language{
}
Programmer javaProgrammer = new Programmer(new JavaLanguage());
Programmer pythonProgrammer = new Programmer(new PythonLanguage());
SOLID 원칙
https://jeounpar.tistory.com/3
'책 > 이펙티브 자바' 카테고리의 다른 글
이펙티브 자바 아이템29까지 읽고 느낀점 (1) | 2023.07.10 |
---|---|
자바 equals와 hashCode (0) | 2023.07.04 |
싱글톤 - 리플렉션API 공격과 방어 (0) | 2023.07.02 |
생성자 대신 정적 팩토리 메서드를 고려하라 (0) | 2023.07.01 |