[Spring] Interface를 활용한 자동 메서드 실행 ①

2020. 9. 22. 22:05개발공부/Spring

728x90

Interface에 공통된 메서드를 선언해놓고 각각의 클래스에서 Override(상속)한 뒤 공통된 메서드를 추가해 각각의 클래스 메서드가 실행될 때 같이 실행시키고자 합니다.

그러나 같이 실행시킬 메서드를 Main 클래스에 일일이 입력한다면 번거로움이 크기 때문에 Execute(실행)할 클래스를 따로 생성해줍니다. 그리고 delegate(대기자) 객체를 만들어 추가된 메서드와 함께 실행할 수 있는 merge용 메서드를 하나 생성합니다. 

실행 클래스에는 delegate 객체를 의존으로 주입합니다. 데이터 타입이 Calculator인 이유는 Calculator가 부모 클래스이기 때문입니다. 인스턴스명은 delegate로 설정해주고 생성자에 의존 주입을 해줍니다.

메서드를 만들 때 실행시킬 부모 클래스의 factorial 메서드는 delegate 인스턴스로 받아 실행시켜 줍니다. 이는 생성된 메서드에서 핵심 기능을 담당합니다. 핵심 메서드는 우리가 원하는 답을 구해주는 역할을 하고 바깥에서 감싸고 있는 merge용 메서드는 함께 실행시켜줄 메서드들과 핵심 메서드를 merge 시켜주기 위해 생성했습니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
package sample3;
 
public class ExeTimeCalculator implements Calculator{
 
    private Calculator delegate; //대리자
    
    //의존 주입
    public ExeTimeCalculator(Calculator delegate) {
        this.delegate = delegate;
    }
    
    @Override
    public long factorial(long num) {
        long start = System.nanoTime();
        long result = delegate.factorial(num); //핵심 기능
        long end = System.nanoTime();
        System.out.printf("%s.factorial(%d) 수행 시간: %d\n",
                delegate.getClass().getSimpleName(),
                num, (end-start));
        
        return result;
    }
    
    
 
}
 
cs

Main 클래스에서 중요한 점은 실행 클래스 객체를 생성할 때입니다. merge 메서드 내 delegate 인스턴스에 주입될 자식 클래스는 생성자 매개변수에 입력해줘야 합니다. 주입된 매개변수는 핵심 메서드가 실행될 때 클래스로 사용됩니다. 생성된 Execute 클래스 타입의 인스턴스로 메서드를 호출하면 원하던 메서드가 추가된 값이 핵심 메서드와 함께 출력되는 것을 확인할 수 있습니다. 

내일은 구동 원리와 응용에 대해 배울 예정입니다. 이번 시간에는 부모 클래스, 자식 클래스 구분해 생성하는 방식과 Interface를 이용해 하나의 클래스에서 추가하고 싶은 메서드를 추가해 merge 할 수 있다는 사실을 배웠습니다. 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
package sample3;
 
public class Main1 {
    public static void main(String[] args) {
        //ExeTime 의존성에 Calculator 객체가 들어가야 됨. ImplCal과  RecCal은 Calculator를 상속 받고 있기 때문에 delegate로 factorial 메서드 주입 가능
        ExeTimeCalculator calc1 = new ExeTimeCalculator(new ImplCalculator());
        ExeTimeCalculator calc2 = new ExeTimeCalculator(new RecCalculator());
        
        long n1 = calc1.factorial(20);
        long n2 = calc2.factorial(20);
        
        System.out.println("n1: " + n1);
        System.out.println("n2: " + n2);
        
    }
 
}
 
cs