IT/Java

익명클래스(Anonymous Class), Generic

바바옄 2015. 4. 28. 09:44
반응형

익명클래스(Anonymous Class) = callback

- 익명클래스를 쓰면 클래스를 많이 만들 필요가 없다 - 편하다.

- 특정한 부분, 필요한 부분만 만들 수 있다.

- 인터페이스만 존재, implement는 존재하지 않는다.

- 클래스 수를 줄이기 위해, 불필요한(중복된) 메소드 제거

utilities -> FileUtils.java -> copy method

인터페이스를 익명클래스(Anonymous Class)로 객체화.

1
2
3
4
5
6
7
8
        // 원래 인터페이스는 new를 쓰지 못하지만 인터페이스 안의 메소드를 구현하는 동시에는 new가 가능하다. 
        // 인터페이스를 익명클래스(클래스에 이름이 없다: Anonymous Class)로 객체화
        FileUtilAdapter.doFunc(new FileFunctionable(){
            @Override
            public void doFunc() throws IOException {
                Files.copy(new File(originFilePath).toPath(), new File(destFilePath).toPath());
            }
        });

cs

 

예제1. 계산기

Calculator.java (클래스)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
 
public class Calculator {
    public int calc(Operatable operatable){
        
        System.out.println("계산을 시작합니다.");
        
        int result = operatable.calc();
        
        System.out.println("계산을 종료합니다.");
        System.out.println("결과는 "+result+"입니다.");
        
        return result;
 
    }
}
 
cs

 

Main.java (클래스)

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
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
 
public class Main {
 
    public static void main(String[] args){
        
        final int number1 = 10;
        final int number2 = 30;
        
        // 템플릿 클래스.
        // 익명 클래스가 파라미터로 전달되는 클래스 혹은 메소드를 템플릿 클래스 혹은 템플릿 메소드라 부른다.
        Calculator calc = new Calculator();
        
        /* 
         * implementation된 클래스는 위의 변수의 접근이 불가능하다.
         * jdk 1.7에서는 final(값이 바뀌지 않는다는 보장)을 사용해야 가능하다, 
         * but jdk 1.8에서는 final을 사용하지 않아도 사용가능하지만 
         * 실무에서는 1.8을 사용하지 않는 곳이 많기 때문에 final을 항상 붙여줘라.
         */
        
        // calc 템플릿에 Operator CallBack을 전달한다.
        // CallBack은 템플릿 내에서 실행되는 사용자 정의 로직이 포함된다.
        int result = calc.calc(new Operatable() {
 
            @Override
            public int calc() {
                System.out.println(number1+ " + " +number2);
                return number1 + number2;
            }
            
        });
        
        result = calc.calc(new Operatable() {
 
            @Override
            public int calc() {
                System.out.println(number1+ " - " +number2);
                return number1 - number2;
            }
            
        });
 
    }
}
 
cs

 

Operatable.java (인터페이스)

1
2
3
4
public interface Operatable {
 
    public int calc();
}
cs

 

 

예제2. Print

Print.java(클래스)

1
2
3
4
5
6
7
8
9
10
11
12
package template;
 
public class Print {
    
    public void print(Printable printable){
        String welcomeMessage = "반갑습니다, ";
        welcomeMessage = printable.print(welcomeMessage);
        System.out.println(welcomeMessage);
    }
    
}
 
cs

 

Main.java(클래스)

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
28
29
30
31
32
33
34
package template;
 
public class Main {
    
    public static void main(String[] args){
        
        /*
         * 탬플릿 클래스
         */
        Print print = new Print();
        
        /*
         * 탬플릿에 포함되는 CallBack 클래스를 작성한다.
         */
        print.print(new Printable() {
            
            /*
             * prefix 변수는 템플릿이 넘겨준 파라미터
             * 즉, 사용자(개발자)는 이 값에 대해서 알지 못한다.
             *  
             * @see template.Printable#print(java.lang.String)
             */
            @Override
            public String print(String prefix) {
                
                String result = prefix + "날씨가 좋네요~ 오늘 점심은 11시30분입니다.";
                
                return result;
            }
        });
    }
 
}
 
cs

 

Printable.java(인터페이스)

1
2
3
4
5
6
package template;
 
public interface Printable {
    public String print(String prefix);
}
 
cs

 

예제3. MVC

Controller.java(클래스)

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
28
29
30
31
32
33
34
package template;
 
public class Main {
    
    public static void main(String[] args){
        
        /*
         * 탬플릿 클래스
         */
        Print print = new Print();
        
        /*
         * 탬플릿에 포함되는 CallBack 클래스를 작성한다.
         */
        print.print(new Printable() {
            
            /*
             * prefix 변수는 템플릿이 넘겨준 파라미터
             * 즉, 사용자(개발자)는 이 값에 대해서 알지 못한다.
             *  
             * @see template.Printable#print(java.lang.String)
             */
            @Override
            public String print(String prefix) {
                
                String result = prefix + "날씨가 좋네요~ 오늘 점심은 11시30분입니다.";
                
                return result;
            }
        });
    }
 
}
 
cs

 

Service.java(클래스)

1
2
3
4
5
6
7
8
9
10
11
package mvc;
 
public class Service {
 
    private DAO dao = new DAO();
    
    public void update(Updatable updatable){
        dao.update(updatable.setParm());
    }
}
 
cs

 

DAO.java(클래스)

1
2
3
4
5
6
7
8
9
10
11
12
package mvc;
 
import java.util.Map;
 
public class DAO {
    
    public void update(Map<StringString> param){
        System.out.println("업데이트가 호출되었습니다.");
    }
 
}
 
cs

 

Updatable.java(인터페이스)

1
2
3
4
5
6
7
8
9
10
package mvc;
 
import java.util.Map;
 
public interface Updatable {
 
    public Map<StringString> setParm();
    
}
 
cs

 

Generic

-  클래스를 선언할 때 자료형을 결정하지 않고 객체를 생성할때 자료형을 결정하는 것.

E : Element

K : Key

V : Value

T : Type

-> 역할은 똑같고 이름만 다르다.

-> 어떤 타입이든 올 수 있다.

 

반응형