✅ 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;
}
댓글