이번 장의 주제는 특정 클래스가 멤버 변수로 특정 객체에 '의존' 하고 있는 상황이라면

의존 객체 주입을사용하라는 것이 팁이다.

이 부분은 말로 하면 어렵기 때문에 바로 코드로 표현하겠다.

만약 치킨을 주문할 수 있는 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);

    }
}

이런식으로 유연하게 사용할 수 있다는 것이다!

+ Recent posts