제네릭스<T>

허성재's avatar
Aug 20, 2024
제네릭스<T>
Java에서 <T>제네릭스(Generics)라고 불리는 기능의 일환으로, 타입 매개변수를 정의할 때 사용됩니다. 제네릭스는 클래스, 인터페이스, 메서드에서 사용할 수 있으며, 컴파일 시간에 타입을 지정하여 타입 안전성을 높이고 코드 재사용성을 향상시킵니다.

1. 제네릭스의 개념

제네릭스를 사용하면 코드 작성 시 구체적인 데이터 타입을 명시하지 않고, 나중에 사용할 때 필요한 데이터 타입을 지정할 수 있습니다. <T>에서 T타입 매개변수(Type Parameter)로, 일반적으로 T, E, K, V, N 등과 같은 이름을 사용하지만, 이 이름은 임의로 지정할 수 있습니다.

2. 제네릭 클래스

제네릭 클래스를 정의할 때, 클래스 이름 뒤에 <T>를 붙여 타입 매개변수를 선언합니다. 이 타입 매개변수는 클래스 내부에서 사용될 실제 데이터 타입을 나타냅니다.
public class Box<T> { private T content; public void setContent(T content) { this.content = content; } public T getContent() { return content; } }
위 예제에서 Box<T> 클래스는 제네릭 클래스입니다. T는 클래스의 필드 content와 메서드 setContent()getContent()에서 사용된 타입 매개변수입니다. 이 클래스는 다양한 데이터 타입을 처리할 수 있습니다.
public class Main { public static void main(String[] args) { Box<String> stringBox = new Box<>(); // String 타입으로 Box 생성 stringBox.setContent("Hello"); System.out.println(stringBox.getContent()); // 출력: Hello Box<Integer> integerBox = new Box<>(); // Integer 타입으로 Box 생성 integerBox.setContent(123); System.out.println(integerBox.getContent()); // 출력: 123 } }
위 코드에서는 Box<String>Box<Integer>를 사용하여 각각 StringInteger 타입의 데이터를 처리하는 제네릭 클래스를 생성했습니다.

3. 제네릭 메서드

메서드 자체에 제네릭스를 적용할 수도 있습니다. 제네릭 메서드는 메서드 선언부에 타입 매개변수를 추가하여 정의합니다.
public class Util { public static <T> void printArray(T[] array) { for (T element : array) { System.out.print(element + " "); } System.out.println(); } }
위 예제에서 printArray 메서드는 제네릭 메서드로, 어떤 타입의 배열이든 출력할 수 있습니다.
public class Main { public static void main(String[] args) { Integer[] intArray = {1, 2, 3, 4, 5}; String[] stringArray = {"A", "B", "C"}; Util.printArray(intArray); // 출력: 1 2 3 4 5 Util.printArray(stringArray); // 출력: A B C } }
Util.printArray() 메서드는 배열의 타입에 관계없이 사용할 수 있습니다.

4. 제네릭스의 장점

  • 타입 안전성: 컴파일 시간에 타입 체크를 수행하여, 잘못된 타입이 사용되는 것을 방지합니다.
  • 캐스팅 제거: 제네릭스를 사용하면 명시적인 캐스팅을 제거할 수 있어 코드가 더 간결하고 안전해집니다.
  • 코드 재사용성: 제네릭 클래스를 사용하면 다양한 타입의 데이터를 처리하는 동일한 코드 베이스를 재사용할 수 있습니다.

5. 제네릭스와 와일드카드

제네릭스를 사용할 때 ? 문자를 사용하여 와일드카드(Wildcard)를 표현할 수 있습니다. 와일드카드는 특정한 제약 없이 여러 타입을 처리할 수 있게 합니다.
  • ?: 어떤 타입이든 가능
  • ? extends T: T 또는 T의 서브클래스만 가능
  • ? super T: T 또는 T의 슈퍼클래스만 가능
public static void printNumbers(List<? extends Number> list) { for (Number number : list) { System.out.println(number); } }
이 메서드는 Number와 그 하위 클래스(Integer, Double 등)의 리스트를 처리할 수 있습니다.

결론

<T>는 제네릭스를 나타내는 타입 매개변수로, 자바에서 타입의 안정성을 높이고 코드의 재사용성을 증가시키는 중요한 기능입니다. 제네릭스를 사용하면 코드가 보다 유연하고 안전하게 작성될 수 있으며, 다양한 타입을 한 번에 처리할 수 있습니다.
Share article

heo-gom