728x90
자바에서 List<T>, List<E>, List<?> ... 등에서 사용되는 T, E, K, V, N, ?는 제네릭(Generics)을 나타내는 특수한 형식 매개변수입니다. 각기 다른 의미와 용도를 가지고 있으며, 이 외에도 다양한 제네릭 타입을 사용할 수 있습니다.
1. T, E, ? 의 의미
✅ T (Type)
T는 "Type"의 약자로, 클래스나 메소드에서 사용되는 제네릭 타입 파라미터를 나타냅니다.- 예를 들어,
List<T>에서T는 어떤 특정 타입을 의미하며, 이 타입은 나중에 실제 타입으로 대체됩니다.T는 클래스나 메소드에서 동적으로 결정될 수 있는 타입입니다.
public class Box<T> {
private T value;
public T getValue() {
return value;
}
public void setValue(T value) {
this.value = value;
}
}
Box<Integer> intBox = new Box<>();
Box<String> strBox = new Box<>();
- 위 예제에서
Box<T>클래스는T라는 타입 파라미터를 사용하여 어떤 타입의 값을 저장할 수 있도록 설계되었습니다. T는 어떤 타입이든 올 수 있는 제네릭 타입입니다.Box<Integer>는T를Integer로,Box<String>은T를String으로 대체한 형태입니다.
✅ E (Element)
E는 "Element"의 약자로, 주로 컬렉션 타입에서 사용됩니다. 리스트, 셋, 맵 등에서 요소를 표현할 때E를 사용합니다.
public class MyList<E> {
private List<E> elements = new ArrayList<>();
public void add(E element) {
elements.add(element);
}
public E get(int index) {
return elements.get(index);
}
}
MyList<String> stringList = new MyList<>();
- 이 예제에서
MyList<E>클래스는E라는 타입 파라미터를 사용하여 요소의 타입을 지정합니다.MyList<String>은E를String으로,MyList<Integer>는E를Integer로 대체합니다.
✅ ? (Wildcard)
?는 와일드카드로, 불특정한 타입을 의미합니다. 주로 제네릭 타입을 유연하게 처리하려는 경우에 사용됩니다.- 와일드카드는 특정 타입을 제한하지 않고 사용할 수 있게 해줍니다.
- 예시:
```
List<?> list = new ArrayList<String>();
```
- 이 예제에서
List<?>는 어떤 타입의 리스트도 받을 수 있다는 의미입니다. - 와일드카드의 구체적인 사용법
List<?>: 제네릭 타입의 불특정 타입을 나타냅니다.List<? extends T>:T또는T의 자식 타입을 받을 수 있는 타입 제한입니다. 예를 들어,List<? extends Number>는Number나Number를 상속하는 클래스들의 리스트를 의미합니다.List<? super T>:T또는T의 부모 타입을 받을 수 있는 타입 제한입니다. 예를 들어,List<? super Integer>는Integer나Integer의 부모 타입(예:Number,Object)을 받을 수 있습니다.
2. 다른 제네릭 타입 예시
✅ K, V (Key, Value)
K와V는 보통 맵(Map)에서 사용됩니다.K는 키(Key) 타입을,V는 값(Value) 타입을 나타냅니다.
Map<K, V> map = new HashMap<>();
Map<String, Integer>는String을 키로,Integer를 값으로 가지는 맵을 의미합니다.
✅ N (Number)
N은 일반적으로 숫자형 타입을 나타내는 데 사용됩니다. 예를 들어,Number또는Number의 하위 클래스를 처리할 때 사용합니다.
public class MyNumber<N extends Number> {
private N value;
public N getValue() {
return value;
}
}
N extends Number는N이Number의 하위 클래스여야 한다는 제약을 가집니다.Integer,Double등의 숫자 타입을 사용 가능합니다.
✅ T1, T2, ... (여러 타입 파라미터)
- 제네릭에서는 여러 개의 타입 매개변수를 사용할 수도 있습니다. 예를 들어, 두 가지 타입을 받을 때
T1,T2를 사용합니다.
public class Pair<T1, T2> {
private T1 first;
private T2 second;
public Pair(T1 first, T2 second) {
this.first = first;
this.second = second;
}
}
Pair<String, Integer>는String과Integer를 쌍으로 다루는Pair클래스입니다.
3. 정리
| 약자 | 의미 | 설명 |
| T | Type | 제네릭 클래스에서 사용되는 일반적인 타입을 나타냄 |
| E | Element | 컬렉션 타입에서 요소의 타입을 나타냄 |
| K | Key | 맵의 키 타입을 나타냄 |
| V | Value | 맵의 값 타입을 나타냄 |
| N | Number | 숫자 타입 (Number나 그 하위 클래스들) |
| ? | Wildcard | 불특정 타입을 나타내는 와일드카드, 다양한 제한을 걸 수 있음 |
| T1, T2 | Multiple Type Parameters | 여러 개의 타입 매개변수를 사용할 때 사용 |
제네릭을 활용한 컬렉션 활용 및 안전한 타입 처리에 큰 장점이 있기 때문에, 타입 안정성을 높이고 타입 관련 오류를 컴파일 시점에 처리할 수 있습니다.
728x90
'개발 > 자바' 카테고리의 다른 글
| Jakarta EE 9 (0) | 2025.02.24 |
|---|---|
| Map 인터페이스 구현체(HashMap, TreeMap, LinkedHashMap ....) (0) | 2025.02.20 |
| Collections : synchronized (list) {} 동기화 블록 (0) | 2025.02.20 |
| Collections 클래스 (0) | 2025.02.20 |
| 컬렉션 사용의 필요성 (0) | 2025.02.20 |