2023-java-study / book-study

북 스터디 기록 레포지토리
0 stars 0 forks source link

[Item 32] 클라이언트와 힙 오염을 불러일으키는 코드 사이의 단계 #110

Closed gmelon closed 1 year ago

gmelon commented 1 year ago

p.194에서 만약 클라이언트 → 힙 오염을 불러일으키는 코드 사이에 다른 메서드가 있지 않고 바로 호출된다면 컴파일러가 타입 추론을 좀 더 명확히 할 수 있게 되나요?

즉, 코드 32-2를 main() 메서드에서 바로 호출한다면 T가 String으로 추론되어 바로 String[] 배열이 반환될 수 있는지 궁금합니다. 만약 이게 맞다고하면, 컴파일러는 메서드가 여러개를 넘어가면서 해당 메서드들이 인자로 타입 파라미터를 받을 때 타입 추론을 어려워하는걸까요?

NuhGnod commented 1 year ago

우선 결론적으로는, 질문해주신 대로 호출하면, 생각하신것 처럼 동작합니다.

그에 대한 이유는 제 생각은, 결국 toArray메서드가 pickTwo메서드에서 호출될 때 넘어가는 파라미터가 T타입 인수 이기 때문에 컴파일러가 어느 타입이 올지 모르니깐 Object라고 판단하게 될 것입니다. 그래서 main()에서

        String a = "a";
        String b = "b";
        String c = "c";
        String[] raw = toArray("I", "LOVE", "JAVA");
        String[] raw2 = toArray(a, b, c);

두 케이스모두 제대로 동작합니다. 마찬가지로, pickTwo메서드 에서도 String 문자열을 파라미터로 전달하면 문제없이 동작하며, 만약 책의 예시대로 T타입 인수를 전달하면 Object[]가 반환되어 Cast에러가 발생합니다.

return (T[]) toArray("asd");

위 처럼 String으로 넘기면 컴파일러가 컴파일시점에 String임을 알고 있게 되어 String[]으로 잘 반환하는 것으로 생각합니다.

이번 item들 질문들 보며 다 답변하기가 너무 어려웠는데, 이 내용이 질문주신 의도에 맞는진 모르곘지만,,,아니라면 만나서 얘기 해봐요!!..