Myo-Kyeong Tech Blog

[ JAVA ] JAVA 익명 클래스(Anonymous Class) 본문

Programming/Java

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

myo-kyeong 2023. 7. 8. 22:41
728x90
반응형

익명 클래스란?

  • 이름 없이 한 번만 사용되는 클래스
  • 클래스 선언과 객체의 생성이 동시에 이루어짐
  • 보통 GUI 애플리케이션의 이벤트 리스너, 스레드 등 즉석에서 생성하는 데 사용
new className() {
    // methods and fields
};

 

익명 클래스 사용

익명 클래스를 사용하면 클래스 선언을 생략하고 코드를 간결하게 만들 수 있다는 점이 가장 큰 장점인데요. 특히 한 번만 사용되는 이벤트 리스너 같은 경우에 매우 유용합니다. 또한, 익명 클래스는 해당 클래스가 사용되는 곳에 직접 코드를 작성하므로 코드를 읽는 사람이 이해하기 쉬운 장점을 가지고 있습니다. 

 

[익명 클래스를 사용하지 않는 경우]

import java.awt.event.*;  
import javax.swing.*; 

class MyActionListener implements ActionListener {
    public void actionPerformed(ActionEvent e) {  
        System.out.println("Button clicked!");  
    }  
}

public class Main {
    public static void main(String[] args) {  
        JFrame frame = new JFrame("Button Example");  
        JButton button = new JButton("Click Here");  
        MyActionListener listener = new MyActionListener();
        button.addActionListener(listener); 
        // 나머지 코드 
    }
}

위 예시에서는 별도로 'MyActionListener 클래스를 정의하고, 이 클래스의 객체를 생성하여 버튼에 리스너로 추가하였습니다. 

 

[익명 클래스를 사용하는 경우]

import java.awt.event.*;  
import javax.swing.*;  

public class Main {
    public static void main(String[] args) {  
        JFrame frame = new JFrame("Button Example");  
        JButton button = new JButton("Click Here");  
        button.addActionListener(new ActionListener() {  
            public void actionPerformed(ActionEvent e) {  
                System.out.println("Button clicked!");  
            }  
        }); 
        // 나머지 코드 
    }
}

익명 클래스를 사용하는 경우는 ActionListener 인터페이스를 구현한 별도의 클래스를 생성할 필요가 없습니다. 대신, 바로 버튼 액션 리스너로 익명 클래스를 추가하여 익명 클래스를 사용하지 않은 경우보다 훨씬 코드가 간결해진 것을 볼 수 있습니다. 

 

익명 클래스 제한사항

  1.  생성자를 가질 수 없다 : 익명 클래스는 이름이 없으므로, 생성자를 가질 수 없습니다. 초기화를 위해 인스턴스 초기화 블럭을 사용할 수는 있지만, 생성자를 통한 초기화는 불가능합니다. 
  2. 단일 상속만 가능합니다 : 익명 클래스는 오직 하나의 클래스를 상속하거나 하나의 인터페이스만 구현할 수 있습니다. 따라서, 한 번에 여러 인터페이스를 구현하거나 클래스를 상속하면서 인터페이스를 구현하는 것은 불가능합니다.
  3. 한 번만 사용 가능합니다 : 익명 클래스는 재사용이 불가능합니다. 동일한 익명클래스를 다른 곳에서 사용하려면 코드를 다시 작성해야 합니다. 
  4. "this"는 익명 클래스 자체를 가리킵니다 : 익명 클래스 내에서 "this" 키워드를 사용하면, 익명 클래스 자체를 가리킵니다. 이는 익명 클래스가 정의된 매서드나 클래스를 가리키지 않음을 의미합니다. 
  5. 비정적(static) 이너 클래스처럼 작동합니다 : 익명 클래스는 그것이 정의된 클래스의 비정적 필드와 메서드에 접근할 수 있지만, 정적 필드나 메서드에는 접근할 수 없습니다. 
  6. 지역 변수에 대한 제한 : 익명 클래스에서 사용하는 지역 변수는 final이거나 effective final 이어야 합니다. 익명 클래스 내부에서 지역 변수가 변경될 수 없음을 의미합니다. 

 

이러한 제한 사항 때문에, 복잡한 로직을 가진 클래스나 재사용이 필요한 클래스는 별도의 클래스로 선언하는 것이 바람직합니다. 익명 클래스는 일회성으로 사용되는 간단한 클래스에 대해 코드를 간결하게 만드는 데 주로 사용됩니다. 

728x90
반응형