Dev/Effective Java

5. 아이템[5] - 자원을 직접 명시하지 말고 의존 객체 주입을 사용하라

VIPeveloper 2021. 1. 23. 21:05
728x90
반응형

1. 서론

지난 포스팅에서는 인스턴스를 막기 위해 private 한 생성자를 사용하라는 내용에 대해 배웠습니다. 코드는 여기에서 보실 수 있습니다. 

이번 포스팅에서는 자원을 직접 명시하는 것이 아닌, 의존 객체 주입을 사용하는 것에 대해 포스팅하겠습니다.

2. 본론

인스턴스를 생성할 때, 생성자에 필요한 자원을 넘겨주는 방식을 이용하면, 사용하는 자원에 따라 동작이 달라지는 클래스에 유동적으로 사용할 수 있다. 이 방법을 사용해서 클라이언트가 자신이 명시한 타입의 하위 타입이라면 무엇이든 생성할 수 있는 팩터리를 넘길 수 있다. 

저번에 Fruit 클래스를 만든 것을 활용하여 간단한 예제를 구현해 보았다.

package com.study;

import java.util.Objects;

class Fruit_ITEM5 {
    private final Fruit fruit;

    public Fruit_ITEM5(Fruit fruit){
        this.fruit = Objects.requireNonNull(fruit);
    }
}
package com.study;

import org.junit.Test;


class Fruit_ITEM5Test {
    @Test
    public void Fruit_ITEM5Test(){
        Fruit apple = new Apple();
        Fruit banana = new Apple();
        Fruit strawberry = new Apple();

        Fruit_ITEM5 fruit_item5_apple = new Fruit_ITEM5(apple);
        Fruit_ITEM5 fruit_item5_banana = new Fruit_ITEM5(banana);
        Fruit_ITEM5 fruit_item5_strawberry = new Fruit_ITEM5(strawberry);
    }
}

뭘 테스트 해봐야할지 아직 감이 잘 안잡힌다. Fruit의 어떤 객체를 받아도 잘 적응할 수 있는걸 보니 이렇게 사용할 수도 있겠다는 생각이 들었다.

3. 결론

클래스가 내부적으로 하나 이상의 자원에 의존하고, 그 자원이 클래스 동작에 영향을 준다면, 싱글턴과 유틸리티 클래스는 사용하지 않는 것 이 좋다고 한다.

728x90
반응형