glenn-syj / more-effective-java

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

[MEJ-007] 재귀적 타입 한정에 대한 보충 설명 #155

Closed glenn-syj closed 1 month ago

glenn-syj commented 2 months ago

base on: #145 by @yngbao97

들어가며

@yngbao97 님이 작성하신 글은 제네릭 싱글턴 패턴에 대한 이해를 중심으로 작성되었는데요. 저는 제네릭에서의 재귀적 타입 한정을 복습 겸 짚고 넘어가도 좋겠다 싶어 보충하고자 합니다.

재귀적 타입 한정

재귀적 타입 한정(recursive type bound)은 사실 자바 공식문서에서는 언급되지 않는 단어로 보입니다. 그렇지만, 그 이름에서도 분명하게도 '재귀적'이라는 표현에 주목한다면 이해가 그리 어렵지는 않습니다.

해당 절에서 제시되었던 것과 같이, <E extends Comparable<E>>를 살펴봐도 좋겠습니다. 여기에서 타입 파라미터인 E는 물론, extends를 통해 Comparable<E>의 자손 타입으로 제한되는데요. 이렇듯 타입 파라미터인 E가 Comparable의 타입 파라미터로도 쓰이는 방식이 재귀적 타입 한정입니다.

만약 이러한 재귀적 타입 한정이 없다면, Comparable 인터페이스를 구현함에 그쳐 Object에 대한 비교가 이어져 안정성을 보장할 수 없습니다. 하지만 재귀적 타입 한정 덕분에, 컴파일 단계에서도 E 타입이 안정적으로 비교될 수 있겠습니다. 게다가 파이썬과도 달리, 자바에서 연산자 오버라이딩이 가능하지 않다는 점을 고려한다면 이는 부등호를 사용하기 위한 전략일 수도 있겠네요.

References

https://stackoverflow.com/questions/7385949/what-does-recursive-type-bound-in-generics-mean

yngbao97 commented 2 months ago

사실 재귀적 타입 한정을 둔 코드를 읽을 때마다 해석만 하고 '아 이렇게 쓸수도 있구나' 정도로만 넘어갔었는데, 남겨주신 보충 설명 덕분에 왜 이런 형식을 사용하게 되는지 그 이유를 이해할 수 있었습니다.
클래스 상하위 개념 속에서 보다 섬세하고 꼼꼼한 코드 안정성을 고민하는데에 도움이 되었습니다.

첨부해주신 레퍼런스에서도 재귀적 타입한정이 필요하게되는 이유에 대해 과정에 따라 설명되어있어 이해하기 좋네요. 감사합니다!