Boxing

Autoboxing 은 자바 컴파일러에 의해 원시 타입과 원시 타입에 대응하는 래퍼 클래스 사이에서 발생하는 자동 변환이다. 예를 들어 원시타입 intInteger 로, doubleDouble 로 대응해서 변환된다. 만약 변환이 반대로 이루어지면 이것을 unboxing 이라고 한다.

이런 기능을 제공하는 이유는 개발자들이 더 깔끔한 코드를 작성할 수 있게 하기 위함이다.

Autoboxing

Character ch = 'a';

원시 타입인 'a' 가 대응하는 래퍼 클래스인 Character 로 자동 변환 되었다.

List<Integer> li = new ArrayList<>();
for (int i = 1; i < 50; i += 2)
    li.add(i);

List 타입인 li 는 Integer 타입을 원소로 받지만 원시타입이 추가가 정상적으로 이뤄진다. 런타임에는 다음과 같은 형변환이 자동으로 이루어진다.

List<Integer> li = new ArrayList<>();
for (int i = 1; i < 50; i += 2)
    li.add(Integer.valueOf(i));

Autoboxing 이 일어나는 조건은 다음과 같다.

  • 원시 타입에 대응하는 래퍼 클래스를 매개변수로 받는 함수에 원시 타입이 전달되는 경우
  • 대응하는 래퍼 클래스의 변수로 원시 타입이 할당되는 경우
public static int sumEven(List<Integer> li) {
    int sum = 0;
    for (Integer i: li)
        if (i % 2 == 0)
            sum += i;
        return sum;
}

Integer 타입에 대해서 % 혹은 += 등의 연산은 지원하지 않음에도 불구하고 위의 코드가 작성하는 이유는 런타임에 아래와 같이 적절하게 형변환이 되기 때문이다.

public static int sumEven(List<Integer> li) {
    int sum = 0;
    for (Integer i : li)
        if (i.intValue() % 2 == 0)
            sum += i.intValue();
        return sum;
}

Unboxing

반대로 원시 타입에 대응하는 래퍼 클래스가 원시타입으로 변환되는 것을 Unboxing 이라고 한다. Unboxing 이 일어나는 조건은 다음과 같다.

  • 원시 타입을 매개변수로 받는 함수에 대응하는 래퍼 클래스가 전달되는 경우
  • 대응하는 원시 타입의 변수로 래퍼 클래스가 할당되는 경우
import java.util.ArrayList;
import java.util.List;

public class Unboxing {

    public static void main(String[] args) {
        Integer i = new Integer(-8);

        // 1. Unboxing through method invocation
        int absVal = absoluteValue(i);
        System.out.println("absolute value of " + i + " = " + absVal);

        List<Double> ld = new ArrayList<>();
        ld.add(3.1416);    // Π is autoboxed through method invocation.

        // 2. Unboxing through assignment
        double pi = ld.get(0);
        System.out.println("pi = " + pi);
    }

    public static int absoluteValue(int i) {
        return (i < 0) ? -i : i;
    }
}

위 코드의 실행 결과는 다음과 같다.

absolute value of -8 = 8
pi = 3.1416

원시 타입과 래퍼 클래스

Primitive type Wrapper class
boolean Boolean
byte Byte
char Character
float Float
int Integer
long Long
short Short
double Double

results matching ""

    No results matching ""