코린이의 소소한 공부노트

익명 클래스 본문

Java

익명 클래스

무지맘 2022. 5. 19. 12:56

일반적으로 객체는 클래스를 만든 다음 new를 이용해 생성하게 된다.

class Test { } // 클래스 정의
Test t = new Test(); // 객체 생성

이번에 볼 익명 클래스는 일반 클래스와는 다르게 선언한다.

1. 이름이 없는 일회용 클래스이다.

  - 선언을 할 때 자기 이름이 없기 때문에, 조상 클래스의 이름을 빌려오거나 자기가 구현한 인터페이스의 이름을 빌려오게 된다.

2. 클래스 정의와 생성을 동시에 한다.

  - 그래서 클래스 선언인데도 new 키워드를 이용한다.

new 조상클래스이름(){
    // 클래스 내용 - 멤버 선언
}

new 구현인터페이스이름(){
    // 클래스 내용 - 멤버 선언
}

Test 클래스 내부에서 익명 클래스를 한번 만들어보았다.

class Test{
    // 1) Object 클래스를 조상으로 하고, 메서드 1개가 있는 익명 클래스
    Object iv = new Object(){ void method(){} };
    static Object cv = new Object(){ void method(){} };
    
    // 2) 메서드 내부에도 익명 클래스 선언 가능
    void testMethod() {
        Object lv = new Object(){ void method(){} };
    }
}

이 코드를 컴파일하면 Test.class, Test$1.class, Test$2.class, Test$3.class의 클래스 파일 4개가 생성된다. 내부 클래스라서 외부 클래스인 Test 뒤에 $가 붙고, 익명 클래스라서 이름이 없기 때문에 $ 뒤에 숫자만 쓰여있다.

 

익명 클래스는 이벤트 처리에 주로 쓰인다. 예를 들어 시작 버튼을 누르면 게임이 시작되는 이벤트가 있다고 해보자.

import java.awt.*; // 자바의 윈도우 프로그래밍 도구
import java.awt.event.*;

class Game {
    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("Game Start!");
    }
}

처음에 한번 쓰이는 기능을 클래스를 정의해서 객체를 생성하는 복잡한 일을 하고 싶지 않다. 그래서 익명 클래스를 쓰는 것이다. EventHandler라는 클래스 이름을 지우고, 자기가 구현한 인터페이스의 이름인 ActionListener를 써서 익명 클래스를 작성해보면 다음과 같다.

// 1) new 다음부터 조상 클래스(인터페이스)이름을 지우고
b.addActionListener(new /* 여기부터 */ EventHandler());

class EventHandler implements /* 여기까지 */ ActionListener {
    public void actionPerformed(ActionEvent e) {
        System.out.println("Game Start!");
    }
}

// 2) 클래스 구현부를 작성할 블록{}을 만들고
b.addActionListener(new ActionListener { // 괄호 추가해주고
    public void actionPerformed(ActionEvent e) {
        System.out.println("Game Start!");
    }
}); // 괄호 닫고 세미콜론;으로 마무리

// 3) 들여쓰기를 이용해 예쁘게 정리해주면 아래와 같이 된다.
import java.awt.*;
import java.awt.event.*;

class Game {
    public static void main(String[] args) {
        Button b = new Button("Start");
        b.addActionListener(new ActionListener() { // 익명 클래스 시작
            public void actionPerformed(ActionEvent e) {
            System.out.println("Game Start!");
            }
        }); // 익명 클래스 끝        
}

위 코드를 컴파일하면 Game.class, Game$1.class 파일 2개가 만들어질 것이다. 만약 똑같은 내용의 addActionListener를 하나 더 만들게 되면 Game$2.class 파일 1개가 더 생길 것이다. 내용이 같은 익명 클래스지만 다른 것으로 간주한다.

import java.awt.*;
import java.awt.event.*;

class Game { // Game.class
    public static void main(String[] args) {
        Button b = new Button("Start");
        b.addActionListener(new ActionListener() { // Game$1.class
            public void actionPerformed(ActionEvent e) {
            System.out.println("Game Start!");
            }
        });    
        b.addActionListener(new ActionListener() { // Game$2.class
            public void actionPerformed(ActionEvent e) {
            System.out.println("Game Start!");
            }
        });
}

 

'Java' 카테고리의 다른 글

예외 메시지 출력  (0) 2022.05.24
프로그램 오류의 종류와 예외 처리  (0) 2022.05.19
내부 클래스  (0) 2022.05.19
디폴트 메서드  (0) 2022.05.15
인터페이스의 장점  (0) 2022.05.13