glenn-syj / more-effective-java

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

[MEJ-006] 로 타입 와일드카드 대한 질문 #135

Closed FickleBoBo closed 5 months ago

FickleBoBo commented 6 months ago

Based on : @ssh2957 by #129

로 타입은 구시대의 유물처럼 느껴졌는데 아직 많은 코드들이 로 타입으로 작성되어 있기에 충분히 학습하고 이러한 코드를 제네릭을 사용한 코드와 잘 호환시키는 것이 중요할까라는 의문이 드는 좋은 글이었던 것 같습니다. 로 타입에 대해서 점진적으로 내용을 전개해주셔서 흥미롭게 읽을 수 있었는데 비한정 와일드카드 타입에 대한 부분이 약간 어려워서 질문 드립니다.

<?>로 표현되는 제네릭에 대한 이름인 것으로 보이는데 이러한 비한정 와일드카드 타입에 타입 불변식을 훼손하지 못하게 null외의 아무 값도 넣지 못한다는 것이 해당 제네릭을 사용하는 컬렉션에 대해 오직 null 만이 추가, 삭제가 가능하며 null의 추가 삭제는 원본 제네릭이 어떤 것이든 같은 타입으로 간주한다와 동일한 의미인지 궁금합니다.

ssh2957 commented 6 months ago

좋은질문 감사합니다. 일단 비한정 와일드카드가 쓰이는곳은 메서드를 만들때 매개변수에 어떤 제네릭을 사용하는 list가 올지 모르는 상황속에서 그 리스트를 메서드안에서 사용하기 위해서 쓰는것입니다.

컬렉션에 대해 오직 null 만이 추가, 삭제가 가능하며 null의 추가 삭제는 원본 제네릭이 어떤 것이든 같은 타입으로 간주한다와 동일한 의미인지 궁금합니다

이 부분이 저는 잘 이해가 안 되어서서 null만 추가 삭제되는 것은 어떤 제네릭 타입인지 모르는 list에 함부로 값을 추가 삭제하게 되면 타입불변성을 위배되기 때문에 list의 타입불변성을 해치지 않는 null 값만 추가 또는 삭제가 가능한 것입니다. 그럼 비한정 와일드카드를 왜 쓰는지에 대한 에 대한 의문이 생기실 수도 있는데 list의 값을 수정하지 않는 tostring 등 값을 확인하는 용도로 사용할 수 있습니다. 관련 글이 있어 첨부합니다. https://stackoverflow.com/questions/29342117/what-is-the-purpose-of-list-if-one-can-only-insert-a-null-value