오늘은 자바의 익명클래스(Anonymous Class) 혹 무명클래스 에 관해 포스팅을 할 것이다.
익명클래스는 말 그대로 익명의 성질을 가진 클래스라는 뜻이다. 즉 이름이 없는 클래스라고 불리우는데,
'이름이 없는' 이란 의미를 잘 생각해봐야 한다. 아래의 예시를 보자.
public class Test{ private int num = 1; public int getNum(){ return this.num; } public void setNum(int num){ this.num = num; } }
Test란 클래스이다. 멤버변수 num 을 private로 접근을 제어한 후,
게터와 세터로 멤버변수를 접근할 수 있도록 만들었다.
Test t1 = new Test();
평상시 처럼 인스턴스를 사용할땐 위와 같이 사용한다.
여기서의 인스턴스 (new Test())는 클래스 이름 'Test'라고 불리운다.
즉 우리가 노말하게 쓰는 인스턴스는 '이름이 있는 클래스' 인것이다.
그렇다면 '이름이 없는 클래스'는 무엇을 의미하는 것 일까?
위에서 설명한 이름이 있는 클래스의 반대 경우이다.
즉 Test와 같은 클래스이름 자체가 없는 클래스를 의미한다. 아래의 예시를 보자.
Test t1 = new Test(){ public int num = 10; @Override public int getNum(){ return this.num; } };
바로 위의 소스코드랑은 비슷하면서도 다른점이 있다. 다른점은 인스턴스 옆에 블럭이 있다는 점이겠다.
언뜻 보면 new Test()라는 소스코드 때문에 이 인스턴스는 Test의 이름을 가질 것 같지만,
결코 아니다. 이 인스턴스야 말로 정말 어떠한 이름도 없는 인스턴스 인 것이다.
해당 주장이 맞는 주장인지 근거를 제시해보겠다.
먼저, 해당 인스턴스의 블럭안에는 @Override 어노테이션 주석이 존재한다. 즉, 원래의 Test 클래스에
존재하던 getNum 메서드가 아닌 재정의된 메서드 인점,
또한, 이 인스턴스의 this.num을 출력했을 경우 10이 나온다는 점이다.
오히려 이 인스턴스는 Test 클래스를 상속받은 클래스라고 바꿔 말해도 될 것이다.
평소에 자바언어를 사용하는 사용자라면, 상속을 어떻게 쓰는지 알 것이다.
클래스명 extends 상속받을 클래스 구조로 사용하는데 위의 소스 코드는 클래스명이 존재 하지 않고
무명의 어떠한 클래스가 부모클래스로 부터(Test) 상속을 받은 인스턴스 인 것이다.
즉 이름이 없으므로 생성자를 선언 할 수도 없는것이다.
왜 이름이 없는 클래스라고 불리우는지 감이 잡히는가?
익명클래스에 대해 간단하게 알아보았다. 현재 함수형 프로그래밍이 유행하고 있다.
자바에서는 함수를 일급객체로 취급하지 못하지만, 위에서와 같이 익명클래스를 사용하면
메서드 자체는 못넘기되 메서드를 감싼 익명클래스를 넘길 수 는 있다.
즉, 익명클래스로 자바도 함수형 프로그래밍 흉내를 낼 수 있다고 생각한다.
'Java' 카테고리의 다른 글
JAVA Static이란? (2) | 2016.03.29 |
---|---|
자바 enum 열거형 (0) | 2016.01.27 |
JAVA의 삼항연산자 (4) | 2015.12.11 |
JAVA의 생성자 (2) (2) | 2015.11.17 |
JAVA의 생성자 (1) (0) | 2015.11.12 |
포스팅이 도움 되셨다면, 커피 한잔 후원해주세요!
더 좋은 포스팅 작성에 큰 힘이 됩니다.