Open bugoverdose opened 2 years ago
익명 클래스는 간단히 말해 "클래스의 선언과 객체의 생성을 동시에 할 수 있는 문법"이다. 이를 사용하면 단 하나의 객체만을 생성하기 위해 굳이 별도의 클래스를 정의하지 않아도 된다.
해당 문법은 아래와 같은 특징을 지닌다.
다른 클래스를 상속하거나, 인터페이스 1개를 구현한 클래스만 선언할 수 있다.
new 부모클래스명() { /**/ }
: 부모클래스를 상속한 익명 클래스를 선언하면서 객체를 1개 생성하여 반환.new 인터페이스명() { /**/ }
: 인터페이스를 구현한 익명 클래스를 선언하면서 객체를 1개 생성하여 반환.내부 클래스의 일종이다.
컴파일 시점에 각 익명클래스마다 외부클래스명$숫자.class
형식의 클래스 파일이 생성된다.
클래스명.class
형식의 클래스 파일이 생성된다.외부클래스명$내부클래스명.class
형식의 파일이 생성된다.1,2,3
과 같은 숫자가 붙여진다.[출처] 자바의 정석
빌드시 생성되는 내부 클래스 파일(.class)들은 IntelliJ에서 숨겨져있기 때문에 확인하기 어려울 수 있다. 그러나 분명 존재는 한다.
참고로 테스트해본 결과, 람다는 별도의 .class로 컴파일되지 않는다. JVM 기준으로 별개의 문법으로 인식하여 처리되기 때문으로 보인다.
문제
익명클래스(혹은 익명객체)라고 불리는 문법에 대해 최대한 자세하게 서술하시오.
선정 배경
<모던 자바 인 액션> 초반부부터 독자가 당연히 알 것이라고 간주하고 아무런 부연설명 없이 사용하고 있는 문법 중 하나이다. 동작 파라미터화, 특히 람다식에 대해 제대로 이해하기 위해서는 알고 있어야 하는 기초 지식이기 때문에 한 번 정리하고 들어갈 필요가 있어보인다.
관련 챕터