Java에서 익명클래스에 대한 착각(a illusion of anonymous inner class)

안드로이드 책을 보다가 익명클래스에 대한 설명이 잘 되어있어 그것들을 정리해 보고자 한다.

예제 소스를 통해서 익명클래스에 대한 착각을 설명하겠다.

1번 예제

1
AAA aaa = new AAA();

1번 예제는 아주 단순한 예제이다. AAA이라는 클래스에 객체를 생성하는 소스이다.

2번 예제

1
2
3
4
5
BBB bbb = new BBB(){
public void gazaaaaa(){
System.out.println("가즈아ㅏㅏㅏㅏㅏ ~ 2018");
}
};

2번 예제를 보면, 익명클래스를 구현하는 소스이다. 여기서 쉽게 할 수 있는 착각은 bbb는 BBB라는 클래스의 객체라고 생각 할 수 있다. 하지만 여기선 bbb는 BBB라는 클래스의 객체가 아니라 BBB라는 클래스를 확장한 익명 클래스의 객체이다.

만약 BBB가 클래스라면 bbb는 BBB를 상속받은 이름 없는 하위 클래스를 선언하고 그 객체를 부여 받은 것이고, BBB가 인터페이스라면 bbb는 BBB라는 인터페이스를 구현한 이름 없는 클래스의 객체를 부여받게 된다.

조금 더 자세한 소스로 확인해 보자. 아래는 예제로 만들어본 Test01.java 라는 파일의 간단한 소스이다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
class BBB{
public void gazaaaaa(){

}
}

public class Test01 {

public static void main(String[] args) {

BBB bbb1 = new BBB() {
public void gazaaaaa(){
System.out.println("가즈아ㅏㅏㅏㅏㅏ ~ 2018");
}
};

bbb1.gazaaaaa();

BBB bbb2 = new BBB();

System.out.println("bbb1 클래스명:" + bbb1.getClass().getName());
System.out.println("bbb2 클래스명:" + bbb2.getClass().getName());
}

}

위 소스 실행결과

결과를 보면 알겠지만, BBB클래스의 익명클래스의 객체인 bbb1의 클래스 네임은 BBB로 나오지 않고, Test01$1 이라고 나온다. Test01$1 이라는 표현은 익명클래스의 표현 방식이라고 한다.

Related Posts

자바 익명클래스(java anonymouse class)