[JAVA] Generic 제네릭

림민지·2025년 3월 6일

Today I Learn

목록 보기
17/62

Generic 제네릭

✅ 제네릭(Generic)이란?
: 컴파일 시점에서 데이터 타입을 지정할 수 있도록 해주는 기능
즉, 컴파일러가 타입을 체크 → 타입 안정성이 증가, 불필요한 다운캐스팅x

0. Generic을 쓰지 않았을 때의 문제점 (Object)

아래 예시 코드와 함께 이해해보자

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);
    }
}
  1. 값을 꺼낼 때 다운캐스팅을 해야 함.
  2. 저장할 때 잘못된 값을 저장해도 입력 시에 잡지를 못함.

제네릭을 써서 개선해보자!

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);
    }
}

✅ 컴파일 시점에서 타입 체크가 가능해서 안정성이 증가
✅ 값을 꺼낼 때 다운캐스팅이 필요 없음!!!!!!! (개뀰)

1. Generic Class

제네릭 클래스는 클래스 선언할 때 <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);
    }
}

2. Generic Method✨

: 메서드 내부에서 사용할 타입을 유연하게 지정할 수 있다.
→ 다양한 값을 사용해야하는 계산기 기능에 적합!
'메서드 선언부'에 타입 매개변수가 선언된 메서드 <S>

public <S> void printG(S item){
	System.out.println(item);
    }

✅ 모든 데이터타입 활용 가능!
✅ 제네릭 클래스는 선언부에 타입을 지정했지만 메서드는 그렇지 않음
알잘깔딱센하게 알아서 변수 타입 변환해가지고 쓸수있게 도와준다!

profile
@lim_128

0개의 댓글