나의 IT일지
익명 객체 본문
상속, 구현 클래스를 만들고 생성자를 해당 객체를 만드는 생성하는 것이 일반적이다. 그리고 자식클래스를 한번 선언해 놓으면 여러 곳에서 객체를 사용할 수 있다.
상속 | 구현 |
class 클래스명 extends 부모클래스명{ ... } |
class 클래스명 implements 인터페이스명{ ... } |
부모클래스 변수 = new 자식 클래스( ); | 인터페이스 변수 = new 구현 클래스( ); |
하지만 일반적인 방법 말고 객체를 생성할 때 설정하는 방법이 있는데, 이를 익명 객체라고 한다.
익명 객체
익명 객체는 클래스 이름이 없는 객체로, 상속이나 구현을 사용하는 경우에만 사용된다. 이때, 해당 익명 객체를 생성할 때 사용된 클래스는 재사용이 불가능하다.
익명 자식 객체 생성 | 익명 구현 객체 생성 |
new 부모클래스( ){ 타입 변수; 타입 메서드; } |
new 인터페이스( ){ 타입 변수; 타입 메서드; } |
즉, 위의 구조는 "부모클래스, 인터페이스를 상속, 구현해서 블록의 내용으로 자식 클래스를 선언하라는 뜻"이며, new연산자를 통해 자식클래스를 객체로 생성된다. 그리고 해당 객체의 주소를 부모클래스나 인터페이스타입의 참조변수에 저장히면 해당 객체를 참조변수를 통해 접근이 가능하다.
이때 블록 내에는 변수나 메서드를 선언하거나 부모 클래스의 메서드를 재정의한 내용을 작성해야 한다. 특히 인터페이스나 추상메서드의 경우에는 부모 클래스의 메서드를 재정의해야 한다. 하지만 익명 객체에서 새롭게 정의된 변수나 메서드는 익명 객체 내부에서만 사용가능하고 외부에서는 접근이 불가능하다. 왜냐하면 익명 객체는 부모 타입 변수에 대입되므로 부모,인터페이스 타입에 선언된 것만 사용할 수 있는 것이다.
package pack0502;
class Outer{
void a() {System.out.println("a"); }
}
package pack0502;
public class Code3 {
public static void main(String[] args) {
Outer o = new Outer() {
void a() {
System.out.println("method a");
}
int b=10;
void c() {System.out.println(b);}
};
Outer k = new Outer();
o.a();
k.a();
// o.c();
}
}
Comments