반응형
익명클래스(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());
}
}); |
예제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<String, String> 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<String, String> setParm();
}
|
cs |
Generic
- 클래스를 선언할 때 자료형을 결정하지 않고 객체를 생성할때 자료형을 결정하는 것.
E : Element
K : Key
V : Value
T : Type
-> 역할은 똑같고 이름만 다르다.
-> 어떤 타입이든 올 수 있다.
반응형
'IT > Java' 카테고리의 다른 글
택배 문자 String api를 이용해 분리하기 (0) | 2015.06.23 |
---|---|
Eclipse에서 웹 프로젝트 실행하기 (0) | 2015.04.27 |
Tomcat 설치 및 Eclipse 연동 (0) | 2015.04.26 |
SVN 설치 (0) | 2015.04.12 |
Eclipse 폰트 설정(monaco font) 및 한글을 위한 setting (0) | 2015.04.12 |