충분히 쌓여가는
지네릭 메서드 본문
지네릭 메서드
지네릭 타입이 선언된 메서드(타입 변수<T>는 메서드 내에서만 유효)
static <T> void sort(List<T> list, Comparator<? super T> c)
클래스의 타입 매개변수<T>와 메서드의 타입 매개변수 <T>는 별개
FruitBox<T>와 static <T>는 다른 타입 변수이다
static <T>는 static 메서드 안에서만 사용가능하다
class FruitBox<T> { // 지네릭 클래스
...
// 지네릭 메서드
static <T> void sort(List<T> list, Comparator<? super T> c) {
...
}
}
메서드를 호출할 때마다 타입을 대입해야 된다(대부분 생략 가능)
static <T extends Fruit> Juice makeJuice(FruitBox<T> box) {
String tmp = "";
for(Fruit f : box.getList())
tmp += f + " ";
return new Juice(tmp);
}
지네릭 클래스는 객체를 생성할 때마다 지네릭 타입을 대입하지만, 지네릭 메서드는 메서드를 호출할 때마다 타입을 대입해야 한다
makeJuice를 호출할 때마다 맞는 타입(Fruit, Apple)을 대입해야 한다
FuritBox<Fruit> furitBox = new FruitBox<Furit>();
FuritBox<Apple> appleBox = new FruitBox<Apple>();
...
System.out.println(Juicer.<Fruit>makeJuice(fruitBox)); // Fruit 타입 대입
System.out.println(Juicer.<Apple>makeJuice(appleBox)); // Apple 타입 대입
System.out.println(Juicer.makeJuice(fruitBox)); // <Fruit> 생략 가능, 에러 발생할 경우 타입 적기
System.out.println(Juicer.makeJuice(appleBox)); // <Apple> 생략 가능, 에러 발생할 경우 타입 적기
메서드를 호출할 때 타입을 생략하지 않을 때는 클래스 이름 생략 불가
System.out.println(<Fruit>makeJuice(fruitBox)); // 에러, 클래스 이름 생략 불가
System.out.println(this.<Fruit>makeJuice(fruitBox)); // OK
System.out.println(Juicer.<Fruit>makeJuice(fruitBox)); // OK
지네릭 메서드와 와일드 카드 메서드 바꿔서 사용가능(둘 다 FruitBox, AppleBox 가능하기 때문)
와일드 카드: 하나의 참조변수로 서로 다른 타입이 대입된 여러 지네릭 객체를 다룰 수 있다
지네릭: 메서드를 호출할 때마다 다른 지네릭 타입을 대입할 수 있다
와일드 카드를 사용할 수 없는 경우 지네릭 메서드를 사용하면 된다
'Java > JAVA3' 카테고리의 다른 글
열거형(enum) (0) | 2023.07.30 |
---|---|
지네릭 형변환 (0) | 2023.07.29 |
와일드 카드 <?>, 지네릭 메서드 (0) | 2023.07.28 |
제한된 지네릭 클래스, 지네릭스의 제약 (0) | 2023.07.27 |
지네릭스 용어, 지네릭 타입과 다형성 (0) | 2023.07.26 |