Recent Posts
| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 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
- layout
- webflux
- java
- 클린코드
- logback
- 이펙티브 자바
- Effective Java 3/E
- mongodb
- clean code
- 이펙티브자바
- 리액티브 스프링
- EffectiveJava3/E
- 모던 자바 인 액션
- 로그백
- Design Pattern
- gof designpattern
- Logback Configuration
- 레디스
- headfirst designpattern
- 코틀린
- servlet
- 람다
- 인터페이스
- spring
- redis
- 자바
- Kotlin
- 코틀린인액션
- 디폴트 메서드
- Spring Data
반응형
Link
- Today
- Total
04-28 07:26
Archives
초보개발자 긍.응.성
(이펙티브 자바 3) 28. 배열보다는 리스트를 사용하라 본문
반응형
배열과 제네릭 타입의 차이
- 배열
- 공변(covariant)이다 (Sub가 Super의 하위 타입이라면 배열 Sub[]는 배열 Super[]의 하위 타입이 된다)
- 런타임에도 자신이 담기로 한 원소 타입을 인지하고 확인한다.
- 제네릭
- 불공변(invariant)이다
- 타입 정보가 런타임에는 소거(erasure)된다. 원소타입을 컴파일 타임에만 검사하며 런타임에는 알 수 없다.
이러한 차이로 배열과 제네릭은 잘 어우러지지 못한다. 제네릭 배열은 만들 수 없는데 타입 안전하지 않기 때문이다.
실체화 불가 타입 (non-reifiable type)
실체화되지 않아서 런타임에는 컴파일타임보다 타입 정보를 적게 가지는 타입이다. E, List<E>, List<String> 같은 타입이 실체화 불가 타입에 해당된다.
제네릭 타입과 가변 인수 메서드(varargs method)를 함께 쓰면 해석하기 어려운 경고 메시지를 받게 된다. 가변인수 메서드를 호출할 때 마다 가변인수 매개변수를 담을 배열이 하나 만들어지는데, 이때 그 배열의 원소가 실체화 불가 타입이라면 경고가 발생하는 것이다. 이 문제는 @SafeVarargs 애너테이션으로 대처할 수 있다
배열보다는 리스트
배열로 형 변환할 때 제네릭 배열 생성 오류나 비검사 형변환 경고가 뜨는 경우 대부분은 E[] 대신 List<E>를 사용하면 해결된다. 코드가 조금 복잡해지고 성능이 살짝 나빠질 수도 있지만, 그 대신 타입 안정성과 상호 운용성은 좋아진다.
정리
배열과 제네릭에는 매우 다른 타입 규칙이 적용된다. 둘을 섞어 쓰다가 컴파일 오류나 경고를 만나면, 가장 먼저 배열을 리스트로 대체하는 방법을 적용해보자.
반응형
'책 정리 > 이펙티브 자바 3' 카테고리의 다른 글
| (이펙티브 자바 3) 8장 메서드 정리 (0) | 2020.12.01 |
|---|---|
| (이펙티브 자바 3) 7장 람다와 스트림 정리 (0) | 2020.11.30 |
| (이펙티브 자바 3) 6장 열거 타입과 애너테이션 정리 (0) | 2020.11.27 |
| (이펙티브 자바 3) 5장 제네릭 정리 (0) | 2020.11.25 |
| (이펙티브 자바 3) 27. 비검사 경고를 제거하라 (0) | 2020.11.10 |
| (이펙티브 자바 3) 26. 로 타입은 사용하지 말라 (0) | 2020.11.07 |
| (이펙티브 자바 3) 25. 톱레벨 클래스는 한 파일에 하나만 담으라 (0) | 2020.11.01 |
| (이펙티브 자바 3) 24. - 멤버 클래스는 되도록 static으로 만들라 (0) | 2020.10.28 |
Comments