glenn-syj / more-effective-java

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

[MEJ-007] PECS에서 Producer, Consumer에 대해 #150

Closed undeadtimo closed 1 month ago

undeadtimo commented 2 months ago

Based on: #146 By @FickleBoBo

FickleBoBo님의 글 잘 읽었습니다.

덕분에 한정적 와일드카드에 대한 개념을 이해할 수 있게 되었습니다.

FickleBoBo님의 글 마지막에 어려운점으로 생산자(Producer)와 소비자(Consumer)를 헷갈리는 것을 언급하셨더군요.

선언한 list를 '사용' 할 수 있는가 없는가에 따라서 구분한다면 헷갈리는 부분을 정립하기 쉽지 않을까 싶습니다.

여기서 '사용'이란 실제로 list 내부에 데이터를 작성할 수 있는가로 생각하시면 됩니다.

Producer Extends (생산자)는 선언한 list를 가지고 데이터를 읽어올 수는 있지만, 데이터를 '삽입'할 수는 없기 때문에, 사용하는 것이 아닙니다.

즉, '생산'만 하는 것이기에 '생산자'라는 이름이 붙은 것입니다.

반대로 Consumer Super(소비자)는 선언한 list에 데이터를 '삽입'할 수 있기에 사용하는 것이 맞습니다.

따라서, list의 공간을 '소비'하는 것이기 때문에 '소비자'라는 이름이 붙은 것입니다.

이런식으로 이해해보면 어떨지 한 번 제안드립니다.

혹여나, 저의 설명에 옳지 않거나 적절하지 않은 부분이 있다면 알려주시기 바랍니다.

FickleBoBo commented 2 months ago

교재 p.182의 pushAll()의 경우 생산자(extends), 교재 p.183의 popAll()의 경우 소비자(super) 와일드카드 타입을 적용했다고 생각합니다. 좀 더 자세히는 매개변수의 제네릭이 pushAll()에서는 상위타입에서 하위타입으로, popAll()에서는 하위타입에서 상위타입까지 열려있는 것으로 생각했습니다. @undeadtimo 님이 말씀하신 선언한 list가 메서드의 매개변수를 말씀하시는 것이라면 예제 코드에도 잘 적용되고 각각의 원소에 대한 타입 변환을 통해 마치 배열이 아님에도 공변처럼 사용하는 것 같다는 직관에도 잘 맞는 것 같습니다.

좋은 답변 감사합니다.