[배경]
기본 타입과 박싱된 기본 타입의 주된 차이는 크게 세 가지다.
- 첫 번째, 기본 타입은 값만 가지고 있으나, 박싱된 기본 타입은 값에 더해 식별성(identity)이란 속성을 갖는다.
- 두 번째, 기본 타입의 값은 언제나 유효하나, 박싱된 기본 타입은 유효하지 않은 값, 즉 null을 가질 수 있다.
- 세 번째, 기본 타입이 박싱된 기본 타입보다 시간과 메모리 사용면에서 더 효율적이다.
[Why]
(같은 객체를 비교하는 게 아니라면) 박싱된 기본 타입에 == 연산자를 사용하면 오류가 일어난다.
- naturalOrder.compare(new Integer(42), new Integer(42))
- 첫 번째 검사인 (i < j)는 잘 작동하지만, 두 번째 검사인 (i == j)에서는 두 '객체 참조'의 식별성 검사를 하기 때문에 결과가 false가 되고, 결과로 1을 반환한다.
반복문에서 오토박싱, 오토언박싱이 일어나도록하면 성능이 매우 느려진다.
[When]
박싱된 기본 타입은 언제 써야 하는가?
- 첫 번째, 컬렉션의 원소, 키, 값으로 쓴다.
좀 더 일반화하자면, 매개변수화 타입이나 매개변수화 메서드의 타입 매개변수로는 박싱된 기본 타입을 써야 한다. - 리플렉션(아이템65)을 통해 메서드를 호출할 때도 박싱된 기본 타입을 사용해야 한다.
[How]
실무에서 기본 타입을 다루는 비교자가 필요하다면 Comparator.naturalOrder()를 사용하자.
'독서찰기(讀書札記) > 이펙티브 자바' 카테고리의 다른 글
[아이템 63] 문자열 연결은 느리니 주의하라 (0) | 2022.03.27 |
---|---|
[아이템 62] 다른 타입이 적절하다면 문자열 사용을 피하라 (0) | 2022.03.27 |
[아이템 60] 정확한 답이 필요하다면 float와 double은 피하라 (0) | 2022.03.25 |
[아이템 59] 라이브러리를 익히고 사용하라 (0) | 2022.03.25 |
[아이템 58] 전통적인 for 문보다는 for-each 문을 사용하라 (0) | 2022.03.24 |