본문 바로가기

독서찰기(讀書札記)/이펙티브 자바

[아이템 61] 박싱된 기본 타입보다는 기본 타입을 사용하라

[배경]

기본 타입과 박싱된 기본 타입의 주된 차이는 크게 세 가지다.

  • 첫 번째, 기본 타입은 값만 가지고 있으나, 박싱된 기본 타입은 값에 더해 식별성(identity)이란 속성을 갖는다.
  • 두 번째, 기본 타입의 값은 언제나 유효하나, 박싱된 기본 타입은 유효하지 않은 값, 즉 null을 가질 수 있다.
  • 세 번째, 기본 타입이 박싱된 기본 타입보다 시간과 메모리 사용면에서 더 효율적이다.

 

[Why]

(같은 객체를 비교하는 게 아니라면) 박싱된 기본 타입에 == 연산자를 사용하면 오류가 일어난다. 

  • naturalOrder.compare(new Integer(42), new Integer(42))
    • 첫 번째 검사인 (i < j)는 잘 작동하지만, 두 번째 검사인 (i == j)에서는 두 '객체 참조'의 식별성 검사를 하기 때문에 결과가 false가 되고, 결과로 1을 반환한다.

반복문에서 오토박싱, 오토언박싱이 일어나도록하면 성능이 매우 느려진다.

 

[When]

박싱된 기본 타입은 언제 써야 하는가?

  • 첫 번째, 컬렉션의 원소, 키, 값으로 쓴다.
    좀 더 일반화하자면, 매개변수화 타입이나 매개변수화 메서드의 타입 매개변수로는 박싱된 기본 타입을 써야 한다.
  • 리플렉션(아이템65)을 통해 메서드를 호출할 때도 박싱된 기본 타입을 사용해야 한다.

 

[How]

실무에서 기본 타입을 다루는 비교자가 필요하다면 Comparator.naturalOrder()를 사용하자.