glenn-syj / more-effective-java

이펙티브 자바를 읽으며 자바를 더 효율적으로 공부합니다
4 stars 5 forks source link

[MEJ-007] 제네릭 가변인자 타입안전성 조건과 매개변수의 클래스 타입 인식에 대한 질문 #148

Closed yngbao97 closed 1 month ago

yngbao97 commented 2 months ago

Based on: chapter_05/item32_손영준_제네릭과-가변-인자에-대한-심화-탐구.md by @Glenn-syj


책으로 읽을 때는 가변인자를 제네릭으로 사용했을 때 일어나는 문제점과 이를 보완하기 위한 방법들에 무슨 차이가 있는지 잘 와닿지 않았었는데, 오류가 일어나는 과정을 깔끔하게 정리해주셔서 스스로 이해가 되는 부분과 의문이 드는 부분이 무엇인지 구분할 수 있게 되었습니다.

찾아봐도 적절한 답변을 발견하기 어려워서 질문드리고 싶은 부분이 2가지인데요.

먼저, @SafeVarargs 애너테이션을 사용하기 위한 조건 두가지 중 (2) 외부에서 배열을 참조할 수 없는 경우가 어떤 경우라고 생각하시는지 예시가 궁금합니다.

다음으로 2. 예시 코드를 통한 힙 오염 확인 부분에서는

toArray 메소드에 a와 b가 넘겨지면서 Object[] 타입의 array를 생성한다.

라고 쓰여있는데, 더 나아가기 마지막 예시 코드에서는 각 인자들의 형식에 따라 arguments 의 클래스 타입이 다르게 나타나는 것(ex: String 타입의 인수만 입력했을 때 여기서는 String타입으로 출력됨)이 어떤 차이인지, 혹시 조사를 통해 알게되신 바가 있는지 궁금합니다!

항상 유용한 탐구 글 감사합니다!

glenn-syj commented 2 months ago

외부에서 배열을 참조할 수 없는 경우란, 가변 인자를 받는 메소드에서 외부 메서드를 호출하지 않는 경우를 의미합니다. 이는 다시 말해, 외부 메서드에서 요구하는 인자 혹은 외부 변수에 대한 타입으로 형 변환에서의 오류가 방지되는 경우입니다. 사실 '외부에서 배열을 참조할 수 없는 경우'란 '배열이 외부에서 형 변환이 즉시 되지 않는 경우'라고 보아도 될 것 같습니다.

저도 인자들의 형식에 따라 arguments의 type이 바뀌는 걸 조금은 찾아보았는데, 아직 찾아보지는 못했습니다. 추측으로는 클래스 메타데이터가 있다면... 서로 처음 일치하는 부분을 가져오는 게 아닌가 싶기도 한데, 정확한 정보가 생기면 꼭 이슈를 올려보겠습니다!