자바의 데이터 타입
- 기본 타입 : int, double, boolean
- 참조 타입 : String, List, 각각의 기본 대응되는 박싱 타입
오토박싱과 오토언박싱 덕분에 기본 타입과 박싱 타입을 크게 구분하지 않고 사용할 수 있지만. 이 둘 사이의 분명한 차이는 존재한다.
기본 타입 vs 박싱 타입
- 기본 타입은 값만 가지고 있지만, 박싱 타입은 값에 더해 식별성이란 속성을 갖는다.
- 값이 같아도 서로 다르다고 식별될 수 있다.
- 기본 타입의 값은 언제나 유효하나, 박싱된 기본 타입은 유효하지 않은 값(null)을 가질 수 있다.
- 기본 타입이 박싱된 기본 타입보다 시간과 메모리 사용면에서 더 효율적이다.
박싱된 기본 타입에 == 연산자를 사용할 땐 주의하라.
다음 코드를 이용하여 백만 개짜리 리스트를 넣거나 중복이 있는 데이터를 넣어도 잘 동작한다.
Comparator<Integer> naturalOrder =
(i, j) -> (i < j) ? -1 : (i == j ? 0 : 1);
하지만 naturalOrder.compare(new Integer(42), new Integer(42))를 실행하면 이 코드의 결함을 알 수 있다.
실무에서 이와 같이 기본 타입을 다루는 비교자가 필요하다면 Comparator.naturalOrder()를 사용하자.
박싱된 타입의 성능 저하
다음은 sum의 타입을 박싱 타입인 Long으로 선언함으로써 박싱과 언박싱이 반복해서 일어나 성능이 저하된다.
public static void main(String[]args){
Long sum = 0L;
for (long i = 0; i <= Integer.MAX_VALUE; i++) {
sum += i;
}
System.out.println(sum);
}
박싱 타입을 써야 하는 경우
- 컬렉션의 원소, 키, 값으로 쓴다.
- 컬렉션은 기본 타입을 담을 수 없다.
- 매개변수화 타입이나 매개변수화 메서드의 타입 매개변수로는 박싱된 타입을 써야 한다.
- 리플렉션을 통해 메서드를 호출할 때 쓴다.