Java & Spring/컬렉션 프레임워크

제네릭 (Generic)

승주우에요 2026. 1. 20. 08:23

1. 제네릭이란?

클래스나 메서드에서 사용할 타입을 외부에서 지정할 수 있도록 하는 문법이다.

List<String> list = new ArrayList<>();
  • 타입 안정성 보장
  • 명시적 캐스팅 제거
  • 컴파일 타임 오류 검출
  • IDE 타입 추론 가능

2. Generic Class

기본 구조

class Box<T> {
    private T value;

    public void set(T value) {
        this.value = value;
    }

    public T get() {
        return value;
    }
}

// 사용
Box<String> box = new Box<>();
box.set("hello");

String s = box.get(); // 캐스팅 불필요

 

타입 매개변수 T

  • T는 실제 타입이 아님
  • 컴파일 시 전달된 타입으로 치환됨

 

제네릭은 서로 다른 클래스일까? 

서로 다른 클래스처럼 보이지만, 실제로는 동일한 클래스이다! 자바 제네릭은 컴파일 시점에 타입 정보를 제거한다. 결국 런타임에는 모두 동일한 Box 클래스이다!!

 

3. Generic Method

public static <T> T print(T value) {
    return value;
}
  • 반드시 리턴 타입 앞에 선언해야 함
  • 클래스 제네릭과 별개의 T임

클래스 + 메서드 제네릭

class Box<T> {

    public <E> E convert(E value) {
        return value;
    }
}
// T -> 클래스 전체 E -> 해당 메서드 내부 한정

 

4. 제한된 타입 파라미터 (Bounded Type)

class Box<T extends Number> {
}

 

  • 클래스 상속
  • 인터페이스 구현
  • 다음을 모두 포함함

 

5. 와일드카드 (WildCard) 

List<?> list;
  • 타입을 정확히 지정하지 않겠다
  • 모든 제네릭 타입 허용
  • 읽기만 가능
  • 추가 불가

6. 와일드카드 종류

  • <?> : 모든 타입
  • <? extends T> : T의 하위 타입
  • <? super T> : T의 상위 타입

7. extends와 super의 차이

- extends - 

읽기 전용 

List<? extends Number> list;

// 가능
Number n = list.get(0);

// 불가능
list.add(10); // ❌

 

-super-

쓰기 전용

List<? super Integer> list;

// 가능
list.add(10);
list.add(20);

// 불가능
Integer n = list.get(0); // ❌

 

8. 정리

- 제네릭 특징

  • 컴파일 타임 타입 안정성
  • 런타임 타입 소거
  • 서로 다른 제네릭 타입도 동일 클래스

 

- 주요 문법

  • class Box<T>
  • <T> T method()
  • T extends Type
  • ? extends / ? super

-> 자바 제네릭은 "컴파일 타임 안정성"을 위한 문법이다!

'Java & Spring > 컬렉션 프레임워크' 카테고리의 다른 글

람다 표현식  (0) 2026.01.19
List, Set, Map  (0) 2026.01.08
JCF가 왜 필요할까?  (0) 2026.01.08