■ 기본 타입과 박싱된 기본 타입의 차이점
- 기본 타입은 값만 가지고 있으나, 박싱된 기본 타입은 값에 더해 식별성이라는 속성을 갖는다. 즉, 기본 타입의 두 인스턴스는 값이 같아도 서로 다르다고 식별될 수 있다.
- 기본 타입의 값은 언제나 유효하나, 박싱된 기본 타입은 유효하지 않은 값, 즉 null을 가질 수 있다.
- 기본 타입이 박싱된 기본 타입보다 시간과 메모리 사용면에서 더 효율적이다.
이런 차이점 때문에 주의해서 사용하지 않으면 문제가 발생할 수 있다.
■ 비교자 문제 발생 예시
Comparator<Integer> naturalOrder = (i, j) -> (i < j) ? -1 : ( i == j ? 0 : 1);
위의 코드를 naturalOrder.compare(new Integer(42), new Integer(42))로 실행하면 결과는 0이 나와야할꺼 같지만 1이 나온다. 박싱된 기본 타입에 == 연산자를 사용하면 오류가 일어난다.
실무에서 이와 같이 기본 타입을 다루는 비교자가 필요하다면 Comparator.naturalOrder()를 사용하자.
■ 반복문에서 박싱과 언박싱으로인한 성능 저하
sum += i 를 수행하면서 기본 타입인 i와 박싱된 기본 타입인 sum이 더해지면서 박싱과 언박싱이 일어나면서 체감할 정도로 성능이 저하된다.
public static void main(String[] args) {
Long sum = 0L;
for(long i=0;i <= Integer.MAX_VALUE;i++){
sum += i;
}
System.out.println(sum);
}
■ 박싱 기본 타입 사용 사례
- 컬렉션은 기본 타입을 담을 수 없으므로 어쩔 수 없이 박싱된 기본 타입을 써야만 한다.
- 매개변수화 메서드 타입(제네릭)의 타입 매개변수로는 박싱된 기본 타이블 써야 한다.
- 리플렉션을 통해 메서드를 호출할 때도 박싱된 기본 타입을 사용해야한다.
'Effective Java' 카테고리의 다른 글
[Effective Java] 아이템63 문자열 연결은 느리니 주의하라 (0) | 2021.08.01 |
---|---|
[Effective Java] 아이템62 다른 타입이 적절하다면 문자열 사용을 피하라 (0) | 2021.07.23 |
[Effective Java] 아이템60 정확한 답이 필요하다면 float와 double은 피하라 (0) | 2021.07.23 |
[Effective Java] 아이템59 라이브러리를 익히고 사용하라 (0) | 2021.07.23 |
[Effective Java] 아이템58 전통적인 for문보다는 for-each 문을 사용하라 (0) | 2021.07.23 |