Java에서 제네릭은 클래스나 메서드에서 사용할 데이터 타입을 일반화해 코드의 재사용성과 타입 안정성을 확보하는 기능입니다.
<> 안에 타입 매개변수를 지정해 사용합니다.
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 data = box.get();
메서드에만 제네릭 타입을 선언해 사용할 수 있습니다.
public <T> void print(T item) {
System.out.println(item);
}
// 사용 예
print(100);
print("Java");
| 약어 | 의미 |
|---|---|
| T | Type |
| E | Element (컬렉션 요소) |
| K | Key |
| V | Value |
| N | Number |
제네릭에 상위 타입 제한을 설정해 타입 범위를 제어합니다.
class NumberBox<T extends Number> {
private T num;
public void set(T num) {
this.num = num;
}
public T get() {
return num;
}
}
// 사용 예
NumberBox<Integer> intBox = new NumberBox<>();
intBox.set(123);
T는 Number 또는 그 하위 타입만 허용됩니다.
제네릭 타입의 불특정 타입을 허용할 때 사용합니다.
<?>: 모든 타입 허용<? extends T>: T 또는 하위 타입<? super T>: T 또는 상위 타입public void printList(List<?> list) {
for (Object obj : list) {
System.out.println(obj);
}
}
컴파일 시 타입 결정
런타임에는 타입 정보 제거됨 (Type Erasure)
기본형(primitive) 타입 사용 불가 (List<int> → List<Integer>)
instanceof 검사 불가
// 오류 예시
if (obj instanceof Box<String>) { }
| 구분 | 설명 |
|---|---|
| 기본 문법 | <>에 타입 매개변수를 지정 |
| 제네릭 메서드 | 메서드에만 타입 매개변수 선언 |
| 제한된 타입 | T extends Number로 타입 범위 제한 |
| 와일드카드 | <?>, <? extends T>, <? super T> 사용 가능 |
| 주요 제한사항 | 런타임 타입 제거, 기본형 사용 불가, instanceof 검사 불가 |
📚 참고자료