💩똥글입니다. 불행히 이 글을 클릭하셨다면 언제든 뒤로가기
누를 준비를 하십시오. 아무 공신력이 없는 필자 생각입니다.
1.익명의
와 anonymous
사이에는 다소
의미 차이가 있다. 익명의
는 무명의
뜻에 쓸 수 없지만 anonymous
는 unnamed(무명)
의 의미로 써도 논리적으로 틀리지는 않는다.
2. (논리) 부모 클래스나 인터페이스의 이름 뒤에 숨거나 (컴파일) 호출한 클래스의 이름 뒤에 숨어 익명
이 되기 때문에.
익명(anonymous) 클래스는 이름이 없는 클래스를 말한다. 익명 클래스는 단독으로 생성할 수 없고 클래스를 상속하거나 인터페이스를 구현해야만 생성할 수 있다.
신용권, 이것이 자바다
원문은 클래스가 아니라 객체라고 쓰는데, 클래스와 객체는 다르다고 생각하여 클래스로 바꿔 인용하였다. 익명클래스는 주로 재사용되지 않을 클래스를 구현하거나, 테스트용 클래스를 구현할 때 사용한다.
Java 8
에서 등장한 람다도 익명클래스의 일종인데, 최근에 자바를 학습한 사람이라면 익명클래스보다 람다를 먼저 접하고 사용했을 가능성이 크다(저도 그랬습니다!!!). 이 글을 본다면 모르시는 분은 없겠지만, 예시 코드는 다음과 같다.
private static void fight(Navy navy, Pirates pirates) {
navy.work();
pirates.work();
}
Navy
와 Pirates
타입을 매개변수로 받는 메서드 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
는 익명
에는 없는 이름이 없는
의 의미마저 가지고 있는 것일까?? 기원은 어떨까?
똑똑히 보이는 without name
과 nameless
!!! 이쯤 되면 Anonymous Class
는 충분히 논리적인 이름으로 보인다. 그러나 의문 해결을 외치기 전 한 번 더 의심해봐야 개발 어린이 아니겠는가??
그리하여 HiNative 사이트에서 원어민에게도 질문해봤다. Anonymous
에 이름이 없는
에 해당하는 쓰임이 있느냐고.
원어민 한 명이 모든 언어 화자를 대변하지는 못하지만, 일상생활에서 anonymous
가 이름의 비존재
의 의미로 쓰이지는 않을 것이라는 믿음을 더해주었다. 영어권에는 나와 같은 고민을 한 사람이 없을까? 구글을 더 찾아보았다. 개발자 국룰 stackoverflow
에서 비슷한 질문이 하나 있었다.
Is there a difference between "anonymous" and "unnamed" in c++ semantic?
anonymous
와 unnamed
키워드가 공존하는 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
는 일반적으로 이름의 부재
로는 쓰이지 않는 게 맞지만, 사전적으로는 이름의 부재
의 뜻도 가지고 있어 이러한 용도의 쓰임도 논리적으로 옳다는 정보를 얻을 수 있다.
익명
은 이름의 부재의 뜻으로 쓰이지 않는다. anonymous
도 일반적으로는 이름의 부재가 아닌 이름을 숨김
의 의미로 쓰인다.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 {
}
익명클래스도 부모 클래스나 인터페이스의 이름을 명시해주어야 한다. 그렇다면 익명 클래스를 이름이 없는 클래스가 아니라 부모 클래스나 인터페이스의 이름 뒤에 숨는
클래스로 바라볼 수 있지 않을까? 에이스라는 이름을 숨기고 흰수염
의 이름으로 바다를 누비는 것처럼 말이다.
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
사이에는 다소
의미 차이가 있다. 익명의
는 무명의
뜻에 쓸 수 없지만 anonymous
는 unnamed(무명)
의 의미로 써도 논리적으로 틀리지는 않는다.
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
안녕하세요. 익명과 무명의 차이를 고민하다가 지나가게 됐습니다.
코틀린 인 액션에서는 anonymous inner class를 무명 내부 클래스로 번역하고 있습니다. 자바에서는 익명 클래스로 정의하다가, 왜 코틀린에서는 무명 클래스로 번역했을까 궁금했는데... 덕분에 anonymous의 정의에 대해 깊게 생각해볼 수 있었던 것 같습니다. 건강하세요 소주캉님!