이번에는 스프링의 도움없이 DI를 직접 해보고 추후에 스프링을 활용해본다. 먼저 자바 프로젝트를 생성한다.(Java Perspective로 변환)
메인이 되는 프로그램 파일이 서비스 파일이 되고 여기서 DI가 이루어진다. 직접 DI가 이루어진 형태이다. 인터페이스로 구현이되어 어느정도 결합력이 약해진 상태이지만 그래도 InlineExamConsole과 GridExamConsole을 교체하며 사용하기에는 번거롭다.
package spring.di;
import spring.di.entity.Exam;
import spring.di.entity.NewlecExam;
import spring.di.ui.ExamConsole;
import spring.di.ui.GridExamConsole;
import spring.di.ui.InlineExamConsole;
public class Program {
public static void main(String[] args) {
Exam exam = new NewlecExam();
ExamConsole console = new InlineExamConsole(exam);
// ExamConsole console = new GridExamConsole(exam);
console.print();
}
}
package spring.di.entity;
public interface Exam {
public int total();
public float avg();
}
인터페이스 형식으로 작성된 Exam을 구현하는 Newlec Exam 클래스이다.
package spring.di.entity;
public class NewlecExam implements Exam {
private int kor;
private int eng;
private int math;
private int com;
@Override
public int total() {
// TODO Auto-generated method stub
return kor+eng+math+com;
}
@Override
public float avg() {
// TODO Auto-generated method stub
return total()/4.0f;
}
}
Exam의 결과를 출력하는 ui 역할을 하는 ExamConsole 인터페이스이며 InlineExamConsole와 GridExamConsole에서 각기 다르게 구현한다.
package spring.di.ui;
public interface ExamConsole {
void print();
}
package spring.di.ui;
import spring.di.entity.Exam;
public class InlineExamConsole implements ExamConsole {
private Exam exam;
public InlineExamConsole(Exam exam) {
this.exam = exam;
}
@Override
public void print() {
System.out.printf("total is %d, avg is %f\n", exam.total(), exam.avg());
}
}
package spring.di.ui;
import spring.di.entity.Exam;
public class GridExamConsole implements ExamConsole {
private Exam exam;
public GridExamConsole(Exam exam) {
this.exam = exam;
}
@Override
public void print() {
System.out.println(" total | avg ");
System.out.printf(" %3d | %3.2f \n", exam.total(), exam.avg());
}
}