[java] 자동 형변환(AutoBoxing, UnBoxing)

자바는 기본형 타입에 대해 Wrapper class를 만들어 두었다.

Primitive Type - Wrapper class

  • boolean - Boolean / byte - Byte / char - Character / float - Float / double - Double / long - Long / shor - Short / int - Integer

int는 primitive type 이고, Integr 는 Object 인테, 아래 코드는 어떻게 컴파일 오류가 발생하지 않을까?

		List<Integer> li = new ArrayList<>();
		for(int i=0; i < 50; i += 2) {
			li.add(i);
		}
		
		int sum = 0;
		
		for(Integer i : li)
			if( i % 2 ==0)
				sum  += i;

런타임시 아래와 같이 컴파일러가 코드를 자동으로 형변환 시켜주기 때문이다. 실제 디컴파일러를 이용하여 확인해보면, 위 소스가 아래 소스로 변환된것을 볼 수 있다.

		List<Integer> li = new ArrayList<>();
		for(int i=0; i < 50; i += 2) {
			li.add(Integer.valueOf(i));
		}
		
		int sum = 0;
		
		for(Integer i : li)
			if( i.intValue() % 2 ==0)
				sum  += i.intValue();
  • 보통의 코드에서는 자동형변환에 대해 신경쓰지 않아도 되지만, 성능에 민감한 계산로직시에는 박싱/언박싱에 대한 비용이 발생하므로 주의할 필요가 있다.
 public static List<Integer> asList(final int[] a){
		return new AbstractList<Integer>() {

			@Override
			public Integer get(int index) {
				return a[index]; //boxing
			}

			@Override
			public Integer set(int index, Integer element) {
				Integer oldVal = a[index]; //boxing
				a[index] = element; //unboxing
				return oldVal;
			}

			@Override
			public int size() {
				return 0;
			}
		};
	}
  • 예를 들어 위 코드의 성능은 좋지 않은편이다. 일반적인 상황에서는 문제없겠지만, 성능이 중요한 반복문등에서 저 방식을 쓰는것은 피해야 한다.
  • 그럼 autoboxing, unboxing 은 언제 사용할까? Map 이나 Set 과 같은 collection 에서는 primitive type 을 사용할 수 없으니, 그 때 사용하면 좋다.
  • 그리고 꼭 필요한게 아니라면 Primitive Type 을 사용하도록 하자.

Categories:

Updated:

Leave a comment