Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
Tags
- 코테
- Number Theory
- Binary Search
- database
- hash table
- Data Structure
- geometry
- greedy
- 파이썬
- 구현
- Math
- implement
- Matrix
- sorting
- simulation
- two pointers
- Method
- Binary Tree
- Counting
- string
- 자바
- java
- SQL
- bit manipulation
- array
- Tree
- Class
- dynamic programming
- Stack
- 코딩테스트
Archives
- Today
- Total
코린이의 소소한 공부노트
와일드카드 ?와 지네릭 메서드 본문
[와일드카드 ‘?’ 사용 이유]
- 지네릭 타입을 이용한 선언문 작성 시 타입이 같아야 한다..
ArrayList<Product> list = new ArrayList<Product>(); // OK
list = new ArrayList<Tv>(); // 지네릭 타입이 달라서 에러
list = new ArrayList<Audio>(); // 지네릭 타입이 달라서 에러
- 지네릭 타입에 와일드카드를 쓰면, 하나의 참조변수로 여러 타입의 객체를 참조할 수 있다.
ArrayList<? extends Product> list = new ArrayList<Tv>(); // OK
list = new ArrayList<Audio>(); // OK
[와일드카드 사용 방법]
1. <? extends T>
- 와일드카드의 상한 제한
- T와 그 자손들만 가능
2. <? super T>
- 와일드카드의 하한 제한
- T와 그 조상들만 가능
3. <?>
- 제한 없음
- 모든 타입 가능
- <? extends Object>와 등일
4. 와일드카드에는 <? extends T & E>와 같이‘ &’를 사용할 수 없다.
5. 메서드의 매개변수에 와일드카드를 사용할 수 있다.
static Juice makeJuice(FruitBox<? extends Fruit> box) { } // ?가 없다면 Fruit만 가능
FruitBox<Fruit> fruitBox = new FruitBox<Fruit>();
FruitBox<Apple> appleBox = new FruitBox<Apple>();
...
Juicer.makeJuice(fruitBox); // OK
Juicer.makeJuice(appleBox); // OK
[지네릭 메서드]
1. 반환 타입 앞에 지네릭 타입이 선언된 메서드(타입 변수는 메서드 내에서만 유효)
static <T> void sort(List<T> list, Comparator<? super T> c) { }
2. 클래스의 타입 매개변수 <T>와 메서드의 타입 매개변수 <T>는 별개의 타입이다.
class FruitBox<T>{ // 지네릭 클래스
static <T> void sort(List<T> list, Comparator<? super T> c) { } // 지네릭 메서드
...
} // 타입 문자가 일치하지만, 실제로는 다른 타입 변수다.
3. 지네릭 메서드를 호출할 때마다 타입 변수에 타입을 대입해야 한다.(대부분의 경우 추정이 가능하므로 생략할 수 있음.)
static <T extends Fruit> Juice makeJuice(FruitBox<T> box) { } // 지네릭 메서드
FruitBox<Fruit> fruitBox = new FruitBox<Fruit>();
FruitBox<Apple> appleBox = new FruitBox<Apple>();
Juicer.<Fruit>makeJuice(fruitBox); // OK. T=Fruit
Juicer.makeJuice(appleBox); // OK. T=Apple이고 Apple은 Fruit의 자손
4. 메서드를 호출할 때 타입을 생략하지 않을 때는 클래스 이름 생략을 할 수 없다.
<Fruit>makeJuice(fruitBox); // 에러. 클래스 이름 붙여줘야함
this.<Fruit>makeJuice(fruitBox); // OK
Juicer.<Fruit>makeJuice(fruitBox); // OK
[와일드카드와 지네릭 메서드의 차이점]
- 와일드카드는 하나의 참조변수로 서로 다른 타입이 대입된 여러 지네릭 객체를 다루기 위한 것
- 지네릭 메서드는 메서드를 호출할 때마다 다른 지네릭 타입을 대입할 수 있게 한 것
'Java' 카테고리의 다른 글
열거형(enum, enumerated type) (0) | 2022.11.17 |
---|---|
지네릭 타입의 형변환과 제거 (0) | 2022.11.14 |
지네릭 클래스의 예시와 제한 (0) | 2022.11.14 |
지네릭스와 다형성 (0) | 2022.11.09 |
지네릭스 (0) | 2022.11.09 |