✅ 제네릭(Generic)이란?
: 컴파일 시점에서 데이터 타입을 지정할 수 있도록 해주는 기능
즉, 컴파일러가 타입을 체크 → 타입 안정성이 증가, 불필요한 다운캐스팅x
아래 예시 코드와 함께 이해해보자
public class UsingObject {
private Object value; // Object 타입 사용
public void setValue(Object value) {
this.value = value; //getter
}
public Object getValue() {
return value; //setter
}
}
public class Main {
public static void main(String[] args) {
UsingObject usingObject = new UsingObject();
usingObject.setValue("Hello");
// 📌 Downcasting 필요함!!
String str = (String) usingObject.getValue();
System.out.println(str);
}
}
제네릭을 써서 개선해보자!
public class UsingObject<T> {
private T value;
public void setValue(T value) {
this.value = value;
}
public T getValue() { // 반환 타입 T로 지정
return value;
}
}
public class Main {
public static void main(String[] args) {
UsingObject<String> usingObject = new UsingObject<>(); // String 타입으로 고정
usingObject.setValue("Hello");
// 📌 Downcasting 불필요!!
String str = usingObject.getValue();
System.out.println(str);
}
}
✅ 컴파일 시점에서 타입 체크가 가능해서 안정성이 증가
✅ 값을 꺼낼 때 다운캐스팅이 필요 없음!!!!!!! (개뀰)
제네릭 클래스는 클래스 선언할 때 <T>를 선언하여 활용한다.
→ 다양한 타입을 안전하게 처리할 수 있다
//예시
public class GenericBox<T> { // ✅ 제네릭 클래스
private T item;
public GenericBox(T item) {
this.item = item;
}
public T getItem() {
return this.item;
}
}
public class Main {
public static void main(String[] args) {
// 1. ✅ 재사용 가능(컴파일시 타입소거: T -> Object)
//<>꺽쇠 안에 타입 정해주기
GenericBox<String> strGBox = new GenericBox<>("ABC");
GenericBox<Integer> intGBox = new GenericBox<>(100);
GenericBox<Double> doubleGBox = new GenericBox<>(0.1);
// 2. ✅ 타입 안정성 보장(타입소거: 자동으로 다운캐스팅)
String strGBoxItem = strGBox.getItem();
Integer intGBoxItem = intGBox.getItem();
Double doubleGBoxItem = doubleGBox.getItem();
System.out.println("strGBoxItem = " + strGBoxItem);
System.out.println("intGBoxItem = " + intGBoxItem);
System.out.println("doubleGBoxItem = " + doubleGBoxItem);
}
}
: 메서드 내부에서 사용할 타입을 유연하게 지정할 수 있다.
→ 다양한 값을 사용해야하는 계산기 기능에 적합!
'메서드 선언부'에 타입 매개변수가 선언된 메서드 <S>
public <S> void printG(S item){
System.out.println(item);
}
✅ 모든 데이터타입 활용 가능!
✅ 제네릭 클래스는 선언부에 타입을 지정했지만 메서드는 그렇지 않음
알잘깔딱센하게 알아서 변수 타입 변환해가지고 쓸수있게 도와준다!