article thumbnail image
Published 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로 엄연히 다른 클래스임을 알 수 있다.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

복사했습니다!