개발/Java&Kotlin

[Java] Raw 타입은 사용하지 말기

devhooney 2023. 1. 23. 15:40
728x90

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/

728x90