-
[이펙티브 자바] item 61 - 박싱된 기본 타입보다는 기본 타입을 사용하라개발서적읽기/Effective Java - temp 2020. 5. 15. 00:02
■자바의 데이터 타입 2가지
- 기본 타입 : int, double, boolean 등
- 참조 타입 : String, List 등
기본 타입은 1:1대응으로 '참조 타입'을 하나씩 가지고 있다.
이를 '박싱된 기본 타입' 이라고 부른다. (Integer,Double,Boolean 등)
오토 박싱과 오토 언박싱 덕분에 기본 타입과 박싱된 기본 타입을
편하게 구분 없이 사용할 수 있다. 그래도 분명한 차이는 있다.
■첫 번째 차이
기본 타입은 값만 가지고 있지만, 박싱된 기본 타입은 값에 더해
식별성 이라는 속성도 갖는다. (각 객체는 언제나 자신만의 주소값을 가진 고유의 존재)
두개의 박싱된 기본 타입은 값(value)이 같아도 결국 서로 다르다는 것을 의미한다.
'첫 번째 차이'를 주의하지 않으면?
다음은 Integer 값을 오름차순으로 정렬하는 비교자다.
아래 코드는 Exception을 일으키지 않는다.
더욱 치명적이게, 잘못 계산된 결과를 자연스럽게 정상적으로 처리해버린다.
Comparator<Integer> naturalOrder = (i,j) -> (i < j) ? -1 : (i == j ? 0 : 1);
naturalOrder.compare(new Integer(42), new Integer(42));두 Integer의 '값'이 같아서 0이 출력돼야 하지만 실제로는 1이 출력된다.
참조 타입(박싱된 기본 타입)간에 '==' 연산은 각 객체의 주소를 비교하기 때문에
의도한 값이 출력되지 않는다... 이렇게 하면 제대로 계산할 수 있다.
//비교 대상인 수의 개수가 적을 경우
Integer integer1 = 5;
Integer integer2 = 5;
//int로 오토 언박싱 후 비교
integer1.compareTo(integer2);
=================================
//비교 대상인 수의 개수가 많을 경우
List<Integer> values = Arrays.asList(1, 2, 3);
//naturalOrder 메서드가 Comparable<Object>을 구현한 객체의//compareTo를 사용하도록 강제한다.
//참고로 ArrayList는 binarySort 방식을 사용한다values.sort(Comparator.naturalOrder());
이 특징을 간과한다면 오류가 난지도 모르는 대참사가 일어날 수 있다!
■두 번째 차이기본 타입의 값은 언제나 유효한 값이 들어간다. 하지만 박싱된 기본 타입은참조 타입이기 때문에 유효하지 않은 값, 즉 null이 들어갈 수 있다.'두 번째 차이'를 주의하지 않으면?public class Unbelievable {
static Integer i;
public static void main(String[] args) {
if (i == 42)
System.out.println("믿을 수 없군!");
}
}아무것도 출력이 되지 않는 것을 의도한 코드겠지만,아쉽게도(?) 그 전에 에러가 발생한다.i == 42 를 할 때, null 참조를 언박싱하게 되면서 NPE가 터진다.i의 타입을 Integer에서 int로 바꿔야 한다!■세 번째 차이기본 타입이 박싱된 기본 타입보다 시간과 메모리 사용면에서 더 효율적이다.'세 번째 차이'를 주의하지 않으면?public static void main(String[] args) {
Long sum = 0L;
for (long i = 0; i <= Integer.MAX_VALUE; i++) {
sum += i;
}
System.out.println(sum);
}위 코드는 박싱과 언박싱이 반복해서 일어나기 때문에체감될 정도로 성능이 느리다. ( sum = sum + i )■결론기본 타입이 간단하고 빠르고 신경을 덜 써도 되니, 웬만하면 기본 타입을 사용하자.참고로 아래에 경우엔 박싱된 기본 타입을 사용한다.- 매개변수화 타입(List 등)
- 매개변수화 메서드의 타입 매개변수(T, E 등)
- 리플렉션
'개발서적읽기 > Effective Java - temp' 카테고리의 다른 글
[이펙티브 자바] item 26 - 로 타입은 사용하지 말라 (0) 2020.07.19 [이펙티브 자바] item 14 - Comparable을 구현할지 고려하라 (0) 2020.07.09 [이펙티브 자바] item 71 - 필요 없는 검사 예외 사용은 피하라 (0) 2020.05.21 [이펙티브 자바] item 70 - 복구할 수 있는 상황에는 검사 예외를, 프로그래밍 오류에는 런타임 예외를 사용하라 (0) 2020.05.20 [이펙티브 자바] item 60 - 정확한 답이 필요하다면 float와 double은 피하라 (0) 2020.05.13 댓글