제네릭(Generic)은 자바에서 다양한 데이터 타입을 지원하면서도 타입 안정성을 보장할 수 있게 하는 기능이다. 제네릭을 사용하면 클래스나 메서드에서 사용되는 데이터 타입을 고정하지 않고, 유연하게 받을 수 있다.
간단한 예로, 제네릭을 사용하지 않고 여러 타입을 처리하는 List
를 만든다면 Object
타입을 사용해야한다.
List list = new ArrayList();
list.add("Hello");
list.add(123); // String, Integer 모두 저장 가능
위 코드처럼 Object
타입으로 선언된 리스트는 다양한 타입을 담을 수 있지만, 타입 안전성이 보장되지 않아 꺼낼 때 타입 캐스팅을 해야 하고, 잘못된 타입으로 처리할 경우 런타임 에러가 발생할 수 있습니다.
List<String> stringList = new ArrayList<>();
stringList.add("Hello");
// stringList.add(123); // 컴파일 에러: Integer는 String 타입이 아님
위와 같이 제네릭을 사용하면 List
에 저장할 수 있는 타입을 String
으로 제한할 수 있다.
stringList
에 String
이외의 다른 타입을 추가하면 컴파일 에러가 발생하므로, 잘못된 타입의 데이터가 추가되는 것을 방지할 수 있음.
public class Pair<T, U> {
private T first;
private U second;
public Pair(T first, U second) {
this.first = first;
this.second = second;
}
public T getFirst() {
return first;
}
public U getSecond() {
return second;
}
}
// 사용 예시
Pair<String, Integer> pair1 = new Pair<>("Hello", 123);
Pair<Double, Double> pair2 = new Pair<>(10.5, 20.5);