public class Calculaotr {
//NumberMaker에서 만들어준 숫자를 가지고
//사칙 연산한 결과를 출력한다.
private Numbermaker numbermaker;
//alt+enter눌러서 인터페이스 생성
private int baseNum = 10;
//di생성
public Calculaotr(Numbermaker numbermaker) {
this.numbermaker = numbermaker;
}
public Calculaotr(Numbermaker numbermaker, int baseNum) {
this.numbermaker = numbermaker;
this.baseNum = baseNum;
}
public void plus(int num){
int result = num+this.numbermaker.make(this.baseNum);
System.out.println(result);
}
}
public interface Numbermaker {
//숫자를 1개 리턴
int make(int num);
}
public class ByPassNumberMaker implements Numbermaker{
@Override
public int make(int num) {
return num;
}
}
public class RandomNumberMaker implements Numbermaker{
//구현체 구현
@Override
public int make(int num) {
return (int)(Math.random() * num);
}
}
public class Main {
public static void main(String[] args) {
Numbermaker numbermaker = new RandomNumberMaker();
Calculaotr randomNumberCalculator = new Calculaotr(numbermaker);
randomNumberCalculator.plus(20);
//Numbermaker numbermaker = new ByPassNumberMaker(); 를 안하고 바로 넣을 수 있다.
Calculaotr byPassNumberCalculator = new Calculaotr(new ByPassNumberMaker(),200);
byPassNumberCalculator.plus(50);
}
}
1.interface를 생성하고
2.interface를 구현한 class를 만든다
3.interface를 맴버 변수로 class에 선언한다
4.class를 인스턴스화 시킬 때 interface 구현체를 new 해줘서 DI 해준다
DI란 외부에서 두 객체 간의 관계를 결정해주는 디자인 패턴으로, 인터페이스를 사이에 둬서 클래스 레벨에서는 의존관계가 고정되지 않도록 하고 런타임 시에 관계를 동적으로 주입하여 유연성을 확보하고 결합도를 낮출 수 있게 해준다.
di한다 -> constructor를 이용해 interface구현체를 넘겨서 초기화 시킨다.