익명 객체(anonymous)
이름이 없는 객체를 말하며, 익명 객체를 만들려면 어떤 클래스를 상속하거나 인터페이스를 구현해야만 함.
// 상속
class 클래스이름1 extends 부모클래스 {...}
부모클래스 변수 = new 클래스이름1();
// 구현
class 클래스이름2 implements 인터페이스 {...}
인터페이스 변수 = new 클래스이름2();
* 이 경우 부모 클래스 변수는 클래스이름1의 객체를 참조하고, 인터페이스 변수는 클래스이름2의 객체를 참조.
// 상속
부모클래스 변수 = new 부모클래스() {...};
// 구현
인터페이스 변수 = new 인터페이스() {...};
* 이 경우 부모 클래스 변수는 이름이 없는 자식 객체를 참조하고, 인터페이스 변수는 이름이 없는 구현 객체를 참조.
익명 자식 객체 생성
// 부모 클래스
package sec02.exam01;
public class Person {
void wake() {
System.out.println("7시에 일어납니다.");
}
}
// 익명 자식 객체 생성
package sec02.exam01;
public class Anonymus {
// 필드 초기값으로 대입
Person field = new Person() {
void work() { // 필드값으로 익명 객체 대입
System.out.println("출근합니다.");
}
@Override
void wake() {
System.out.println("6시에 일어납니다.");
work();
}
};
void method1() {
// 로컬 변수값으로 대입
Person localVar = new Person() {
void walk() { // 로컬 변수값으로 익명 객체 대입
System.out.println("산책합니다.");
}
@Override
void wake() {
System.out.println("7시에 일어납니다.");
walk();
}
};
// 로컬 변수 사용
localVar.wake();
}
void method2(Person person) {
person.wake();
}
}
// 익명 자식 객체 생성
package sec02.exam01;
public class AnonymousExample {
public static void main(String[] args) {
Anonymous anony = new Anonymous();
// 익명 객체 필드 사용
anony.field.wake();
// 익명 객체 로컬 변수 사용
anony.method1();
// 익명 객체 매개값 사용
anony.method2(
new Person() { // 매개값으로 익명 객체 대입
void stud() {
System.out.println("공부합니다.");
}
@Override
void wake() {
System.out.println("8시에 일어납니다.");
study();
}
}
);
}
}
익명 구현 객체 생성
// 인터페이스
package sec02.exam02;
public interface RemoteControl {
public void turnOn();
public void turnOff();
}
// 익명 구현 객체 생성
package sec02.exam02;
public class Anonymous {
// 필드 초기값으로 대입
RemoteControl field = new RemoteControl() {
@Override
public void turnOn() { // 필드 선언과 초기값 대입
System.out.println("TV를 켭니다.");
}
@Override
public void turnOff() {
System.out.println("TV를 끕니다.");
}
};
void method1() {
// 로컬 변수값으로 대입
RemoteControl localVar = new RemoteControl() {
@Override
public void turnOn() { // 로컬 변수 선언과 초기값 대입
System.out.println("Audio를 켭니다.");
}
@Override
public void turnOff() {
System.out.println("Audio를 끕니다.");
}
};
// 로컬 변수 사용
localVar.turnOn();
}
void method2(RemoteControl rc) {
rc.turnOn();
}
}
// 익명 구현 객체 생성
package sec02.exam02;
public class AnonymousExample {
public static void main(String[] args) {
Anonymous anony = new Anonymous();
// 익명 객체 필드 사용
anony.field.turnOn();
// 익명 객체 로컬 변수 사용
anony.method1();
// 익명 객체 매개값 사용
anony.method2(
new RemoteControl() {
@Override
public void turnOn() { // 매개값
System.out.println("SmartTv를 켭니다.");
}
@Override
public void turnOff() {
System.out.println("SmartTV를 끕니다.");
}
}
);
}
}
익명 객체의 로컬 변수 사용
// 인터페이스
package sec02.exam04;
public interface Calculatable {
public int sum();
}
// 익명 객체의 로컬 변수 사용
package sec02.exam04;
public class Anonymous {
private int field;
public void method(final int arg1, int arg2) {
final int var1 = 0;
int var2 = 0;
field = 10;
Calculatable calc = new Calculatable() {
@Override
public int sum() {
int result = field + arg1 + arg2 + var1 + var2;
return result;
}
};
System.put.println(calc.sum());
}
}
// 익명 객체의 로컬 변수 사용
package sec02.exam04;
public class AnonymousExample {
public static void main(String[] args) {
Anonymous anony = new Anonymous();
anony.method(0,0);
}
}
🔘 익명 자식 객체: 자식 클래스가 재사용되지 않고 오로지 특정 위치에서 사용할 경우라면 자식 클래스를 명시적으로 선언하는 것은 귀찮은 작업인데, 이 경우에는 익명 자식 객체를 생성해서 사용.
부모클래스 [필드|변수] = new 부모클래스(매개값, ...) {
// 필드
// 메소드
};
🔘 익명 구현 객체: 구현 클래스가 재사용되지 않고 오로지 특정 위치에서 사용할 경우라면 구현 클래스를 명시적으로 선언하는 것은 귀찮은 작업인데, 이 경우에는 익명 구형 객체를 생성해서 사용.
인터페이스 [필드|변수] = new 인터페이스() {
// 인터페이스에 선언된 추상 메소드의 실체 메소드 선언
// 필드
// 메소드
};
'Java' 카테고리의 다른 글
| [Java] 예외 처리 (1) | 2025.11.15 |
|---|---|
| [Java] 예외 클래스 (0) | 2025.11.15 |
| [Java] 중첩 클래스와 중첩 인터페이스 (0) | 2025.11.15 |
| [Java] 타입 변환과 다형성 (0) | 2025.11.14 |
| [Java] 인터페이스 (0) | 2025.11.14 |