본문 바로가기
Java

Inner Class - Anonymous class(익명 클래스)

by GGShin 2022. 5. 10.

이번에는 Anonymous class에 대해서 알아보려고 합니다. 직역하면 익명 클래스인데요, 말 그대로 이름이 없는 클래스입니다. 

지난번에 알아본 local class와 기능은 유사하지만 다만 이름이 없다는 특징이 있습니다. 따로 이름을 붙이지 않기 때문에 선언과 생성이 동시에 이루어지게 됩니다. 

버튼에 쓰이는 이벤트 핸들러(event handler)에 주로 사용이 된다고 합니다. 애플리케이션을 보면 한 화면에 여러 가지 버튼이 있는데, 이전 페이지로 가기, 확인 버튼, 글 상단으로 가기 등 각 버튼이 수행하는 기능이 다릅니다. 그럴 때 기능마다 클래스 파일을 따로 만들기 보다는 익명 클래스를 사용해서 간편하게 기능을 구현하는 것입니다.

 

제가 수강하고 있는 udemy강의에서 활용한 예시로 한 번 살펴보겠습니다. (난이도가 높아 이해하는 데 한참 걸렸던 내용이었습니다.🥲)

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
public class Main {
    private static Button btnPrint = new Button("Print Button");
 
    public static void main(String[] args) {
 
        class ClickListener implements Button.OnClickListener{
            public ClickListener() {
                System.out.println("New Listener created.");
            }
 
            @Override
            public void onClick(String title) {
                System.out.println(title + " was clicked.");
            }
        }
 
        btnPrint.setOnClickListener(new ClickListener());
        btnPrint.onClick();
    }
}
cs

 

위의 예시에서는 main method 안에 local class로 ClickListener라는 클래스를 만들어 이용하고 있습니다. Line#17을 보시면 해당 클래스를 btnPrint라는 Button class object의 setOnClickListener method의 parameter로 넘겨주었습니다. 예시의 local class를 간략하게 설명하면, 버튼이 클릭됐을 때 어떠한 동작을 일으킬 것인지를 정의해 둔 클래스입니다. Line#11를 보면 오버라이드 된 onClick method은 버튼이 클릭 되었을 때 "(버튼 타이틀) was clicked." 라는 문장이 콘솔에 찍히도록 설정되어 있습니다. 

이렇게 local class를 사용하면, 같은 동작을 수행하는 버튼들의 경우 Line#17에 작성한 것처럼 각 버튼 인스턴스마다 해당 local class를 parameter로 설정해주면 됩니다. 하지만 버튼마다 다른 동작을 수행하게 하고 싶다면, 다른 클래스를 작성해야 하겠죠. 그럴 때 매번 local class를 만들기 보다는 anonymous class를 만들어서 사용하면 더욱 편리해집니다. 

 

btnPrint.setOnClickListener(new ClickListener());

 

우리가 .setOnClickListener()의 parameter로 넘겨주어야 할 대상은 바로 Button 클래스 안에 있는 OnClickListener interface 입니다. 그 파라미터 부분에 new ClickListener() 대신 바로 Button.OnClickListener*로 interface를 넘겨줍니다. 

*inner interface는 명시하지 않아도 static이므로 enclosing class의 인스턴스 없이도 사용이 가능합니다!

 

IntelliJ IDE를 사용하면, 위에 사진처럼 자동으로 해당 interface를 이용한 anonymous class를 생성해줍니다.

엔터를 눌러서 적용을 해주면 아래처럼 override 해야하는 함수까지 나오게 됩니다. 

 

 

그러면 override 하는 onClick method block 안에 원하는 동작을 작성해주면 됩니다.

 

1
2
3
4
5
6
  btnPrint.setOnClickListener(new Button.OnClickListener() {
            @Override
            public void onClick(String title) {
                System.out.println(title + " was clicked.");
            }
        });
cs

 

아까전에 local class에 사용했던 같은 문장을 프린트하도록 하겠습니다. 

이렇게 하고 btnPrint.onClick()을 해주면 아래 콘솔 창에 제대로 원하는 문장이 나왔음을 확인할 수 있습니다.

 

Button 인스턴스를 하나 더 만들어서 다른 동작을 넣어보겠습니다.

뒤로가기 버튼을 만들었고, 해당 버튼의 onClick method를 동작시키면 To previous page... 가 콘솔에 찍히도록 해보았습니다.

1
2
3
4
5
6
7
8
9
10
11
private static Button btnGoBack = new Button("Go back");
 
    public static void main(String[] args) {
          btnGoBack.setOnClickListener(new Button.OnClickListener() {
            @Override
            public void onClick(String title) {
                System.out.println("To previous page...");
            }
            });
 
    }
cs

 

확인해 보니 정상적으로 동작하는 것을 볼 수 있었습니다. 

 

 

이렇게 Anonymous class에 대해서도 한 번 알아보았습니다.

하나의 클래스 내에서만 사용이 되고 method의 기능별로 일일이 class를 정의하는 것이 번거로운 상황에서는 anonymous class가 유용하게 쓰인다는 것을 알 수 있었습니다. 

 

보충할 내용이나 수정이 필요한 내용이 보인다면 댓글로 꼭 알려주세요!

감사합니다 ☺️

 


참고 자료

https://www.javatpoint.com/anonymous-inner-class#:~:text=Java%20anonymous%20inner%20class%20is,to%20actually%20subclass%20a%20class.

 

반응형

'Java' 카테고리의 다른 글

Final 키워드 알아보기  (0) 2022.05.16
Static 키워드 알아보기  (0) 2022.05.12
Inner class - local class  (0) 2022.05.09
Inner class 알아보기  (0) 2022.05.09
Interface(인터페이스) 알아보기(1)  (0) 2022.05.07