상세 컨텐츠

본문 제목

Java Generics에서 extends와 super의 차이점

Java

by Wanderer Kim 2025. 5. 6. 20:50

본문

728x90

Generics를 공부하면서 extends와 super가 헷갈려서 두 keyword의 정의와 차이점을 정리해 보았다.

 

extends란?

generics에서 extends keyword는 타입의 상한 경계를 제한할 때 사용됩니다.

  • T 타입과 T의 하위 클래스 타입만 허용합니다.
  • 사용 예시: List<? extends Number>는 Number와 Integer,Double등 Number의 하위 타입만 받을 수 있습니다..
  • 주로 읽기 용도로 사용합니다. 리스트에서 값을 꺼낼 때 타입 안정성을 보장할 수 있지만 리스트에 값을 추가할 때는 타입 불일치로 인해 제한됩니다
public void printNumbers(List<? extends Number> list) {
    for (Number n : list) {
        System.out.println(n);
    }
    // list.add(1); // 컴파일 에러 발생!
}

 

super란?

generics에서 super keyword는 타입의 하한 경계를 제한할 때 사용합니다.

  • T 타입과 T의 상위 클래스만 허용합니다.
  • 사용 예시: List<? super Integer>는 List<Integer>, List<Number>, List<Object>등 Integer의 상위 클래스만 받습니다.
  • 주로 쓰기(write) 용도로 사용합니다. 리스트에 T 타입이나 그 하위 타입의 객체를 안전하게 추가할 수 있습니다. 하지만 리스트에서 값을 꺼낼 때는 Object로만 안전하게 꺼낼 수 있습니다.
public void addIntegers(List<? super Integer> list) {
    list.add(1); // OK
    // Integer n = list.get(0); // 컴파일 에러! Object로만 안전하게 꺼낼 수 있음
}

 

결론

  • extends: 상한 경계, 하위 타입만 허용, 읽기 전용에 적합
  • super: 하한 경계, 상위 타입만 허용, 쓰기 전용에 적합
반응형

'Java' 카테고리의 다른 글

LocalDate, LocalTime, LocalDateTime  (0) 2025.05.13
Java의 시간 날짜 라이브러리 소개  (0) 2025.05.11
Object class  (0) 2025.02.16
Concurrent Random Number  (0) 2024.09.24
ThreadLocal  (1) 2024.02.28

관련글 더보기

댓글 영역