티스토리 뷰
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 수업 자료
Generics - Generic Types(제네릭 타입)과 Wildcards(와일드 카드)
제네릭(Generics) 제네릭은 클래스, 인터페이스, 메소드를 정의할 때 매개변수로 받은 Type으로 정의된다. // 1. 제네릭 클래스 public Coffee{ // 객체를 생성할 때, new Class으로 하면 클래스 내부 T로 정의
nauni.tistory.com
'정리용 > java' 카테고리의 다른 글
[JAVA] 기초 7. 키워드 Enum (1) | 2025.02.04 |
---|---|
[JAVA] 기초 4-1 다형성과 상속 (0) | 2025.02.04 |
[JAVA] 기초 5. Array와 Collection (0) | 2025.01.23 |
[JAVA] 기초 4. inferface, abstract class (0) | 2025.01.23 |
[JAVA] 기초 3. 키워드 final, static (0) | 2025.01.23 |
- Total
- Today
- Yesterday
- useRef
- git
- react
- asac#asac7기
- useEffect
- ASAC
- useLayoutEffect
- useState
- ssh
- useCallback
- asac7#asac
- useMemo
- acac
- useContext
- acas#acas7기
- asac7
- Nginx
- useReducer
- memo
- asac7기
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |