Closed gnoyes-mik closed 2 years ago
@sawooook 질문 감사합니다~ 확실하진 않지만 제 생각을 말씀드리면 [1번 질문] '새로운 상수를 추가하거나 순서를 바꿔도 다시 컴파일 하지 않아도 된다' 라는 문장에서 219p 마지막 문장을 보면 '열거 타입은 나중에 상수가 추가되어도 바이너리 수준에서 호환되도록 설계되었다'라는 문장을 참고해보면 새로운 상수를 추가 되더라도 기존 소스와 호환이 되며, 신규 추가된 상수는 기존 클라이언트에서 참조하고 있지 않으니까 괜찮다라고 생각이 들었습니다
또 순서를 바꾸어도 컴파일 하지 않아도 되는 이유는 열거 타입에 이름으로 접근하고 있기때문에 순서는 그닥 문제가 되지 않기 때문에 상관없다고 생각했습니다!
[2번 질문] 저는 단순히 어떠한 기술적인 방식으로 도달 할 수 있든 없든간에 throw 를 하지않으면 'Missing return statement' 에러가 발생할 것이라고 생각을 해서..'기술적으로 도달한다'라는 의미에 대해서는 깊게 생각해보지 못했습니다 ㅜ
++ 혹시 몰라 해당 원문 공유드려요
216p 중간
하지만 열거 타입 상수는 생성자에서 자신의 인스턴스를 맵에 추가할 수 없다.
이렇게 하려면 컴파일 오류가 나는데, 만약 이 방식이 허용되었다면 런타임에 NullPointerException이 발생했을 것이다.
열거 타입의 정적 필드 중 열거 타입의 생성자에서 접근할 수 있는 것은 상수 변수 뿐이다(아이템 24)
216p 중간
하지만 열거 타입 상수는 생성자에서 자신의 인스턴스를 맵에 추가할 수 없다. 이렇게 하려면 컴파일 오류가 나는데, 만약 이 방식이 허용되었다면 런타임에 NullPointerException이 발생했을 것이다. 열거 타입의 정적 필드 중 열거 타입의 생성자에서 접근할 수 있는 것은 상수 변수 뿐이다(아이템 24)
- 혹시 NPE 발생하는 예제 코드 추가해주실 수 있나요?! 머릿속으로 잘 안 그려지네요ㅠㅠ
- 세 번째 문장은 이해가 잘 안됩니다.. 또 아이템 24는 "멤버 클래스는 되도록 static으로 만들라"였는데 어떤 연관이 있는지 모르겠어요.
@jun108059
일반적인 클래스의 경우 static 멤버 변수는 클래스 로딩시점에 이미 초기화가 되어 생성자에서 static 멤버 변수에 접근할 수 있습니다
하지만 열거 타입의 경우 일반적이지 않은데, 제일 먼저 열거 타입 상수 초기화가 실행됩니다. 열거 타입 상수 초기화를 위해선 생성자는 반드시 호출되구요.
생성자가 호출되는 현 시점에서는 아직 static 멤버 변수는 초기화가 되지 않은 상태입니다. 그렇기 때문에 아래와 같이 컴파일 에러가 발생합니다
만약 컴파일 에러가 발생하지 않는다면, 즉 현 시점에서 static 멤버 변수에 접근이 가능하더라도 아직 초기화가 되지 않았기 때문에 NullPointerException이 발생할 것이라고 생각돼요!
혹은 아래와 같은 경우처럼 생성자에서 내부 메소드를 통해 static 멤버 변수에 접근하는 경우
책에서 언급한 '열거 타입의 정적 필드 중 열거 타입의 생성자에서 접근할 수 있는 것은 상수 변수 뿐이다' 에서 상수 는 열거 타입 상수를 뜻하는줄 알았는데 테스트를 해보니 실제 상수였네요..!!
같은 static 변수인데 왜 상수는 접근 가능한지 찾아보니
Enum에서의 생성 순서는
1. Enum의 primitive type 상수 : static final int (Integer로 하면 안된다.)
2. Enum의 생성자
3. Enum의 static 변수 : static Set set
(static final Integer를 하면 3번 과정에서 생성된다.)
라고 합니다
그리고 마지막으로
열거 타입의 정적 필드 중 열거 타입의 생성자에서 접근할 수 있는 것은 상수 변수 뿐이다(아이템 24)
라고 되어있는 부분은 영문판 찾아보니 아이템 24가 아니라 아이템 34를 참조하고 있는데,, 아이템 34면 현재 아이템인데 자기가 자기 자신을 참조하고 있는건 좀(?) 이상하네요
Enum에서의 생성 순서는
- Enum의 primitive type 상수 : static final int (Integer로 하면 안된다.)
- Enum의 생성자
- Enum의 static 변수 : static Set set
(static final Integer를 하면 3번 과정에서 생성된다.)
생성 순서 때문에 그런거였군요! 예제까지 깔끔한 정리 최고에요 👍 이해가 됐습니다!
라고 되어있는 부분은 영문판 찾아보니 아이템 24가 아니라 아이템 34를 참조하고 있는데,,
아이템 34면 현재 아이템인데 자기가 자기 자신을 참조하고 있는건 좀(?) 이상하네요
오,, 24도 이상하고 34도 이상하네요,, 감사합니다 😭
질문 두가지가 있습니다..!