[Java] 제네릭(Generic)

우노구나·2025년 7월 30일

제네릭이란?

타입을 파라미터처럼 넘길 수 있게 하는 기능 (Java5부터 도입됨)

List<String> list = new ArrayList<>();
  • 여기서 String은 타입 파라미터

  • ListString 타입 요소들만 담도록 제한됨 → 타입 안전성 보장!



제네릭이 왜 필요할까?

제네릭이 없었을 때

List list = new ArrayList();
list.add("hello");
list.add(123); // 숫자도 들어감

String str = (String) list.get(0); // 형변환 필요
  • 모든 요소가 Object로 처리 → 꺼낼 때 형변환 필요

  • 타입 불일치 시 ClassCastException 발생 위험

제네릭 사용후

List<String> list = new ArrayList<>();
list.add("hello");
// list.add(123); // 컴파일 에러 발생!

String str = list.get(0); // 형변환 불필요

장점

  • 컴파일 시점에 타입 체크 가능

  • 형변환(casting) 필요 없음

  • 코드 재사용성과 가독성 향상


예제

public class Box<T> {
    private T value;

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

    public T get() {
        return value;
    }
}
Box<String> stringBox = new Box<>();
stringBox.set("Hello");
System.out.println(stringBox.get()); // Hello

Box<Integer> intBox = new Box<>();
intBox.set(42);
System.out.println(intBox.get()); // 42

제한된 제네릭 (bounded generics)

public <T extends Number> void printNumber(T number) {
    System.out.println(number);
}
  • T extends Number: TNumber 또는 그 하위 클래스만 가능

  • Integer, Double, Float 등은 OK

  • String은 에러 발생


와일드카드 (?) 예시

public void printList(List<?> list) {
    for (Object obj : list) {
        System.out.println(obj);
    }
}
  • List<?> : 어떤 타입이든 상관 없는 리스트

  • ? extends Number : Number 하위 타입만 허용

  • ? super Integer : Integer 상위 타입만 허용

와일드카드는 추후 조금 더 자세하게 정리해야할 것 같다.

profile
기술 블로그

0개의 댓글