Notice
Recent Posts
Recent Comments
Link
«   2025/06   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30
Archives
Today
Total
관리 메뉴

전공공부

아이템 61. 박싱된 기본 타입보다는 기본 타입을 사용하라 본문

Study/Java

아이템 61. 박싱된 기본 타입보다는 기본 타입을 사용하라

monitor 2023. 1. 24. 23:21
기본 타입

 

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>();