728x90
익명(anonymous) 객체
- 이름이 없는 객체를 말하며, 프로그램에서 일시적으로 한 번만 사용되고 버려져 재사용이 되지 않는 객체이다.
- 하나의 코드로 여러 인스턴스를 만들 필요 없을 때 사용한다.
- 클래스의 선언과 객체 생성을 동시에 한다.
- 명시적으로 클래스를 선언하지 않으나 단독으로 생성할 수 없으며, 클래스를 상속하거나 인터페이스를 구현해야 생성 가능하다.
- 익명 객체는 필드값, 로컬 변수값, 매개변수값을 주로 사용된다.
- UI 이벤트 처리 객체나 스레드 객체를 간편하게 생성할 목적으로 많이 활용된다.
- 내부 클래스의 일종으로 외부의 지역 변수 이용할 때 똑같이 내부 클래스의 제약을 받는다.
- 내부 클래스에서 가져올 수 있는 변수는 final 상수만 사용 가능하다.
- 클래스를 상속해서 만들 경우 익명 자식 객체이며, 인터페이스를 구현해서 만들 경우 익명 구현 객체이다.
1. 익명 자식 객체(extends)
new 부모생성자(매개값, ...) {
// 필드
// 메소드
// 생성자 X
}
- 부모 클래스를 상속 받아 생성된다.
- 생성자를 선언할 수 없으며, 정의된 필드와 메소드는 익명 자식 객체 내부에서만 사용되고 외부에서는 접근이 불가능하다.
예제 코드1
더보기
/* example */
public class Anonymous {
public static void main(String[] args) {
/* 익명클래스의 객체 : 구현 클래스 없이 추상 클래스의 객체 생성 */
MyClass myClass = new MyClass() {
};
}
}
abstract class MyClass { }
예제 코드2
더보기

package ch09.sec07.exam01;
public class CarExample {
public static void main(String[] args) {
Car car = new Car(); // Car 객체 생성
car.run1(); // 익명 자식 객체가 대입된 필드 사용
car.run2(); // 익명 자식 객체가 대입된 로컬변수 사용
car.run3(new Tire() { // 익명 자식 객체가 대입된 매개변수 사용
@Override
void roll() {
System.out.println("익명 자식 Tire 객체 3이 굴러감");
}
});
}
}
class Tire {
void roll() {
System.out.println("일반 타이어 굴러감");
}
}
class Car {
private Tire tire1 = new Tire(); // 필드에 Tire 객체 대입
private Tire tire2 = new Tire() { // 필드에 익명 자식 객체 대입
@Override
void roll() {
System.out.println("익명 자식 Tire 객체1이 굴러감");
}
};
void run1() { // 메소드(필드 이용)
tire1.roll(); // "일반 타이어 굴러감"
tire2.roll(); // "익명 자식 Tire 객체1이 굴러감"
}
void run2() { // 메소드(로컬 변수 이용)
Tire tire = new Tire() { // 로컬 변수에 익명 자식 객체 대입
@Override
void roll() {
System.out.println("익명 자식 Tire 객체 2가 굴러감");
}
};
tire.roll();
}
void run3(Tire tire) { // 메소드(매개변수 이용)
tire.roll();
}
}

2. 익명 구현 객체(implements)
new 인터페이스() {
// 필드
// 메소드
// 생성자 X
}
- 구현 클래스를 작성하지 않고 구현 객체를 생성한다.
- 중괄호 {}에는 인터페이스에 선언되는 모든 추상 메소드들의 실체 메소드를 작성해야 한다.
- 필드와 메소드를 선언할 수는 있지만, 익명 객체 안에서만 사용 가능하며 인터페이스 변수로 접근 불가능하다.
참고 링크
[Java] Chapter 9.2 익명 객체
익명 객체의 개요 익명 객체는 이름이 없는 객체입니다. 익명 객체를 사용하기 위한 조건은 어떤 클래스를 상속하거나 인터페이스를 구현해야 사용할 수 있습니다. 익명 객체를 사용하면 부모
euni00.tistory.com
728x90
'IT > Java' 카테고리의 다른 글
[Java] 람다 작성법 (0) | 2024.03.14 |
---|---|
[Java] 람다식(Lambda Expressions) (0) | 2024.03.14 |
[Java] 중첩 인터페이스 (0) | 2024.03.13 |
[Java] 중첩 클래스(Nested Class) (0) | 2024.03.12 |
[Java] 타입 변환 (0) | 2024.03.12 |