지네릭스
- 다양한 타입의 객체들을 다루는 메서드나 컬렉션 클래스에 컴파일 시의 타입체크를 해주는 기능
- 타입의 안정성을 제공
- 타입체크와 형변환을 생략할 수 있으므로 코드가 간결해짐
타입 | 설명 |
<T> | Type |
<E> | Element |
<K> | Key |
<V> | Value |
<N> | Number |
- R, A, U 등등도 존재한다
class Box<T>{
T item;
void setItem(T item){
this.item = item;
}
T getItem(){
return item;
}
}
Box<String> box = new Box<String>()
box.setItem("ABC");
// 이런식으로 변환됌
class Box<String>{
String item;
void setItem(String item){
this.item = item;
}
String getItem(){
return item;
}
}
- Box<T> => 지네릭 클래스 / 'T의 Box' 또는 'T Box'
- T => 타입 변수 또는 타입 매개변수
- Box => 원시타입
- <? extends T> => 와일드카드의 상한 제한 / T와 그 자손들만 가능
- <? super T> => 와일드카드의 하한 제한 / T와 그 조상들만 가능
- <?> => 제한 없음 / 모든 타입이 가능
- 지네릭 메서드
static <T> void sort(List<T> list, Comparator<? super T> c)
// ! 지네릭 클래스에 정의된 타입 매개변수와 지네릭 메서드에 정의된 타입 매개변수는 전혀 별개의 것임
static Juice makeJuice(FruitBox<? extends Fruit> box){
return new Juice(tmp);
}
// =>
static <T extends Fruit> Juice makeJuice(FruitBox<T> box){
return new Juice(tmp);
}
<? extends T> / <K extends T> 차이
- K는 특정 타입으로 지정이 되지만, ?는 타입이 지정되지 않는다는 의미
/*
* Number와 이를 상속하는 Integer, Short, Double, Long 등의
* 타입이 지정될 수 있으며, 객체 혹은 메소드를 호출 할 경우 K는
* 지정된 타입으로 변환이 된다.
*/
<K extends Number>
/*
* Number와 이를 상속하는 Integer, Short, Double, Long 등의
* 타입이 지정될 수 있으며, 객체 혹은 메소드를 호출 할 경우 지정 되는 타입이 없어
* 타입 참조를 할 수는 없다.
*/
<? extends T> // T와 T의 자손 타입만 가능
interface Drink{
}
class Coffee implements Drink{
}
class Milk implements Drink{
}
public class GenericTest {
private void test1(final List<? extends Drink> drinks ){
final Drink drink = drinks.get(0);
// <? extends Drink>에 들어가는 타입은 Drink가 될수도, Drink를 구현한 Coffee가 될수도 Milk가 될수도 있다.
// 하지만 결국 Drink 타입을 구현하므로 drinks에서 꺼내오는 것은 Drink 타입이 된다.
Drink drink1 = new Coffee();
drinks.add(drink1); // ⚡ 컴파일오류
// <? extends Drink>가 Drink 타입임을 확신할 수 없다. drinks에 넣을수 없다.
}
private <T extends Drink> void test2(final List<T> drinks){
final T t = drinks.get(0);
// <T extends Drink>에 들어가는 타입은 Drink가 될수도, Drink를 구현한 Coffee가 될수도 Milk가 될수도 있다.
// 하지만 결국 Drink 타입을 구현하므로 Drink 타입이 될 수 있다.
drinks.add(drinks.get(0)); //정상 작동
// T라는 제네릭타입은 입력받는 순간 정해지고 그 타입으로 고정되므로 문제없이 추가된다.
}
}
'프로그래밍 > JAVA' 카테고리의 다른 글
[Java] 메서드 참조 (0) | 2024.03.30 |
---|---|
[Java] OOP (0) | 2024.03.30 |
[Java] Enum (0) | 2024.03.30 |
[Java] Collections (0) | 2024.03.30 |
[Java] Conception (0) | 2024.03.30 |