728x90
반응형
익명 구현 객체 생성
구현 클래스를 명시적으로 선언하는 이유는 어디서건 이미 선언된 구현 클래스로 간단히 객체를 생성해서 사용할 수 있기 때문이다. --> 재사용성이 높다.
그러나, 구현 클래스가 재사용 되지 않고 특정 위치에서만 사용된다면, 익명 구현 객체를 생성해서 사용하는 것이 좋다.
- 필드 선언 시 초기값으로 익명 구현 객체 생성하여 대입하는 경우
- 메소드 내에서 로컬 변수 선언 시 초기값으로 익명 구현 객체를 생성해서 대입
- 매개 변수의 매개값으로 익명 구현객체를 생성하여 대입
예시1) 익명 구현 객체 생성
인터페이스
public interface RemoteCtrl {
public void turnOn();
public void turnOff();
}
익명 구현 객체 생성
public class Anonymous {
// 필드 초기값으로 대입
RemoteCtrl field = new RemoteCtrl() { // 필드 선언과 초기값 대입
@Override
public void turnOn() {
System.out.println("TV를 킨다.");
}
@Override
public void turnOff() {
System.out.println("TV를 끈다.");
}
};
void method1() {
// 로컬 변수값으로 대입
RemoteCtrl localVar = new RemoteCtrl() { // 로컬 변수 선언과 초기값 대입
@Override
public void turnOn() {
System.out.println("Audio를 킨다.");
}
@Override
public void turnOff() {
System.out.println("Audio를 끈다.");
}
};
// 로컬 변수 사용
localVar.turnOn();
localVar.turnOff();
}
void method2(RemoteCtrl rc) {
rc.turnOn();
rc.turnOff();
}
}
익명 구현 객체 생성
public class AnonymousEx {
public static void main(String[] args) {
Anonymous anony = new Anonymous();
// 익명 객체 필드 사용
anony.field.turnOn();
anony.field.turnOff();
// 익명 객체 로컬 변수 사용
anony.method1();
// 익명 객체 매개값 사용
anony.method2(new RemoteCtrl() {// 매개값
@Override
public void turnOn() {
System.out.println("SmartTV를 킨다.");
}
@Override
public void turnOff() {
System.out.println("SmartTV를 끈다.");
}
});
}
}
예시2) 윈도우 및 안드로이드 등의 UI플로그램에서 버튼의 클릭 이벤트를 처리하기 위해 익명 구현 객체를 이용하는 방법이다.
UI 클래스
public class Button {
static interface OnClickListener {// 중첩 인터페이스
void onClick(); // 버튼이 클릭될 때 실행되는 메소드
}
// 인터페이스 타입 필드
OnClickListener listener;
void setOnClickListener(OnClickListener listener) {
this.listener = listener;
}
void touch() {
listener.onClick(); //구현 객체의 onClick() 메소드 호출
}
}
UI 클래스
public class Window {
Button button1 = new Button();
Button button2 = new Button();
// 필드 초기값으로 대입
Button.OnClickListener listener = new Button.OnClickListener() { // 필드값으로 익명 객체 대입
@Override
public void onClick() {
System.out.println("전화를 건다.");
}
};
Window() {
button1.setOnClickListener(listener); // 매개값으로 필드 대입
button2.setOnClickListener(new Button.OnClickListener() { // 매개값으로 익명 객체 대입
@Override
public void onClick() {
System.out.println("메세지를 보낸다.");
}
});
}
}
실행 클래스
public class Main {
public static void main(String[] args) {
Window w = new Window();
w.button1.touch(); //버튼 클릭
w.button2.touch(); //버튼 클릭
}
}
익명 객체의 로컬 변수 사용
메소드의 매개 변수나 로컬 변수를 익명 객체 내부에서 사용할 때의 제한
- 메소드가 종료되어도 익명 객체가 계속 실행 상태로 존재할 수 있다. (heap 영역에 남아있을 수 있다.)
- 컴파일 시 익명 객체에서 사용하는 매개 변수나 로컬 변수는 final특성을 가진다.
예시3) 익명 객체의 로컬 변수 사용
인터페이스
public interface Calculatable {
public int sum();
}
익명 객체의 로컬 변수 사용
public class Anonymous {
private int field;
public void method(final int arg1, int arg2) {
final int var1 = 0;
int var2 = 0;
// 내부 클래스에서 변경 가능한 접근제한자로 가능
field = 10;
// final특성을 갖고있어 값을 변경할 수 없다.
// arg1 = 20;
// arg2 = 20;
// var1 = 30;
// var2 = 30;
Calculatable calc = new Calculatable() {
@Override
public int sum() {
int result = field + arg1 + arg2 + var1 + var2;
return result;
}
};
System.out.println(calc.sum());
}
}
익명 객체의 로컬 변수 사용
public class AnonymousEx {
public static void main(String[] args) {
Anonymous annoy = new Anonymous();
annoy.method(0, 0);
}
}
※용어 정리
-
익명 자식 객체: 자식 클래스가 재사용되지 않고 오로지 특정 위치에서 사용할 경우라면 자식 클래스를 명시적으로 선언하지 않고 익명 자식 객체를 생성해서 사용한다.
부모클래스 [필드|변수] = new 부모클래스(매개값, ...){
//필드
//메소드
};
-
익명 구현 객체: 구현 클래스가 재사용 되지 않고 오로지 특정 위치에서 사용할 경우라면 익명 구현 객체를 생성해서 사용 한다.
인터페이스 [필드|변수] = new 인터페이스(){
//인터페이스에 선언된 추상 메소드의 실체 메소드 선언
//필드
//메소드
};
본 내용은 #혼자공부하는자바 책을 참고해 공부하려 작성했습니다.
728x90
반응형
'Work & Study > JAVA (& 혼공자Java)' 카테고리의 다른 글
자바(Java) - 예외 처리 (0) | 2020.12.07 |
---|---|
자바(Java) - 예외 클래스 (0) | 2020.12.02 |
자바(Java) - 익명 객체1 (익명 자식 객체 생성) (0) | 2020.11.24 |
자바(Java) - 중첩 인터페이스 (0) | 2020.11.23 |
자바(Java) - 중첩 클래스의 접근 제한 (0) | 2020.11.23 |