개발/자바

자바 제네릭(Generics)의 모든 것: T, E, K, V, N ? 와 다양한 타입 매개변수 활용법

피터JK 2025. 2. 20. 14:28
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>TInteger로, Box<String>TString으로 대체한 형태입니다.

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>EString으로, MyList<Integer>EInteger로 대체합니다.

? (Wildcard)

  • ?와일드카드로, 불특정한 타입을 의미합니다. 주로 제네릭 타입을 유연하게 처리하려는 경우에 사용됩니다.
  • 와일드카드는 특정 타입을 제한하지 않고 사용할 수 있게 해줍니다.
  • 예시:
```
List<?> list = new ArrayList<String>();
```
  • 이 예제에서 List<?>어떤 타입의 리스트도 받을 수 있다는 의미입니다.
  • 와일드카드의 구체적인 사용법
  1. List<?>: 제네릭 타입의 불특정 타입을 나타냅니다.
  2. List<? extends T>: T 또는 T자식 타입을 받을 수 있는 타입 제한입니다. 예를 들어, List<? extends Number>NumberNumber를 상속하는 클래스들의 리스트를 의미합니다.
  3. List<? super T>: T 또는 T부모 타입을 받을 수 있는 타입 제한입니다. 예를 들어, List<? super Integer>IntegerInteger의 부모 타입(예: Number, Object)을 받을 수 있습니다.

2. 다른 제네릭 타입 예시

K, V (Key, Value)

  • KV는 보통 맵(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 NumberNNumber의 하위 클래스여야 한다는 제약을 가집니다. 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>StringInteger를 쌍으로 다루는 Pair 클래스입니다.

3. 정리

약자 의미 설명
T Type 제네릭 클래스에서 사용되는 일반적인 타입을 나타냄
E Element 컬렉션 타입에서 요소의 타입을 나타냄
K Key 맵의 키 타입을 나타냄
V Value 맵의 값 타입을 나타냄
N Number 숫자 타입 (Number나 그 하위 클래스들)
? Wildcard 불특정 타입을 나타내는 와일드카드, 다양한 제한을 걸 수 있음
T1, T2 Multiple Type Parameters 여러 개의 타입 매개변수를 사용할 때 사용

제네릭을 활용한 컬렉션 활용 및 안전한 타입 처리에 큰 장점이 있기 때문에, 타입 안정성을 높이고 타입 관련 오류를 컴파일 시점에 처리할 수 있습니다.

728x90