제네릭(Generics)은 클래스나 메서드를 정의할 때 데이터 타입을 일반화(파라미터화) 해서 코드의 재사용성과 타입 안정성을 높이는 기능이다.
List<String> list = new ArrayList<>();
타입 안정성 보장
형변환 제거
코드 재사용성 증가
public class Box<T> {
private T value;
public void set(T value) {
this.value = value;
}
public T get() {
return value;
}
}
T는 타입 파라미터(Type Parameter).
사용 시 구체적인 타입을 지정해야 한다.
Box<String> stringBox = new Box<>();
stringBox.set("Hello");
String msg = stringBox.get(); // 형변환 불필요
public class Util {
public static <T> void printArray(T[] array) {
for (T item : array) {
System.out.println(item);
}
}
}
String[] names = {"A", "B", "C"};
Util.printArray(names);
특정 타입이나 그 하위 클래스만 허용하고 싶을 때 extends를 사용한다.
public class NumberBox<T extends Number> {
private T number;
}
public void printList(List<?> list) {
for (Object obj : list) {
System.out.println(obj);
}
}
public void sumNumbers(List<? extends Number> numbers) {
// 읽기는 가능하지만 쓰기는 제한됨
}
public void addNumbers(List<? super Integer> numbers) {
numbers.add(10); // Integer 또는 상위 타입인 Number, Object 가능
}
static T value; // 불가능
if (obj instanceof List<String>) // 오류 발생
Java의 제네릭은 복잡해 보이지만, 코드의 안정성과 유연성을 높여주는 강력한 도구이다. 타입 안정성, 코드 재사용성, 가독성을 위해 꼭 알아두어야 할 개념이니, 다양한 예제로 익혀두는 것을 추천한다.