제네릭스<T>
Aug 20, 2024
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>
를 사용하여 각각 String
과 Integer
타입의 데이터를 처리하는 제네릭 클래스를 생성했습니다.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