1. 개념
클래스와 인터페이스 선언에 타입 매개변수가 쓰이면, 이는 제네릭 클래스나 제네릭 인터페이스라 함.
List<E>
<E>를 말하며, 제네릭 클래스와 제네릭 인터페이스를 제네릭 타입이라고 함.
제네릭 타입은 매개변수화 타입을 정의함.
제네릭을 지원하기 전에는 컬렉션을 직접 선언함
2. 잘못된 코드
private final Collection stamps = ...;
위 코드를 사용하면 다른 타입을 넣어도 오류가 없음.
stamps.add(new Coin(...));
coin을 꺼내기 전에는 오류를 뱉지 않음.
3. 올바른 코드
private final Collectiom<Stamp> stamps = '...';
stamps에 Coin 타입을 넣을 경우
incompatible types: Coin cannot be converted to Stamp stamps.add(new Coin));
에러를 뱉는다.
Raw 타입을 쓰면 제네릭이 주는 타입 안정성과 표현력을 잃게됨.
List<Object>는 모든 타입을 허용한다는 의사를 컴파일러에 전달했기 때문에 사용해도 되지만, 안쓰는 것이 좋음.
4. 와일드카드
Object와 비슷한 와일드카드<?>가 있다.
<? extneds T> | 와일드 카드의 상한 제한. T와 그 자손들만 가능.실무에서 가장 많이 사용함 |
<? super T> | 와일드 카드의 하한 제한. T와 그 조상들만 가능 |
<?> | 제한 없으므르 모든 타입 가능. <? extneds Object>와 동일 |
- 와일드카드는 Object를 받기때문에 get메서드를 사용할 수 있지만 set, put메서드는 사용할 수 없다.
- 타입 매개변수는 get, set, put메서드는 사용가능하다.
5. 핵심정리
raw 타입을 사용하면 런타임에 예외가 일어날 수 있으니 사용하면 안된다. raw 타입은 제네릭이 도입되기 전 코드와의 호환성을 위해 제공될 뿐이다. Set<Object>는 어떤 타입의 객체도 저정할 수 있는 매개변수화 타입이고, Set<?>은 모종의 타입 객체만 저장할 수 있는 와일드카드 타입이다. 그리고 이들의 raw 타입인 Set은 제네릭 타입 시스템에 속하지 않는다. Set<Object>와 Set<?>은 안전하지만, raw 타입인 Set은 안전하지 않다.
- 참고
http://www.yes24.com/Product/Goods/65551284
https://sowon-dev.github.io/2022/07/14/220715wildcard-vs-typeparameter/
'개발 > Java&Kotlin' 카테고리의 다른 글
[Java] 클래스, 추상클래스, 인터페이스 차이 (0) | 2023.04.21 |
---|---|
[JPA] N+1 해결하기 (1) | 2023.03.07 |
[Java] 클래스와 멤버는 접근 권한 최소화하기 (1) | 2023.01.16 |
[Java] File 입출력 (0) | 2023.01.13 |
[Java] try-with-resources 사용하기 (0) | 2023.01.12 |