자바에서 클래스나 메서드를 정의할 때, 특정 데이터 타입에 의존하지 않고 다양한 타입을 처리할 수 있도록 만드는 방법이다.
제네릭을 사용하면 데이터 타입을 일반화시켜 코드의 재사용성과 타입 안전성을 높일 수 있다. 제네릭을 통해 컴파일 시점에 타입을 확정하고, 그로인해 잘못된 타입 사용을 방지할 수 있다.
제네릭은 클래스나 메서드를 정의할 때 사용되며, 그 안에서 다룰 데이터 타입을 나중에 지정할 수 있도록 해준다. 예를 들어 특정 클래스가 Integer,String과 같은 다양한 데이터 타입을 처리해야하는 경우, 제네릭을 사용하면 같은 코드를 중복 작성하지 않고 한 번에 다양한 데이터 타입을 처리할 수 있다.
class 클래스이름<T> {
// 클래스 내용
}
여기서 T는 제네릭 타입 매개변수로 Type을 나타내는 약어이다. T 외에도 E, K, V 등 다양한 문자를 사용할 수 있다.
하지만 일반적으로는 T를 많이 사용한다.
사용 예시
public class Box<T> {
private T item;
// 아이템 저장
public void setItem(T item) {
this.item = item;
}
// 아이템 반환
public T getItem() {
return item;
}
public static void main(String[] args) {
// String 타입의 Box
Box<String> stringBox = new Box<>();
stringBox.setItem("Hello");
System.out.println(stringBox.getItem()); // 출력: Hello
// Integer 타입의 Box
Box<Integer> intBox = new Box<>();
intBox.setItem(123);
System.out.println(intBox.getItem()); // 출력: 123
}
}
제네릭 메서드 예시
public class GenericMethodExample {
// 제네릭 메서드
public static <T> void printArray(T[] array) {
for (T element : array) {
System.out.println(element);
}
}
public static void main(String[] args) {
// Integer 배열 출력
Integer[] intArray = {1, 2, 3, 4, 5};
printArray(intArray);
// String 배열 출력
String[] strArray = {"A", "B", "C", "D"};
printArray(strArray);
}
}
제네릭이 없다면 모든 객체를 Object로 처리해야하며, 이로인해 불필요한 형변환이 필요하게 된다.
public class NonGenericBox {
private Object item;
public void setItem(Object item) {
this.item = item;
}
public Object getItem() {
return item;
}
public static void main(String[] args) {
NonGenericBox box = new NonGenericBox();
box.setItem("Hello");
// 형 변환 필요
String item = (String) box.getItem();
System.out.println(item);
// 형 변환 오류 가능성
box.setItem(123);
String wrongType = (String) box.getItem(); // 실행 시 ClassCastException 발생
}
}
setItem() 메서드는 매개변수로 Object 타입을 받기 때문에 어떤 객체든 저장할 수 있다. 예를 들어, String 객체도 저장할 수 있고, Integer 객체도 저장할 수 있다.getItem() 메서드는 저장된 객체를 반환하는데, 반환 타입이 Object이다. 이 반환된 객체를 사용할 때, 해당 객체를 구체적인 타입(예: String)으로 형 변환(casting) 해야한다.setItem("Hello")로 String 객체를 저장했고, 이를 String으로 형 변환하여 문제없이 사용했다. 하지만 두 번째로 setItem(123)로 Integer 객체를 저장하고 나서 이를 String으로 잘못 형 변환하려고 하므로, ClassCastException이 발생하게 된다.ClassCastException이 발생한다. String.valueOf()메서드를 사용해야 한다. 이 메서드는 int나 Integer 값을 문자열로 반환해준다. Integer intObj = 123;
String str = String.valueOf(intObj);
System.out.println(str); // 출력: "123"
Integer.toString()메서드를 통해 Integer 객체의 값을 문자열로 변환할 수 있다.Integer intObj = 123;
String str = intObj.toString();
System.out.println(str); // 출력: "123"
Integer intObj = 123;
String str = intObj + ""; // 문자열 결합
System.out.println(str); // 출력: "123"
String str = "123";
int number = Integer.parseInt(str);
System.out.println(number); // 출력: 123
String str = "123";
Integer number = Integer.valueOf(str);
System.out.println(number); // 출력: 123