반응형
이 포스팅에서 작성하는 내용은 EFFECTIVE JAVA(이펙티브자바) 에서 발췌하였습니다.
아이템 61. 박싱된 기본 타입보다는 기본 타입을 사용하라
자바의 데이터타입
- 기본 타입
- int, dobule, boolean 등
- 참조 타입
- String, List 등
- 박싱된 기본 타입 (기본 타입에 대응하는 참조타입)
- Integer(int 박싱), Double(double 박싱), Boolean(boolean 박싱) 등
기본 타입 vs 박싱된 기본 타입
- 기본 타입은 값만 가지는데 비해, 박싱된 기본 타입은 값에 더해 식별성 이란 속성을 갖는다. 즉, 박싱된 기본 타입의 두 인스턴스가 값은 같으나 다르다고 식별될 수 있다.
- 기본 타입의 값은 언제나 유효하나, 박싱된 기본 타입은 유효하지 않은 값(null)을 가질 수 있다.
- 기본 타입이 박싱된 기본 타입보다 시간과 메모리 사용 면에서 더욱 효율적이다.
ex 1) Integer 값을 오름차순 정렬하는 비교자 예제 (문제점 존재)
Comparator<Integer> naturalOrder =
(i, j) -> (i < j) ? -1 : (i == j ? 0 : 1);
- 정상 작동하지만, 심각한 결함이 존재한다.
- naturalOrder.compare(new Integer(42), new Integer(42))로 값을 확인하면 0이 아닌, 1을 출력한다..
- 박싱된 기본 타입에 == 연산자를 사용하면 오류가 발생한다. (값은 같지만, 박싱 타입이기에 식별성이라는 속성으로 확인)
- 실무에서 이와 같이 기본 타입을 다루는 비교자가 필요하다면 Comparator.naturalOrder()를 사용하자.
- 비교자를 직접 만들면 비교자 생성 메서드나 기본 타입을 받는 정적 compare 메서드를 사용해야 한다.
- 지역변수 2개를 둬서 각각 오토 박싱을 진행한 뒤에, 이 지역변수를 기준으로 비교를 진행하면 된다.
ex 2) Integer와 int 비교하는 예제 (NPE 발생)
public class Unbelievable {
static Integer i;
public static void main(String[] args) {
if (i == 42)
System.out.println("믿을 수 없군!");
}
}
- 이 예제는 ‘믿을 수 없군!’을 출력하지 않고, NPE를 발생시킨다.
- i == 42를 확인할 떄, NPE를 발생시킨다.
- Integer i 를 int인 42와 비교하기 위해, Integer i를 int로 오토 언박싱을 진행하는데 이 때, Integer i의 값이 null이기에 NPE가 발생함.
- 애초에, Integer i를 int로 선언하면 된다.
ex 3) 의도치 않은 박싱, 언박싱이 발생하여 성능저하가 발생하는 코드
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을 실수로 Long(박싱된 기본 타입)으로 선언하여 오토 언박싱, 박싱이 발생한다.
- 그 결과, 상당히 느려진다.
박싱된 기본 타입 사용 방법
- 컬렉션의 원소, 키, 값으로 사용한다.
- 컬렉션은 기본 타입을 담을 수 없으므로 박싱된 기본 타입을 사용해야 한다.
- 리플렉션을 통해 메서드를 호출할 때 박싱된 기본 타입을 사용해야 한다.
정리
- 기본 타입과 박싱된 기본 타입을 선택할 때, 가능하면 기본 타입을 사용하자.
- 기본 타입은 간단하고 빠르다.
- 오토 박싱은 박싱된 기본타입을 기본타입으로 변경해주지만, 관련 위험까지는 없애주지 않는다.
- 두 박싱된 기본 타입에는 == 연산자로 비교하면 안된다.
- 언박싱 과정에서 NPE가 발생할 수도 있다.
- 참고) https://ajdahrdl.tistory.com/189
반응형
'BE > Java' 카테고리의 다른 글
[Effective Java] 아이템 63. 문자열 연결은 느리니 주의하라 (0) | 2022.11.30 |
---|---|
[Effective Java] 아이템 62. 다른 타입이 적절하다면 문자열 사용을 피하라 (0) | 2022.11.29 |
[Effective Java] 아이템 60. 정확한 답이 필요하다면 float와 double은 피하라 (0) | 2022.11.25 |
[Effective Java] 아이템 59. 라이브러리를 익히고 사용하라 (0) | 2022.11.24 |
[Effective Java] 아이템 58. 전통적인 for 문보다는 for-each 문을 사용하라 (0) | 2022.11.23 |