Generics

sungs·2025년 6월 20일

자바

목록 보기
17/95

📌 제네릭이란?

제네릭(Generics)은 클래스나 메서드를 정의할 때 데이터 타입을 일반화(파라미터화) 해서 코드의 재사용성과 타입 안정성을 높이는 기능이다.

List<String> list = new ArrayList<>();

🧩 제네릭을 사용하는 이유

  1. 타입 안정성 보장

    • 컴파일 시점에 타입을 체크할 수 있어 오류를 줄일 수 있음
  2. 형변환 제거

    • 불필요한 캐스팅을 줄일 수 있음
  3. 코드 재사용성 증가

    • 다양한 타입에 대해 재사용 가능한 클래스 및 메서드 작성 가능

✍️ 제네릭 클래스 정의

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);
        }
    }
}
  • 메서드에 T를 명시해 제네릭으로 선언할 수 있다.
String[] names = {"A", "B", "C"};
Util.printArray(names);

🎯 제네릭 제한 (Bounded Generics)

특정 타입이나 그 하위 클래스만 허용하고 싶을 때 extends를 사용한다.

public class NumberBox<T extends Number> {
    private T number;
}
  • T는 Number의 하위 클래스여야 한다. (Integer, Double 등 가능)

🔄 와일드카드 <?>

1. <?>: 어떤 타입이든 허용

public void printList(List<?> list) {
    for (Object obj : list) {
        System.out.println(obj);
    }
}

2. <? extends T>: T 또는 T의 하위 타입만 허용 (읽기 전용)

public void sumNumbers(List<? extends Number> numbers) {
    // 읽기는 가능하지만 쓰기는 제한됨
}

3. <? super T>: T 또는 T의 상위 타입만 허용 (쓰기 가능)

public void addNumbers(List<? super Integer> numbers) {
    numbers.add(10);  // Integer 또는 상위 타입인 Number, Object 가능
}

⚠️ 제네릭의 제약사항

  • static 필드에 사용 불가
static T value; // 불가능
  • 런타임에는 타입 정보를 알 수 없음 (타입 소거)
if (obj instanceof List<String>) // 오류 발생
  • 기본형 사용 불가 (int → Integer로 사용해야 함)

✅ 마무리

Java의 제네릭은 복잡해 보이지만, 코드의 안정성과 유연성을 높여주는 강력한 도구이다. 타입 안정성, 코드 재사용성, 가독성을 위해 꼭 알아두어야 할 개념이니, 다양한 예제로 익혀두는 것을 추천한다.

profile
앱 개발 공부 중

0개의 댓글