Engineering Note

[Java] Dependency 본문

Programming Language/Java

[Java] Dependency

Software Engineer Kim 2022. 9. 2. 08:41

Dependency, 의존 : 다른 것에 의지하여 존재함

프로그래밍 세계, 그중에서 객체지향 프로그래밍에서도 의존한다는 것은 하나의 객체가 다른 객체에 의존하여 존재한 다는 것을 의미한다.

pseudo code

new Car(); // 자동차를 생산한다.

Car(){    

    new Tire();  // 자동차는 내부적으로 타이어를 생산한다.

}

이 경우를 살펴보면 ‘Car가 Tire에 의존한다’고 표현할 수 있다.

code

// Tire.java

package exam001;

public interface Tire {
    String getBrand();
}
// KoreTire.java

package exam001;

public class KoreaTire implements Tire{
    @Override
    public String getBrand() {
        return "Korea tire!";
    }
}
// AmericaTire.java

package exam001;

public class AmericaTire implements Tire{
    @Override
    public String getBrand() {
        return "America tire!";
    }
}
// Car.java 

package exam001;

public class Car {

    Tire tire;

    public Car(){
        this.tire = new KoreaTire(); //의존관계가 일어나는 부분, Car의 생성자 코드에서 tire 속성에 새로운 타이어를 생성해서 참조할 수 있게 해주었다.
        //this.tire = new AmericaTire(); // Car 생성자가 타이어를 직접 생성한다면 타이어의 종류가 바뀔 때마다 Car 생성자의 코드를 매번 바꿔야줘야 함. 코드의 확장성이 좋지 않음
    }

    public String getTireBrand(){
        return "This tire is get " + tire.getBrand();
    }
}
// Driver.java

package exam001;

public class Driver {

    public static void main(String[] args) {
        Car car = new Car();

        System.out.println(car.getTireBrand()); //This tire is get Korea tire!
    }
}

Dependency Injection(DI)

의존성 주입

주입: 주입식 교육할 때 주입과 같은 말이다. 외부에서 어떤 내용을 집어 넣어 준다는 뜻.

의존성 주입이란 의존하고 있는 것을 주입해주는 것이다. 위의 예시 처럼 Car 클래스를 통해 이해해보면 Car 클래스 내부에서 타이어를 생산하는 것이 아니라 외부에서 생산된 타이어를 자동차에 장착하는 작업이 주입해주는 것이다.

그런데 이 의존성 주입 방식에는 생성자 주입, 필드 주입 방식이 있다.

생성자 주입

// Tire.java

package exam002;

public interface Tire {
    String getBrand();
}
// KoreaTire.java

package exam001;

public class KoreaTire implements Tire{
    @Override
    public String getBrand() {
        return "Korea tire!";
    }
}
// AmericaTire.java

package exam002;

public class AmericaTire implements Tire {
    @Override
    public String getBrand() {
        return "America tire!";
    }
}
// Car.java
package exam002;

public class Car {

    Tire tire;

    public Car(Tire tire){
        this.tire = tire; //의존관계가 일어나는 부분, Car의 생성자 코드에서 tire 속성에 새로운 타이어를 생성해서 참조할 수 있게 해주었다.
    }

    public String getTireBrand(){
        return "This Tire is get " + tire.getBrand();
    }
}
// Driver.java

package exam002;

public class Driver {

    public static void main(String[] args) {
        Tire tire = new KoreaTire();
        Car car = new Car(tire);

        System.out.println(car.getTireBrand());
    }
}

test code

package exam002;

import org.junit.jupiter.api.Test;

import static org.junit.jupiter.api.Assertions.*;

class CarTest {

    @Test
    void getKoreTireBrand() {
        Tire tire = new KoreaTire();
        Car car = new Car(tire);

        assertEquals("This Tire is get Korea tire!", car.getTireBrand());
    }

    @Test
    void getAmericaTireBrand() {
        Tire tire = new AmericaTire();
        Car car = new Car(tire);

        assertEquals("This Tire is get America tire!", car.getTireBrand());
    }
}

Untitled

필드 주입

// Tire.java

package exam003;

public interface Tire {
    String getBrand();
}
// KoreaTire.java

package exam003;

public class KoreaTire implements Tire{

    @Override
    public String getBrand(){
        return "Korea tire!";
    }
}
// America.java

package exam003;

public class AmericaTire implements Tire{

    @Override
    public String getBrand() {
        return "America tire!";
    }
}
//Car.java

package exam003;

public class Car {
    Tire tire;

    public Tire getTire(){
        return tire;
    }

    public void setTire(Tire tire){
        this.tire = tire;
    }

    public String getTireBrand(){
        return "This tire is get " + tire.getBrand();
    }
}
// Drive.java

package exam003;

public class Driver {

    public static void main(String[] args) {

        Tire tire = new KoreaTire();
        Car car = new Car();

        car.setTire(tire);

        System.out.println(car.getTireBrand());
    }
}

test code

package exam003;

import org.junit.jupiter.api.Test;

import static org.junit.jupiter.api.Assertions.*;

class CarTest {

    @Test
    void getKoreaTireBrand() {
        Tire tire = new KoreaTire();
        Car car = new Car();
        car.setTire(tire);

        assertEquals("This tire is get Korea tire!", car.getTireBrand());
    }

    @Test
    void getAmericaTireBrand(){
        Tire tire = new AmericaTire();
        Car car = new Car();
        car.setTire(tire);
        assertEquals("This tire is get America tire!", car.getTireBrand());
    }
}

\

Comments