본문 바로가기
Java

[Java] 자바 제네릭(Generic)의 기본 개념과 사용 이유

by clolee 2025. 5. 13.

✅ Part 1: 자바 제네릭(Generic)의 기본 개념과 사용 이유


📌 1. 제네릭이란?

제네릭(Generic) 은 자바에서 데이터 타입을 클래스나 메서드 선언 시 고정하지 않고,

사용 시점에 지정할 수 있도록 해주는 문법입니다.

즉, “타입을 매개변수처럼 다룬다”는 뜻이에요.


📦 2. 왜 제네릭을 쓰는가?

✅ 제네릭 도입 전의 문제점 (Java 1.4 이전)

List list = new ArrayList();
list.add("hello");
list.add(123); // 타입이 섞여도 컴파일러가 모르고 허용

String s = (String) list.get(1); // ❌ 런타임 오류: ClassCastException

✅ 제네릭 도입 이후 (Java 1.5부터)

List<String> list = new ArrayList<>();
list.add("hello");
list.add(123); // ❌ 컴파일 오류

String s = list.get(0); // ✅ 안전하게 사용

🎯 3. 제네릭을 쓰는 목적

목적 설명
타입 안정성(Type Safety) 잘못된 타입 사용을 컴파일 타임에 방지
코드 재사용성 하나의 클래스/메서드로 여러 타입 처리 가능
명확한 문서화 코드만 보고도 어떤 타입이 들어오는지 알 수 있음
형변환 제거 (타입) 캐스팅 없이도 값 사용 가능

✅ 4. 제네릭 사용 방법

📌 클래스에 제네릭 사용

public class Box<T> {
    private T item;

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

    public T get() {
        return item;
    }
}
  • T타입 매개변수 (Type Parameter): 관례적으로 T, E, K, V 등 사용
  • 실제 타입은 객체 생성 시점에 결정됨
Box<String> strBox = new Box<>();
strBox.set("Hello");
String s = strBox.get(); // 캐스팅 필요 없음

Box<Integer> intBox = new Box<>();
intBox.set(10);
Integer n = intBox.get();

📌 메서드에 제네릭 사용

public class Util {
    public static <T> void print(T item) {
        System.out.println(item);
    }
}
Util.print("Hello");
Util.print(123);
Util.print(3.14);
  • <T>는 메서드 수준의 타입 매개변수 선언
  • 메서드가 어떤 타입이든 받아들일 수 있음

🧠 5. 제네릭 사용 시 주의할 점

항목 설명
타입 소거(Type Erasure) 컴파일 시 제네릭 타입은 제거되고 Object로 변환됨
제네릭 배열 생성 불가 T[] arr = new T[10]; ❌ (타입 정보가 런타임에 없음)
static 멤버와 함께 사용 제한 static T value; ❌ → 타입은 클래스마다 공유되지만 static은 클래스당 1개이기 때문

📝 예제 1: Pair 클래스

public class Pair<K, V> {
    private K key;
    private V value;

    public Pair(K key, V value) {
        this.key = key;
        this.value = value;
    }

    public K getKey() { return key; }
    public V getValue() { return value; }
}
Pair<String, Integer> age = new Pair<>("Tom", 30);
System.out.println(age.getKey());    // "Tom"
System.out.println(age.getValue()); // 30

✅ 정리

구분 설명
제네릭 클래스 class MyClass<T> {}
제네릭 메서드 <T> T method(T param)
이점 타입 안정성, 코드 재사용, 형변환 제거
자주 쓰는 타입 변수 T (Type), E (Element), K/V (Key/Value), R (Return)

🔷 0. [보충] T, E, K, V 같은 제네릭 타입 매개변수 이름의 의미

📌 타입 매개변수 이름은 규칙이 있는가?

자바 제네릭의 타입 매개변수(T)는 사실상 어떤 문자든 사용 가능합니다.

하지만 명확성과 관례상 다음과 같은 약속된 한 글자 이름을 사용하는 것이 일반적이며, 의미도 포함되어 있습니다:

약자 의미 사용 맥락
T Type 일반적인 타입 (객체, 파라미터 등)
E Element 컬렉션 요소 타입 (예: List<E>)
K Key 맵의 키 타입 (Map<K, V>)
V Value 맵의 값 타입
R Return 반환 타입
S, U, W 보조 타입 변수 여러 타입이 필요한 경우 추가로 사용

📌 관례에 따르는 이유: 코드를 읽는 사람에게 의도를 명확히 전달하기 위해

 

예를 들어 아래는 모두 동작은 하지만 관례를 지킨 쪽이 더 이해하기 쉽습니다:

// 좋지 않은 방식
class Container<X, Y> {
    X key;
    Y value;
}

// 좋은 방식
class Container<K, V> {
    K key;
    V value;
}

댓글