전공공부
아이템 61. 박싱된 기본 타입보다는 기본 타입을 사용하라 본문
기본 타입
int, double, boolean, ...
박싱된 기본 타입
Integer, Double, Boolean, ...
그리고, 기본 타입과 달리 박싱된 기본 타입은 식별성을 가지기 때문에 두 변수가 값이 같아도 서로 다르다고 식별되어진다.
또한, 기본 타입과 달리 박싱된 기본 타입은 null 값을 가질 수 있다.
그래서, 위 점들을 유의하지 않고 사용하게되면 정말로 문제가 발생할 수 있다.
코드 1
Comparator<Integer> naturalOrder = (i, j) -> (i < j) ? -1 : (i == j ? 0 : 1);
위 코드를 기준으로 naturalOrder.compare(new Integer(42),new Integer(42)); 를 실행하면 두 값이 같으므로 0을 출력하는 것이 맞지만 1을 출력하게 된다.
이유는 박싱된 기본 타입은 식별자를 가지니 i == j를 비교하면 실제로 서로 다른 구문이니 false를 출력하여 1을 출력하게된다.
코드 1 - 1
Comparator<Integer> naturalOrder = (iBoxer, jBoxer) -> {
int i = iBoxer, j = jBoxer;
(i, j) -> (i < j) ? -1 : (i == j ? 0 : 1);
}
이런식으로 수정하여 식별성 검사를 피할 수 있다.
코드 2
public class Test{
static Integer i;
public static void main(String[] args){
if(i == 42){
System.out.println("믿을 수 없는 결과 도출");
}
}
}
위 코드는 NullPointerException을 발생시킨다.
기본 타입과 박싱된 기본 타입을 같이 비교하면 박싱된 기본 타입이 풀려서 기본 타입으로 적용이 되기 때문에 null 참조가 불가능해지는 기본 타입으로 변하게되어 오류가 난다.
간단하게 위 코드는 Integer를 int로 해결 가능하다.
코드 3 (비교)
기본 타입으로 사용할때의 속도
public static void main(String[] args) {
long sum = 0L;
long startT = System.currentTimeMillis();
System.out.println();
for(long i = 0; i <= Integer.MAX_VALUE; i++) {
sum += i;
}
long endT = System.currentTimeMillis();
System.out.println(sum + " 시간 차이 : " + (endT - startT));
}
2305843008139952128 시간 차이 : 605
박싱된 기본 타입으로 사용할때의 속도
public static void main(String[] args) {
Long sum = 0L;
long startT = System.currentTimeMillis();
System.out.println();
for(long i = 0; i <= Integer.MAX_VALUE; i++) {
sum += i;
}
long endT = System.currentTimeMillis();
System.out.println(sum + " 시간 차이 : " + (endT - startT));
}
2305843008139952128 시간 차이 : 8296
박싱과 언박싱이 반복되어서 일어나기 때문에 시간이 매우 오래걸린다.
위와 같은 단점들로 인하여 박싱된 기본 타입은 특정한 부분에서만 쓰이는 것이 좋다.
박싱된 기본타입이 쓰이는 부분
컬랙션의 키, 값 부분의 정의 및 적용 : 컬랙션에서는 기본 타입을 사용 할 수 없으므로 박싱된 기본 타입을 사용한다.
- Map<String,Long> map = new HashMap<String,Long>();
'Study > Java' 카테고리의 다른 글
아이템 19. 상속을 고려해 설계하고 문서화하라. 그러지 않았다면 상속을 금지하라 (0) | 2023.03.05 |
---|---|
아이템 13. clone 재정의는 주의해서 진행해라 (2) | 2023.02.20 |
아이템 7. 다 쓴 객체 참조를 해제하라 (0) | 2023.02.13 |
아이템 2. 생성자에 매개변수가 많다면 빌더를 고려하라 (0) | 2023.01.31 |
아이템 60. 정확한 답이 필요하다면 float와 double형의 사용을 피하라 (0) | 2023.01.15 |