제네릭의 주요 개념
- 제네릭 클래스(Generic Class): 제네릭 클래스를 정의하면 클래스의 인스턴스를 생성할 때 구체적인 타입을 지정할 수 있습니다.
여기서 T는 타입 매개변수(Type Parameter)로, Box 클래스가 사용될 때 구체적인 타입으로 대체됩니다.public class Box<T> { private T item; public void setItem(T item) { this.item = item; } public T getItem() { return item; } }
- 제네릭 메소드(Generic Method): 제네릭 메소드는 메소드의 선언에 타입 매개변수를 사용하여 다양한 타입을 처리할 수 있습니다.
public <T> void printArray(T[] array) { for (T element : array) { System.out.println(element); } }
여기서 <T>는 메소드의 타입 매개변수로, printArray 메소드가 호출될 때 구체적인 타입으로 대체됩니다. - 제네릭 인터페이스(Generic Interface): 인터페이스에도 제네릭을 사용할 수 있습니다.
public interface Comparable<T> { int compareTo(T o); }
- 제네릭 타입 제한(Bounded Type Parameters): 제네릭 타입 매개변수에 상한(upper bound)을 지정하여 특정 타입이나 그 하위 타입으로 제한할 수 있습니다.
public <T extends Number> void printNumber(T number) { System.out.println(number); }
여기서 T extends Number는 T가 Number 타입이거나 그 하위 클래스임을 나타냅니다.
제네릭의 장점
- 타입 안전성(Type Safety): 컴파일 시 타입을 체크하여 런타임 오류를 방지합니다.
- 코드 재사용성(Code Reusability): 다양한 타입을 처리할 수 있는 일반화된 코드를 작성할 수 있습니다.
- 명확성: 코드의 가독성과 명확성이 증가합니다. 어떤 타입이 사용되는지 명확하게 알 수 있습니다.
제네릭의 한계
- 기본 타입 사용 불가: 제네릭은 참조 타입(Reference Type)만 사용할 수 있으며, 기본 타입(Primitive Type)은 사용할 수 없습니다. 예를 들어, int 대신 Integer를 사용해야 합니다.
- 타입 소거(Type Erasure): 제네릭 타입 정보는 컴파일 시 제거되어 런타임에는 알 수 없습니다. 이는 역직렬화나 리플렉션을 사용할 때 제약이 될 수 있습니다.
- 정적 멤버에서 사용 제한: 제네릭 타입 매개변수는 정적 컨텍스트에서 사용할 수 없습니다. 정적 변수나 메소드는 제네릭 타입 매개변수를 사용할 수 없습니다.
예제
아래는 제네릭 클래스와 메소드를 사용하는 예제입니다.
public class Box<T> {
private T item;
public void setItem(T item) {
this.item = item;
}
public T getItem() {
return item;
}
}
public class Main {
public static void main(String[] args) {
Box<String> stringBox = new Box<>();
stringBox.setItem("Hello World");
System.out.println(stringBox.getItem());
Box<Integer> integerBox = new Box<>();
integerBox.setItem(123);
System.out.println(integerBox.getItem());
Integer[] integers = {1, 2, 3, 4, 5};
printArray(integers);
String[] strings = {"one", "two", "three"};
printArray(strings);
}
public static <T> void printArray(T[] array) {
for (T element : array) {
System.out.println(element);
}
}
}
이 예제에서 Box 클래스는 제네릭 클래스로, String과 Integer 타입을 각각 지정하여 사용할 수 있습니다. 또한, printArray 제네릭 메소드는 배열의 요소를 출력할 수 있습니다.
'Java' 카테고리의 다른 글
알고리즘 코딩테스트( 시간 복잡도 ~ 구간 합 ) (0) | 2024.08.16 |
---|---|
Java 람다 표현식 (0) | 2024.07.31 |
Java Stream(스트림) (0) | 2024.07.30 |
Java 배열 (0) | 2024.07.23 |
Java 반복문 for, while, do-while (0) | 2024.07.23 |