티스토리 뷰

정리용/java

[JAVA] 기초 6. Generic

hee-ya07 2025. 1. 23. 22:39

0. Generic

:: 클래스, 인터페이스, 메서드에서 사용할 수 있는 타입 매개변수를 정의할 수 있는 기능

:: 처리할 타입을 미리 정의하지 않고, 사용하는 시점에서 타입을 지정 가능

// 제네릭 Ex
class Box<T> {
    private T value;

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

    public T getValue() {
        return value;
    }
}

0.1 제네릭 네이밍 컨벤션

:: 각각 제네릭에는 의미가 있음에 유의

E Element
K Key
N Number
T Type
? any
S, U, V 2nd, 3nd, 4nd ...
V Value

0.2 <T> VS <?>

구분 T ?
의미 제네릭 타입 파라미터로 어떤 타입이든 가능 와일드 카드로 어떤 타입도 가능
사용 위치 제네릭 클래스, 메서드, 인터페이스의 타입 파라미터 제네릭 타입의 매개변수로 주로 사용
제약 사항 제네릭을 사용하는 시점에서 타입을 지정 타입을 지정하지 않고 다양한 타입을 허용
용도 정확한 타입을 사용할 때 모든 타입을 처리하거나 특정 타입의 범위를 제한할 때
상속 제약 특정 타입만을 사용하려면 extends를 사용 extends 또는 super로 타입의 범위 제한 가능

0.2-1 < T extends otherT>

:: T를 otherT의 하위 타입임을 명시
:: 이러면 T는 otherT의 자식이어야 함


0.2-2 < ? extends otherT>

:: 상한 와일드 카드

:: ?는 otherT의 하위 타입일 수 도 있다
:: 이러면 구체적인 타입의 범위가 정해지지 않게 됨 -> 읽기만 가능


+ < ? super otherT>

:: 하한 와일드 카드

:: ?는 otherT의 상위 클래스일 수 도 있다.

:: 이것도 구체적인 타입의 범위가 애매하지만 -> 최소치를 정의해 쓰기가 가능..


구분 <? extends T> <? super T>
의미 T or T의 하위 타입을 받을 수 있음 T or T의 상위 타입을 받을 수 있음
타입 범위 T의 하위 클래스만 허용 T or T의 부모 클래스만 허용
사용 목적 주로 읽기 전용
상속 계층에서 상위 타입을 처리
주로 쓰기 전용
특정 상위 타입에 값을 추가 시
예시 List<? extends Number> : List<Integer>, List<Double> List<? super Integer> : List<Number>, List<Object> 

0.3 유의점

1) 참조형만 타입에 들어갈 수 있음 <-> 기본형인 int, char는 X

    => But, 박싱된 타입인 Integer와 Character 사용 가능

// 올바르지 않은 예시: 기본 자료형 사용 불가
List<int> list = new ArrayList<>();  // 오류 발생

// 올바른 예시: 박싱된 타입 사용
List<Integer> list = new ArrayList<>();  // 정상 동작

 

2) 인스턴스화 불가능

// 잘못된 예시
public class Example<T> {
    public Example() {
        T obj = new T();  // 컴파일 오류
    }
}

:: <T>는 컴파일 시에 타입이 결정되지만 인스턴스를 생성할 수 없는 타입
:: 컴파일 시에는 존재하지만 T는 런타임 시에는 존재하지 않기 때문 -> 팩토리 패턴으로 해결

더보기
public class Example<T> {
    private ObjectFactory<T> factory;

    public Example(ObjectFactory<T> factory) {
        this.factory = factory;
    }

    public T createInstance() {
        return factory.create();
    }

    public static void main(String[] args) {
        Example<String> example = new Example<>(() -> "Hello");
        String str = example.createInstance();
        System.out.println(str);  // Hello 출력
    }
}

interface ObjectFactory<T> {
    T create();
}

 

3) 타입 파라미터 배열 생성 불가

// 잘못된 예시
T[] array = new T[10];  // 컴파일 오류

 


참조

ASAC 수업 자료

https://nauni.tistory.com/143

 

Generics - Generic Types(제네릭 타입)과 Wildcards(와일드 카드)

제네릭(Generics) 제네릭은 클래스, 인터페이스, 메소드를 정의할 때 매개변수로 받은 Type으로 정의된다. // 1. 제네릭 클래스 public Coffee{ // 객체를 생성할 때, new Class으로 하면 클래스 내부 T로 정의

nauni.tistory.com

 

공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/07   »
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31
글 보관함