본문 바로가기

study/java

자바/JAVA 익명 객체

익명 객체(Anonymous): 이름이 없는 객체. 어떤 클래스를 상속하거나, 인터페이스를 구현할 때 사용할 수 있다.

 

부모 클래스를 상속받는 익명 객체를 익명 자식 객체, 인터페이스를 구현하는 객체를 익명 구현 객체라고 한다.

 

익명 자식 객체: 자식 클래스가 재사용되지 않고 오로지 특정 위치에서 사용되는 경우 편리하다.

익명 구현 객체: 구현 객체 클래스가 재사용되지 않고 오로지 특정 위치에서 사용되는 경우 편리하다.

parentclass p = new parentclass(){...};
// 익명 자식 객체를 작성하는 법
interfaceA a = new interfaceA(){};
// 익명 구현 객체를 작성하는 법

 코드를 살펴보면, parentclass()을 상속하는 클래스를 대괄호({... }) 안에 작성하고 구현(new)해서 , parentclass p에 담는 방식이다. 익명 구현 객체도 같은 방식이다. 언뜻 보면 p 와 a 가 이름 같지만, 그게 아니라 익명 객체를 부모 클래스 p에 대입한 것이고, 인터페이스 a에 대입한 것이다.

 

 익명 객체는 부모 클래스를 상속 받거나, 인터페이스를 구현하는 객체이므로, 익명 클래스에서 부모 메소드, 인터페이스의 메소드를 재정의 할 수 있다.

 

익명 자식 객체 사용할 때

  • 클래스의 필드를 선언할 때, 초기값으로 익명 자식 객체를 생성해서 대입한다.
  • 메소드 내에 로컬 변수를 선언할 때, 초기값으로 대입한다.
  • 매개 변수의 매개 값으로 익명 객체를 선언해서 대입한다.
// 필드 선언 시
class A{
	Parent field = new Parent(){ . . . };
}

// 메소드 내에 로컬 변수 선언 시
class B{
	void method(){
    	Parent localvar = new Parent(){ . . . };
    }
}

// 매개변수의 매개값으로 대입
// 매개변수 타입이 부모 클래스나, 인터페이스일 때, 상속받는, 구현하는 객체를 넣을 수 있다.
void method(new Parent(){ . . . });

 

 

 당연히, 익명 자식 객체를 부모 타입 필드에 대입하면, 부모 클래스의 필드와 메소드만 사용 가능하다. 또한 재정의한 것이 있다면, 재정의한 내용이 호출된다.

 

 

익명 구현 객체도 익명 자식 객체와 같이 쓰인다. 인터페이스의 추상 메소드들을 재정의한다.

// 필드 선언 시
class A{
	interfaceA field = new interfaceA(){ . . . };
}

// 메소드 내에 로컬 변수 선언 시
class B{
	void method(){
    	interfaceA localvar = new interfaceA(){ . . . };
    }
}

// 매개변수의 매개값으로 대입
// 매개변수 타입이 부모 클래스나, 인터페이스일 때, 상속받는, 구현하는 객체를 넣을 수 있다.
void method(new interfaceA(){ . . . });

 

메소드 내 익명 객체가 메소드의 매개 변수, 로컬 변수를 사용할 때, 메소드가 종료되도 익명 객체가 계속 실행 상태로 남을 수 있다. -> 메소드가 종료되도 익명 객체가 힙 영역에 남기 때문에

 

그래서 매개 변수와 로컬 변수를 익명 객체 내부에 저장한다. 그렇게 하기 위해 익명객체가 사용하는 매개 변수와 로컬 변수는 final로 선언한다. 단, 메소드 변수가 아닌 클래스 필드는 final이 아니어도 사용할 수 있다.