왜 무명클래스가 아니라 익명클래스인가🤔?

sojukang·2022년 4월 7일
0

JAVA

목록 보기
3/3

💩똥글입니다. 불행히 이 글을 클릭하셨다면 언제든 뒤로가기 누를 준비를 하십시오. 아무 공신력이 없는 필자 생각입니다.

결론🌟

1.익명의anonymous 사이에는 다소 의미 차이가 있다. 익명의무명의 뜻에 쓸 수 없지만 anonymousunnamed(무명)의 의미로 써도 논리적으로 틀리지는 않는다.
2. (논리) 부모 클래스나 인터페이스의 이름 뒤에 숨거나 (컴파일) 호출한 클래스의 이름 뒤에 숨어 익명이 되기 때문에.

익명클래스(Anonymous class)란🧐?

익명(anonymous) 클래스는 이름이 없는 클래스를 말한다. 익명 클래스는 단독으로 생성할 수 없고 클래스를 상속하거나 인터페이스를 구현해야만 생성할 수 있다.

신용권, 이것이 자바다

원문은 클래스가 아니라 객체라고 쓰는데, 클래스와 객체는 다르다고 생각하여 클래스로 바꿔 인용하였다. 익명클래스는 주로 재사용되지 않을 클래스를 구현하거나, 테스트용 클래스를 구현할 때 사용한다.
Java 8에서 등장한 람다도 익명클래스의 일종인데, 최근에 자바를 학습한 사람이라면 익명클래스보다 람다를 먼저 접하고 사용했을 가능성이 크다(저도 그랬습니다!!!). 이 글을 본다면 모르시는 분은 없겠지만, 예시 코드는 다음과 같다.

private static void fight(Navy navy, Pirates pirates) {
    navy.work();
    pirates.work();
}

NavyPirates 타입을 매개변수로 받는 메서드 fight를 가정해보자.

public static void main(String[] args) {
        fight(new Akainu(), new Commander() {
            @Override
            public void work() {
                System.out.println("에이스... 죽는다");
            }
        });
    }
public abstract class Commander implements WhiteBeard, Pirates {
}

Navy의 구현체로 Akainu가 들어왔고, Pirates의 구현체로 익명클래스가 들어왔다. 예시 코드의 예상 동작으로 에이스는 죽는다를 기대할 수 있고, 실행 결과는 다음과 같다.

명구!!!
에이스... 죽는다

에이스죽는다

특정 만화와 관계 없습니다

왜 무명클래스가 아니라 익명클래스인가🤔?

현실 언어적 접근🧑‍🏫

한국인이 좋아하는 3대 말버릇이 아니, 근데, 왜인데, 외국 한번 못 나가본 토종 한국인인 내 머릿속에 문득 의문이 떠올랐다. 아니 근데 왜 무명클래스가 아니라 익명클래스인가? 여러 문헌에서 익명클래스를 설명할 때 이름이 없는이라는 표현을 쓰는데, 아니 근데 익명이름이 없는이 아니라 이름을 숨기는이 아닌가? 국립 국어원에 의하면 다음과 같다.

익명(匿 숨길 익, 名 이름 명)
이름을 숨김. 또는 숨긴 이름이나 그 대신 쓰는 이름.

표준국어대사전

아무리 생각해도 이름이 없는 것과 이름을 숨기는건 다르다. 숨긴다는 건 이미 존재를 전제하지 않는가? 이름이 없는 부재(不在) 상태와는 다르다. 젖먹이 때 졸업하는 대상영속성(object permanence, 대상 null 속성 아님^^)도 부재숨는 것을 구분하는 능력 아닌가!

다시 생각해봐도 익명클래스가 아니라 차라리 무명클래스가 더 옳지 않은가?

무명(無 없을 무, 名 이름 명)
이름이 없거나 이름을 알 수 없음.

표준국어대사전

후... 지긋지긋한 공대생의 경험으로 용어가 헷갈리는 경우 90%는 번역 잘못이고, 그 대부분은 일본식 한자가 기원이다. 일본에서 건너 온 것은 아니라고 일단 믿고... 원어인 anonymous의 뜻을 찾아보자.

made or done by someone whose name is not known or not made public

Cambridge Dictionary

원어인 anonymous이름을 숨기는의 의미에 가깝다. 흠~ 하고 넘어갈 찰나 다른 사전에서 흥미로운 뜻을 발견했다.

not named or identified

Merriam-Webster Dictionary

이럴수가!!! anonymous익명에는 없는 이름이 없는의 의미마저 가지고 있는 것일까?? 기원은 어떨까?
anonymousOrigin

from Oxford Languages

똑똑히 보이는 without namenameless!!! 이쯤 되면 Anonymous Class는 충분히 논리적인 이름으로 보인다. 그러나 의문 해결을 외치기 전 한 번 더 의심해봐야 개발 어린이 아니겠는가??

그리하여 HiNative 사이트에서 원어민에게도 질문해봤다. Anonymous이름이 없는에 해당하는 쓰임이 있느냐고.

hiNative1

한없이 부끄러운 영어실력

hiNative2

한 친절한 미국인의 답변

원어민 한 명이 모든 언어 화자를 대변하지는 못하지만, 일상생활에서 anonymous이름의 비존재의 의미로 쓰이지는 않을 것이라는 믿음을 더해주었다. 영어권에는 나와 같은 고민을 한 사람이 없을까? 구글을 더 찾아보았다. 개발자 국룰 stackoverflow에서 비슷한 질문이 하나 있었다.
Is there a difference between "anonymous" and "unnamed" in c++ semantic?
anonymousunnamed 키워드가 공존하는 C++에 관한 질문이기는 하지만, 흥미로운 답변이 있었다.

The word "anonymous" actually means "without a name". They mean the same thing. But, terminology tends to be settled by history, or the standard into using one or the other for different things. Hence anonymous struct means a struct without a type name. We tend to say unnamed temporary for compiler generated variables.

Galik, Mar 18, 2018 at 15:38

내 미천한 해석이 맞는다면, anonymous는 일반적으로 이름의 부재로는 쓰이지 않는 게 맞지만, 사전적으로는 이름의 부재의 뜻도 가지고 있어 이러한 용도의 쓰임도 논리적으로 옳다는 정보를 얻을 수 있다.

현실 언어적 접근 정리

  1. 한국어의 익명은 이름의 부재의 뜻으로 쓰이지 않는다.
  2. 영어의 anonymous도 일반적으로는 이름의 부재가 아닌 이름을 숨김의 의미로 쓰인다.
  3. 그러나 anonymous익명과 달리 이름의 부재의 의미와 어원을 가지기 때문에 Anonymous Class를 이름이 부재한 클래스로 해석하더라도 논리적으로 타당하다.

개발 언어적 접근🧑‍💻

아뿔싸, 나는 영어가 아니라 자바를 공부하고 있던 걸 잊을 뻔했다. 혹시 Anonymous Class는 자바에서 이름의 부재가 아니라 이름의 숨김의 의미로 지어진 건 아닐까? 조금 더 생각해보았다.
다시 위의 예시 코드를 보자.

public static void main(String[] args) {
        fight(new Akainu(), new Commander() { // 
        익명클래스도 Commander라는 부모 클래스나 인터페이스를 명시해주어야 한다
            @Override
            public void work() {
                System.out.println("에이스... 죽는다");
            }
        });
    }
public abstract class Commander implements WhiteBeard, Pirates {
}

익명클래스도 부모 클래스나 인터페이스의 이름을 명시해주어야 한다. 그렇다면 익명 클래스를 이름이 없는 클래스가 아니라 부모 클래스나 인터페이스의 이름 뒤에 숨는 클래스로 바라볼 수 있지 않을까? 에이스라는 이름을 숨기고 흰수염의 이름으로 바다를 누비는 것처럼 말이다.

whiteBeard1

익명클래스가 되기를 요구하는 부모클래스

whiteBeard2

쨘! 상속 받고 내 이름 아래 익명으로 남아라

stackoverflow에서도 관련 글을 찾을 수 있었다.

an anonymous class is a sub type of the type whose name you use to instantiate it.

Sotirios Delimanolis, Software Engineer at Meta Inc.

또한 실제 자바 언어 구현상으로 익명클래스는 컴파일된 후 외부 클래스명$숫자.class의 형식으로 결정된다. 이 경우 외부 클래스명이란 부모 클래스가 아니라 호출한 클래스의 이름이다. 어느 모로 보나 충분히 이름을 숨김으로 해석 가능해보인다.

다시 결론🌟

1.익명의anonymous 사이에는 다소 의미 차이가 있다. 익명의무명의 뜻에 쓸 수 없지만 anonymousunnamed(무명)의 의미로 써도 논리적으로 틀리지는 않는다.
2. (논리) 부모 클래스나 인터페이스의 이름 뒤에 숨거나 (컴파일) 호출한 클래스의 이름 뒤에 숨어 익명이 되기 때문에.

참고🙏

남궁 성, 자바의 정석
신용권, 이것이 자바다
Is there a difference between "anonymous" and "unnamed" in c++ semantic?
Why is it called an "anonymous" inner class?
What is the difference between Anonymous and Unnamed or Innominated?
The difference between Anonymous and Unnamed

에이스 이미지 출처
흰수염 이미지 출처

profile
기계공학과 개발어린이

1개의 댓글

comment-user-thumbnail
2023년 10월 30일

안녕하세요. 익명과 무명의 차이를 고민하다가 지나가게 됐습니다.
코틀린 인 액션에서는 anonymous inner class를 무명 내부 클래스로 번역하고 있습니다. 자바에서는 익명 클래스로 정의하다가, 왜 코틀린에서는 무명 클래스로 번역했을까 궁금했는데... 덕분에 anonymous의 정의에 대해 깊게 생각해볼 수 있었던 것 같습니다. 건강하세요 소주캉님!

답글 달기