익명 클래스
익명 클래스는 특이하게도 다른 내부 클래스들과 달리 이름이 없다. 클래스의 선언과 객체의 생성을 동시에 하기 때문에 단 한번만 사용될 수 있고 오직 하나의 객체만을 생성할 수 있는 일회용 클래스이다. 이름이 없기 때문에 생성자도 가질수 없으며, 조상클래스의 이름이나 구현하고자 하는 인터페이스의 이름을 사용해서 정의하기 때문에 하나의 클래스로 상속받는 동시에 인터페이스를 구현하거나 둘 이상의 인터페이스를 구현할 수 없다. 오로지 단 하나의 클래스를 상속받거나 단 하나의 인터페이스만을 구현할 수 있다.
class InnerEx6 {
Object iv = new Object(){ void method(){} }; // 익명클래스
static Object cv = new Object(){ void method(){} }; // 익명클래스
void myMethod() {
Object lv = new Object(){ void method(){} }; // 익명클래스
}
}
실행결과)
InnerEX6.class
InnerEX6$1.class(익명 클래스)
InnerEX6$2.class(익명 클래스)
InnerEX6$3.class(익명 클래스)
익명클래스는 이름이 없기 때문에 '외부클래스명$숫자1.class' 형식으로 클래스파일명이 결정된다.
import java.awt.*;
import java.awt.event.*;
class InnerEx7
{
public static void main(String[] args)
{
Button b = new Button("Start");
b.addActionListener(new EventHandler());
}
}
class EventHandler implements ActionListener
{
public void actionPerformed(ActionEvent e) {
System.out.println("ActionEvent occurred!!!");
}
}
import java.awt.*;
import java.awt.event.*;
class InnerEx8
{
public static void main(String[] args)
{
Button b = new Button("Start");
b.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
System.out.println("ActionEvent occurred!!!");
}
} // 익명 클래스의 끝
);
} // main메서드의 끝
} // InnerEx8클래스의 끝
앞의 예제에서 익명클래스를 이용해서 변경한 것이 바로 밑의 예제이다. 먼저 두 개의 독립된 클래스를 작성항 다음에, 다시 익명 클래스를 이용하여 변경하면 보다 쉽게 코드를 작성할 수 있다.