woowacourse-study / 2022-modern-java-in-action

우아한테크코스 4기 모던 자바 인 액션 스터디
10 stars 4 forks source link

익명클래스란 무엇인가? #15

Open bugoverdose opened 2 years ago

bugoverdose commented 2 years ago

문제

익명클래스(혹은 익명객체)라고 불리는 문법에 대해 최대한 자세하게 서술하시오.

선정 배경

<모던 자바 인 액션> 초반부부터 독자가 당연히 알 것이라고 간주하고 아무런 부연설명 없이 사용하고 있는 문법 중 하나이다. 동작 파라미터화, 특히 람다식에 대해 제대로 이해하기 위해서는 알고 있어야 하는 기초 지식이기 때문에 한 번 정리하고 들어갈 필요가 있어보인다.

관련 챕터

bugoverdose commented 2 years ago

익명 클래스는 간단히 말해 "클래스의 선언과 객체의 생성을 동시에 할 수 있는 문법"이다. 이를 사용하면 단 하나의 객체만을 생성하기 위해 굳이 별도의 클래스를 정의하지 않아도 된다.

해당 문법은 아래와 같은 특징을 지닌다.

  1. 다른 클래스를 상속하거나, 인터페이스 1개를 구현한 클래스만 선언할 수 있다.

    • new 부모클래스명() { /**/ } : 부모클래스를 상속한 익명 클래스를 선언하면서 객체를 1개 생성하여 반환.
    • new 인터페이스명() { /**/ } : 인터페이스를 구현한 익명 클래스를 선언하면서 객체를 1개 생성하여 반환.
    • 즉, 다른 클래스 혹은 인터페이스 없이는 익명 클래스 선언불가.
    • 또한 복수의 인터페이스를 구현하거나, 클래스 상속과 인터페이스 구현을 동시에 수행하는 등의 작업은 불가.
  2. 내부 클래스의 일종이다.

    • 자바에서 익명 클래스는 별도의 클래스 내부에서만 사용될 수 있기 때문에 당연하다.
    • 내부 클래스는 "인스턴스 클래스", "스태틱 클래스", "지역 클래스", "익명 클래스"로 총 4가지다.
  3. 컴파일 시점에 각 익명클래스마다 외부클래스명$숫자.class 형식의 클래스 파일이 생성된다.

    • 일반적인 클래스는 컴파일 시점에 클래스명.class 형식의 클래스 파일이 생성된다.
    • 일반적인 내부 클래스는 본인이 들어있는 외부 클래스와 자신의 클래스명이 합쳐진 외부클래스명$내부클래스명.class 형식의 파일이 생성된다.
    • 익명 클래스는 말 그대로 이름이 없는 클래스이기 때문에 클래스명 대신 생성된 순서대로 1,2,3과 같은 숫자가 붙여진다.

[출처] 자바의 정석

bugoverdose commented 2 years ago

클래스 파일 빌드 관련 부연 설명

빌드시 생성되는 내부 클래스 파일(.class)들은 IntelliJ에서 숨겨져있기 때문에 확인하기 어려울 수 있다. 그러나 분명 존재는 한다.

스크린샷 2022-03-12 오후 12 21 55

참고로 테스트해본 결과, 람다는 별도의 .class로 컴파일되지 않는다. JVM 기준으로 별개의 문법으로 인식하여 처리되기 때문으로 보인다.