그알것 — 그럼에도 알아야 할 것들
홈질문커뮤니티
로그인
그알것 — 그럼에도 알아야 할 것들

Service

  • 홈
  • 소개
  • 질문
  • 커뮤니티

My

  • 내 워크스페이스
  • 저장한 질문
  • 작성한 답변

Policy

  • 이용약관
  • 개인정보처리방침
  • 문의

© 2026 그알것 · What Still Matters

질문 목록Java
Java

자바 제네릭의 공변·반공변·무공변은 무엇인가요?

실무4/5
설계4/5
인간3/5
기초3/5

면접관의 질문 의도

용어를 외웠는지가 아니라, 읽기·쓰기 방향을 보고 extends/super 중 어느 쪽을 쓸지 PECS로 설명할 수 있는지 가르려는 질문이다.

큐레이션 답변

학습 자료

자바 제네릭은 기본 무공변이라 List<Parent>와 List<Child>는 서로 대입되지 않는다. 더 유연하게 쓰려면 와일드카드 경계를 쓰는데, <? extends T>는 T와 그 자손을 받아 와 '읽기는 자유, 쓰기는 제한'이 되고, <? super T>는 T와 그 조상까지 허용해 'T 또는 자손을 쓰는 건 자유, 읽기는 Object로만'이 된다. 이 두 방향을 한 문장으로 정리한 게 PECS(Producer Extends, Consumer Super)다. 비슷해 보이는 <?>는 임의 타입 읽기 전용 성격이고 <Object>는 Object만 받는 구체 타입이라 자리가 다르다.

좋은 답변 구조

  1. 01기본 무공변 규칙과 그 이유를 먼저 설명한다
  2. 02<? extends T>와 <? super T>의 의미를 읽기·쓰기 방향으로 비교한다
  3. 03PECS 원칙을 컬렉션 메서드 시그니처 예시로 연결한다
  4. 04<?>와 <Object>의 차이를 정리해 흔한 혼동을 끊는다

자주 실수하는 포인트

<? extends T> 컬렉션에 값을 자유롭게 add하려다 컴파일 에러를 만든다
<? super T>에서 꺼낸 값을 구체 타입으로 단정해 캐스팅 위험을 만든다
<?>와 <Object>를 같은 타입으로 보고 받을 수 있는 값 범위를 잘못 잡는다

실무 맥락

  • 공용 라이브러리·유틸 메서드의 제네릭 시그니처를 잡아야 하는 자리
  • 컬렉션을 받아 변환·복사하는 API를 설계하는 코드
  • 도메인 객체 계층(부모-자식)이 깊어 다양한 하위 타입을 같이 다루는 서비스 코드

본인 경험에 녹이는 힌트

유틸 메서드 시그니처에서 PECS를 적용해 호출자 편의를 늘려 본 경험이 있다면 변성 설계 사례로 연결할 수 있다

<? extends T> 시그니처에 add를 시도하다 막혀 본 경험이 있다면 읽기·쓰기 방향 직관으로 엮을 수 있다

공개 API의 변성 경계를 단순화해 사용성을 끌어올린 적이 있다면 라이브러리 설계 관점으로 말할 수 있다

커뮤니티 인기 답변

전체 0개

아직 공개된 답변이 없어요. 첫 공개 답변을 남겨보세요.

관련 꼬리 질문

Q1List<? extends Number>에서 add가 제한되는 이유는 무엇인가요
Q2타입 소거가 변성 사용성에 주는 영향은 무엇인가요
Q3제네릭 메서드와 와일드카드는 언제 각각 유리한가요
아직 답을 쓰지 않았어요.
큐레이션 답변과 다른 사람 답변을 보고, 자기 언어로 답을 정리해보면 학습 효과가 가장 큽니다.
목차
  • 01면접관의 질문 의도
  • 02큐레이션 답변
  • 03좋은 답변 구조
  • 04자주 실수하는 포인트
  • 05실무 맥락
  • 06본인 경험에 녹이는 힌트
  • 07커뮤니티 인기 답변준비중
  • 08관련 꼬리 질문