박싱된 기본 타입 vs 기본 타입
책/Effective Java

박싱된 기본 타입 vs 기본 타입

728x90
반응형

Java Data Type

  • 기본 타입 : int , double, boolean ..
  • 참조 타입 : String, List ...

기본 타입과 참조 타입의 차이에 대해서 설명해주세요

 

더보기

1. 각 타입에 따라 저장되는 값이 다르다. 

  A. 기본 타입 - 변수에는 실제 값이 저장된다. 
  B. 참조 타입 - 배열, 열거, 클래스, 인터페이스를 이용해서 선언된 변수는 메모리 주소 값을 가지게 된다.

2. 해당 값이 저장되는 위치 
  A. 기본 타입 - Stack 
  B. 참조 타입 - Heap 

 

 

기본 타입과 박싱된 기본 타입의 차이에 대해서 설명해주세요
더보기

기본타입 : int, double , boolean ...
박싱된 기본 타입 : Integer, Double , Boolean ...

 

차이점 

  • 기본 타입은 값만 가지고 있으나, 박싱된 타입은 값에 더해 식별성(identity)이란 속성을 가진다. 
    달리 말하면 박싱된 기본 타입의 두 인스턴스는 값이 같아도 서로 다르다고 식별될 수 있다. 

  • 기본 타입의 값은 언제나 유효하나, 박싱된 기본타입은 유효하지 않은 값(null)을 가질 수 있다. 
  • 기본 타입이 박싱된 기본 타입보다 시간과 메모리 사용면에서 더 효율적이다. 

 

# Integer 값을 오름차순으로 정렬하는 비교자 

Comparator<Integer> naturalOrder = (i, j) -> (i <j) ? -1 : (i == j ? 0 : 1);

예상된 결과 값은 0이다.

  • 출력된 결과가 1로 출력된다는 것은 : 첫번째 Integer가 두 번째보다 크다고 얘기하는 것이다. 

Q.  원인이 뭘까

  • 두 번째 검사(==)를 Integer 클래스로 진행할 경우 두 객체간의 참조 식별성 검사를 진행하게 되고 결국 값은 false가 나오게 된다. 
  • 따라서 실무에서는 해당 메서드를 사용하기 위해서는 기본 타입을 받는 정수로 바꾸어주는 처리를 해주어야한다. 

오토박싱을 통해 기본 타입 변수로 동작하면 식별성 검사가 이뤄지지 않는다.

 

# 기이하게 동작하는 프로그램 

public class Unbelievable {
	static Integer i;
	
	public static void main(String[] args) {
	  if(i == 42)
		System.out.println(“믿을 수 없군”);
	}
}
  • 물론 해당 조건에 대해서 sout는 출력되지 않는다. 
  • 하지만 if 내 조건을 확인하면서 NullPointerException이 발생하게 된다
    • int가 아닌 Integer이기 때문에 초기 값이 null이기 때문이다.
    • 따라서 null == int 를 비교하는 것이다 
  • 거의 예외 없이 기본 타입과 박싱된 기본 타입을 혼용한 연산에서는 박싱된 기본 타입의 박싱은 자동으로 풀린다. 
    • 이 때 null 참조를 언박싱하면 NullPointerException이 발생하게 되는것이다. 

# 끔찍이 느린 코드 

public static void main(String[] args) {
	Long sum = 0L;
	for (long i = 0; i <= Integer.MAX_VALUE; i ++) {
		sum += i;
	}
}
  • 느려지는 이유 : sum += 하는 과정에서 박싱과 언박싱이 반복된다. → 성능 저하 

# 박싱된 타입을 써야할 때 

  • 컬렉션의 원소, 키, 값으로 쓸 때 
    • 컬렉션은 기본 타입을 담을 수 없으므로 박싱된 기본 타입을 써야만한다. 
  • 매개변수화 타입이나 매개변수화 메서드의 타입 매개변수로는 박싱된 기본 타입을 써야한다. 
    • Java는 타입 매개변수로 기본 타입을 지원하지 않음  ex) ThreadLocal<int> 
  • 리플렉션을 통해 메서들르 호출할 때도 박싱된 기본 타입을 사용해야 한다. 

 

정리

기본 타입과 박싱된 기본 타입 중 하나를 선택해야 한다면 가능하면 기본 타입을 사용하라.
기본 타입은 간단하고 빠르다.
박싱된 기본 타입을 써야 한다면 주의를 기울이자.

- 오토박싱이 박싱된 기본 타입을 사용할 때의 번거로움을 줄여주지만, 그 위험까지 없애주지 않는다. 
- 기본 타입을 박싱하는 작업은 필요 없는 객체를 생성하는 부작용을 나을 수 있다. 


728x90
반응형