Item 5 : 자원을 직접 명시하지 말고 의존 객체 주입을 사용하라
2021. 7. 4. 23:34
이번 장의 주제는 특정 클래스가 멤버 변수로 특정 객체에 '의존' 하고 있는 상황이라면
의존 객체 주입을사용하라는 것이 팁이다.
이 부분은 말로 하면 어렵기 때문에 바로 코드로 표현하겠다.
만약 치킨을 주문할 수 있는 orderChicken 객체를 만든다고 해보자
public class orderChicken{}
이 클래스는 어떤 가게의 치킨을 주문 할지 변수로 받아와야 한다
만약 내가 BHC의 치킨을 주문하고 싶다면
public class orderChicken{
private final chickenStore store = new BHC();
}
이런식으로 외부 자원을 받아와야만 한다.
그러나 이런식으로 클래스를 설계하게 되면 우리는 가게를 바꾸고 싶을 때 마다
orderChicken 클래스로 돌아와서 수정을 해줘야하는 번거로움이 있다.
(책에서는 정적 유틸리와 싱글턴을 잘못 사용한 예시를 보여주는데 결국, 이 부분의 유연성이 부족하다는 것을 말하고 있다.)
그렇다면 치킨 가게를 유연하게 선택하기 위해서는 어떻게 설계를 해야 할까?
public class orderChicken{
private final chickenStore store;
public orderChicken(chickenStore store){
this.store = Objects.requireNonNull(store);
}
.....추가적인 메소드
}
어? 이거 멤버 변수가 추가된 생성자잖아? 라고 생각이 날텐데, 이게 바로 의존 객체 주입이다.
//Objects.requireNonNull는 객체가 null이면 NullPointerException을 날려주는 메소드다
이렇게 클래스를 생성하게 되면
interface chickenStore {}
class BHC implements chickenStore{}
class BBQ implements chickenStore{}
class 네네 implements chickenStore{}
이런식으로 확장을 한뒤
public class test{
public static void main(String{} args){
chickenStore store1 = new BHC;
chickenStore store2 = new BBQ;
chickenStore store3 = new 네네;
orderChicken 후라이드 = new orderChicken(store1);
orderChicken 후라이드 = new orderChicken(store2);
orderChicken 후라이드 = new orderChicken(store3);
}
}
이런식으로 유연하게 사용할 수 있다는 것이다!
'책 > 이펙티브자바' 카테고리의 다른 글
Item 7 : 다 쓴 객체 참조를 해체하라 (0) | 2021.07.06 |
---|---|
Item 6 : 불필요한 객체 생성을 피하라 (0) | 2021.07.06 |
Item 4 : 인스턴스화를 막으려거든 private 생성자를 사용하라 (0) | 2021.07.03 |
Item 3 : private 생성자나 열거 타입(enum)으로 싱글톤임을 보증하라(with 직렬화) (0) | 2021.07.03 |
Item 2 : 생성자에 매개변수가 많다면 빌더를 고려하라(@Builder) (0) | 2021.07.02 |