익명 객체
이름이 없는 객체
<익명 객체를 만들기 위한 조건>
- 어떤 클래스를 상속하거나 인터페이스를 구현해야한다.
- 익명 객체를 생성할 때에는 클래스 이름이 없음
- 부모 클래스 변수는 이름이 없는 자식 객체를 참조
- 인터페이스 변수는 이름이 없는 구현 객체를 참조
익명 자식 객체 생성
- 자식 클래스가 재사용되지 않고 오로지 특정 위치에서 사용되는 경우 사용
- ‘부모클래스(매개값, ...){… }' : 부모클래스를상속해서 중괄호{} 와같이 자식 클래스를 선언하라
- new 연산자 : 선언된 자식 클래스를 객체로 생성
- ‘부모클래스(매개값, ...)' : 부모 생성자를 호출하는 코드, 매개값은 부모 생성자의 매개 변수에 맞게 입력하면 된다.
- 중괄호 {} 내부 : 필드와 메소드를 선언하거나 부모 클래스의 메소드를 재정의하는 내용 작성
- 익명 자식 객체에 새롭게 정의된 필드와 메소드는 익명 자식 객체 내부에서만 사용되고 외부에서는 접근 불가능
- 익명 자식 객체는 부모 타입 변수에 대입되므로 부모 타입에 선언된 것만 사용할 수 있기 때문
익명 구현 객체 생성
- 구현 클래스가 재사용되지 않고 오로지 특정 위치에서 사용되는 경우 사용
- 인터페이스() { ... } : 인터페이스를 구현해서 중괄호 {}와 같이 클래스를 선언하라는 뜻
- new 연산자 : 선언된 구현 클래스를 객체로 생성
- 중괄호 {} : 인터페이스에 선언된 모든 추상 메소드의 실체 메소드를 작성(재정의)
익명 객체의 로컬 변수 사용
- 매개 변수나 로컬 변수는 메소드 실행이 끝나면 스택 메모리에서 사라지기 때문에 익명 객체에서 지속적으로 사용할 수 없음
↓ 이 문제를 해결하기 위해 ↓
- 컴파일 시 익명 객체에서 사용하는 매개 변수나 로컬 변수의 값을 익명 객체 내부에 복사해두고 사용한다.
- 매개변수나 로컬 변수가 수정되어 값이 변경되면 익명 객체에 복사해 둔 값과 달라지므로 매개 변수나 로컬 변수를 final 로 선언해야 함.
[확인 문제]
package yeong.verify.exam01;
public class Anonymous {
Worker field = new Worker() {
@Override
public void start() {
System.out.println("디자인을 합니다.");
}
};
void method1() {
Worker localVar = new Worker() {
©Override
public void start() {
System.out.println("개발을 합니다.");
}
};
localVar.start();
}
void method2(Worker worker) {
worker.start();
}
}
package yeong.verify.exam01;
public class AnonymousExample {
public static void main(String[] args) {
Anonymous anony = new Anonymous();
//익명 객체 필드 사용
anony.field.start();
//익명 객체 로컬변수 사용
anony.methodl();
//익명 객체 매개값 사용
anony.method2(
new Worker() {
@Override
public void start() {
System.out.println("테스트를 합니다.");
}
}
);
}
}
package yeong.verify.exam02;
public class Anonymous {
Vehicle field = new Vehicle() {
@Override
public void run() {
System.out.println('자전거가 달립니다.');
}
};
void method1() {
Vehicle localVar = new Vehicle() {
@Override
public void run() {
System. out. println("승용차가 달립니다.");
}
};
localVar.run();
}
void method2(Vehicle v) {
v.run();
}
}
package yeong.verify.exam02;
public class AnonymousExample {
public static void main(String[] args) {
Anonymous anony = new Anonymous();
//익명 객체 필드 사용
anony.field.run();
//익명 객체 로컬변수 사용
anony.method1();
//익명 객체 매개값 사용
anony.method2(
new VehicleO {
@Override
public void run() {
System.out.println("트럭이 달립니다.");
}
}
);
}
}
package yeong.verify.exam03;
public class CheckBoxExample {
public static void main(String[] args) {
CheckBox checkBox = new CheckBox();
checkBox.setOnSelectListener(new CheckBox.OnSelectListener() {
@Override
public void onSelect() {
System.out.println("배경을 변경합니다.");
}
});
checkBox.select();
}
}
'JAVA' 카테고리의 다른 글
java.util 패키지 (0) | 2022.11.30 |
---|---|
java.lang 패키지 (2) | 2022.11.30 |
중첩 클래스와 중첩 인터페이스 (0) | 2022.11.15 |
타입 변환과 다형성 (0) | 2022.11.09 |
인터페이스 (0) | 2022.11.09 |