[Java] 익명 클래스 (Anonymous Class)[Java] 익명 클래스 (Anonymous Class)

Posted at 2009. 1. 11. 17:39 | Posted in 프로그래밍 언어/Java
Form GUI 프로그래밍을 할 때 버튼 없이는 되는게 없다는 생각을 할 정도로 GUI 프로그래밍을 할 때 버튼은 거의 꼭 넣곤 한다. 예전에 Swing을 써서 어플리케이션을 만들었는데 버튼에 이벤트를 줘야 했다. 그러나 Swing은 처음. 익명 클래스? 그게 뭥믜 할 시절, 난 다음과 같이 코드를 싸질렀다.
class ButtonActionListener implements ActionListener
{
    public void actionPerformed(ActionEvent e)
    {
        // Do something...
    }
}

// in main..

JButton button = new JButton("OK");
button.addActionListener(new ButtonActionListener());

버튼 하나 만들 때마다 클래스 수가 증가했고 보기도 힘들더라... 고작 actionPerformed 메서드 하나 있는 ActionListener 인터페이스를 구현해서 넣을 건데 클래스를 따로 만들어야 되다니!!

찾아보니 자바엔 Anonymous Class가 있더라. 뭔고 하니 다음과 같은 것이다.

JButton button = new JButton("OK");
button.addActionListener ( new ActionListener() {
    public void actionPerformed(ActionEvent ev)
    {
        // Do Something...
    }
} );

클래스를 따로 만들 필요가 없다. new 구현한 클래스 이름() 대신, 그냥 위와 같이
new 구현하고자 하는 인터페이스 이름() {    구현해야 하는 메서드 구현    }
끝이다.

다른 표현으론 요론식

interface MyInterface
{
    public void function();
}
public class AnonymousClassFromInterface {
    public static void main(String[] args)
    {
        MyInterface mi = new MyInterface(){
            public void function(){
                System.out.println("익명함수");
            }
        };
        mi.function();
    }
}

output >> 익명함수

인터페이스를 구현한 객체를 만들어야 하는데 그 객체는 어떤 부분에서 제한적으로 사용이 되고 구현해야 하는 메서드 숫자도 매우 적을 경우 익명 클래스를 사용하면 좋다.

↑ 참고사이트: http://happystory.tistory.com/64

만약 Swing에서 한 패널이 있고 그 패널에 버튼이 있는 상태인 경우, 그 패널을 클래스화 시켜서 사용중이라면 다음과 같은 방법도 가능하다.

class SomePanel extends javax.swing.JPanel implements ActionListener{
    private
JButton button1;
    private JButton button2;
    private JButton button3;
    public SomePanel(){
        button1 = new JButton("버튼1");
        button1.addActionListener(this);
        this.add(button1);

        button2 = new JButton("버튼2");
        button2.addActionListener(this);
        this.add(button2);

        button3 = new JButton("버튼3");
        button3.addActionListener(this);
        this.add(button3);
    }
    public void actionPerformed(ActionEvent arg0) {
        // Do Something...
        Object obj = arg0.getSource();
        if(obj == button1) {
            System.out.println("버튼1");
        } else if(obj == button2) {
            System.out.println("버튼2");
        } else if(obj == button3) {
            System.out.println("버튼3");
        }
    }
}


옛날에 구현해 놓은거 열어 보니 저렇게 구현이 되어 있었다. 뭘 보고 저렇게 구현했는지는 잘 모르겠다-_-;; 그런데 리스너로 this 막 넘겨주고 해도 괜찮을까 모르겠다.  메모리 해제가 안 될 것 같기도 하고;;
참고로 getSource() 는 이벤트가 일어난 객체를 리턴한다. 패널의 모든 버튼이 같은 일을 하면 필요 없겠지만 보통 안 그렇기 때문에 저런 방법을...

//