JAVA
익명 클래스(Anonymous class)
🤖 Play with Android 🤖
2021. 9. 3. 11:25
728x90
익명 클래스
익명 클래스(anonymous class)란 다른 내부 클래스와 달리 이름을 가지지 않는 클래스를 의미한다.
익명 클래스는 클래스의 선언과 동시에 객체를 생성하므로, 단 하나의 객체만을 생성하는 일회용 클래스이다.
따라서 생성자를 선언할 수도 없으며, 오로지 단 하나의 클래스나 단 하나의 인터페이스를 상속받거나 구현할 수 있을 뿐이다.
이러한 익명 클래스는 매우 제한적인 용도에 사용되며, 구현해야 하는 메소드가 매우 적은 클래스를 구현할 때 주로 사용된다.
다음 코드는 자바의 윈도우 프로그래밍을 할 때 사용되는 AWT코드의 일부이다.
익명 클래스를 사용하지 않은 경우
import java.awt.*;
import java.awt.event.*;
public class AWT {
public static void main(String[] args) {
Button b = new Button("start");
b.addActionListener(new EventHandler());
}
}
// EventHandler 라는 이름을 가진 클래스 생성
class EventHandler implements ActionListener{
public void actionPerformed(ActionEvent e){
System.out.println("ActionEvent occurred!!!");
}
}
일반적인 방식으로 외부에 클래스를 만든 다음 사용하는 방식이다.
하지만 이 경우 이 클래스는 1회성이기 때문에 이러한 1회성 클래스가 많아진다면 효율성이 떨어질 수 있다.
익명 클래스를 사용하는 경우
import java.awt.*;
import java.awt.event.*;
public class AWT {
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!!!");
}
});
}
}
익명 클래스는 말 그대로 이름이 없으므로 조상 클래스의 이름을 가져와서 쓴다.
또 보는 것과 같이 클래스의 정의와 객체 생성을 동시에 한다. 이름이 없으므로 다시 만들 수가 없어 1회용인 특징이 있다.
다른 예시
import java.awt.*;
import java.awt.event.*;
public class AWT {
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!!!");
}
});
b.addActionListener(new ActionListener() { // 클래스의 정의과 객체 생성을 동시에
public void actionPerformed(ActionEvent e) {
System.out.println("ActionEvent occurred!!!");
}
});
}
}
위 코드 같은 경우 같은 익명 클래스를 2번 사용한 것일까?
그렇지 않다. 같은 내용의 익명클래스를 2번 만들어준 것이다.
클래스의 이름을 디버깅을 통해 확인하더라도 첫 번째 클래스는 AWT$1.class, 두번째 클라스는 AWT$1.class로 엄연히 다른 클래스임을 알 수 있다.