gone

[Java] 제네릭 타입 본문

개발일지(TIL)/Java

[Java] 제네릭 타입

예쁨받는 돌맹이 2025. 2. 2. 22:23

Java에서 T, E, K, V 같은 알파벳을 사용한 메서드나 클래스는 "제네릭(Generic)" 을 의미한다.

 

제네릭은 컴파일 타임에 타입을 지정할 수 있도록 하는 기능으로, 유연성과 타입 안정성을 높여준다.

 

* 대표 타입 매개변수

제네릭 타입 의미 사용 예시
T (Type) 임의의 타입을 나타냄 (가장 일반적) <T> T getvalue()
E (Element) 컬랙션(List, Set)에서 요소(Element)를 나타냄 List<E>
K (Key), V (Value) Map의 Key와 Value 타입을 의미  Map<K, V>

 

 

* 개념

- 컴파일 타임에 타입을 지정할 수 잇도록 해주는 기능

- 클래스나 메서드의 타입을 특정 타입으로 고정하지 않고, 사용하는 시점에서 결정할 수 있도록 함.

- 컴파일 시 타입을 체크하여 안정성을 높임.


* 제네릭을 사용하지 않는 경우

public Object get(Long key) {
    return "Hello";  // 리턴 타입이 Object이므로, 원하는 타입으로 캐스팅 필요
}

String value = (String) get(123L);  // 반드시 캐스팅해야 함


=> 직접 캐스팅해야 하므로 런타임 오류 발생 가능성이 있음..


* 제네릭을 사용한 경우

public <T> T get(Long key, Class<T> classType) {
    return classType.cast("Hello");
}

String value = get(123L, String.class);  // 컴파일 타임에 타입이 정해짐

 

=> 타입 안정성이 보장되고, 캐스팅할 필요 없음..

 


1. T

public class Box<T> {
    private T value;

    public void set(T value) {
        this.value = value;
    }

    public T get() {
        return value;
    }
}

public class Main {
    public static void main(String[] args) {
        Box<String> stringBox = new Box<>();
        stringBox.set("Hello");
        System.out.println(stringBox.get());  // "Hello"

        Box<Integer> intBox = new Box<>();
        intBox.set(100);
        System.out.println(intBox.get());  // 100
    }
}

 

2. E

public class CustomList<E> {
    private List<E> list = new ArrayList<>();

    public void add(E element) {
        list.add(element);
    }

    public E get(int index) {
        return list.get(index);
    }
}

public class Main {
    public static void main(String[] args) {
        CustomList<String> stringList = new CustomList<>();
        stringList.add("Java");
        System.out.println(stringList.get(0));  // "Java"
    }
}

 

3. K, V

public class CustomMap<K, V> {
    private Map<K, V> map = new HashMap<>();

    public void put(K key, V value) {
        map.put(key, value);
    }

    public V get(K key) {
        return map.get(key);
    }
}

public class Main {
    public static void main(String[] args) {
        CustomMap<String, Integer> customMap = new CustomMap<>();
        customMap.put("age", 25);
        System.out.println(customMap.get("age"));  // 25
    }
}

 

 

'개발일지(TIL) > Java' 카테고리의 다른 글

[Java] Spring - 빈 스코프 (Scope)  (0) 2024.11.01