프로그래밍 언어/Java

[JAVA 기초] Wrapper Class란 무엇인가

개발자 월든 2021. 1. 11. 22:15

Autoboxing과 Unboxing

 

1. Wrapper Class란

Wrapper Class는 대응하는 primitive type을 필드로 가지고 있는 Class이다. 개발자는 Wrapper Class로 Primitive Type의 데이터를 Object로 만들 수 있으며 Object의 기능을 사용할 수 있다.  java.lang 패키지에 포함되어있어 개발자가 import할 필요가 없다. 종류는 아래와 같다.

 

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

 

이중 Byte, Short, Integer, Long, Double, Float은 Number Class를 상속받았다.

Wrapper Class 계층도

 

2. Wrapper Class를 사용하는 이유

  • Primitive Type의 데이터를 Object처럼 사용할 필요성을 느낄 때 필요하다.
  • 자바에서 제공하는 ArrayList와 같은 표준 자료구조(Collection)는 Reference Type만 가능하다.
  • Object를 상속하여 Object의 메서드를 상속하여 사용할 수 있다.
  • Object만 지원하는 Generic을 활용할 수 있다.

2.1. 그 중 Number Class를 상속받는 경우

  • 각 Class에서 지원하는 MIN_VALUE, MAX_VALUE와 같은 상수를 사용할 수 있다.
  • 문자열을 숫자로, 숫자를 문자열로 쉽게 변환할 수 있다.
  • 2, 8, 10, 16 진수 변환을 쉽게 처리할 수 있다.

3. Autoboxing과 Unboxing이란

JDK 1.5버전에 도입된 기능이며 Wrapper Class를 그에 상응하는 Primitive Type으로 변환해준다. 우선 Boxing의 의미를 살펴보자

 

int variable = 1;
Integer variable2 = new Integer(variable);
Integer variable3 = Integer.valueOf(variable); 

 

첫번째 줄은 int형의 변수를 1로 선언하였다.

두번째 줄과 일반적인 객체 생성방법이다

세번째 줄은 valueOf()를 사용하였다. 이는 JDK9 이후로 권장되는 방법이다.

Boxing은 위 처럼 Primitive Type인 1이라는 int값을 Integer Wrapper Class로 감싼 것이다.

 

Autoboxing은 이름에 걸맞게 boxing을 컴파일러 단계에서 자동으로 행해준다.

 

Integer variable = 1; // Interger variable = Integer.valueOf(1);

 

컴파일러는 자동으로 Boxing하여 Integer Wrapper Class의 Instance를 생성한다. 이는 개발자가 일일히 Instance를 생성하지 않아도 되는 편리함을 제공한다.

아래와 같이 Collection에서도 편리함을 찾아볼 수 있다.

 

ArrayList<Integer> list = new ArrayList<>();

for(int i = 0; i < 10; i++){
    list.add(i); // list.add(Integer.valueOf(i));
}

 

1부터 9까지의 int값을 ArrayList에 추가하는 반복문을 실행하는 코드입니다. ArrayList의 add메서드는 Reference Type의 데이터만 인자로 사용할 수 있습니다. 하지만 Auto Boxing기능이 list.add(i)를 list.add(Integer.valueOf(i))로 변환해줍니다. 

 

Autoboxing은 매개변수 타입이 Object인 메서드의 매개변수로 전달될 때와 Wrapper Class의 변수에 할당될 때 적용됩니다.

 

Unboxing은 이와 반대로 Wrapper Class Instance를 Primitive Type으로 전환해준다.

 

int sum = 0;

for(Integer i : list){
    sum += i; // sum += i.intValue();로 Unboxing됨
}

 

Autoboxing예제에 있던 ArrayList에 저장된 값을 for each문으로 전부 가져오며 저장된 값을 sum 변수에 더해준다. Integer는 Object이기 때문에 연산자를 통해 연산할 때 필드값이 아니라 주소값으로 계산하기 때문에 0부터 9까지 더하는 일은 없을 것이다. 하지만 AutoBoxing이 Integer i를 i.intValue()를 호출해 int의 형태로 변환하기 때문에 연산은 해당 Instance에 저장된 int값으로 될 것이다.

 

Unboxing은 매개변수 데이터 타입이 Primitive Type인 메서드의 매개변수로 전달될 때와 Primitive Type 변수에 할당될 때 적용된다.

 

4. Autoboxing과 Unboxing의 장점

소스코드가 깔끔해진다는 것과 개발자가 명시적으로 형변환을 하지 않아도 되기 때문에 생산성 향상에 도움이 된다.

 

 

 

 

 

참고 :

docs.oracle.com/javase/tutorial/java/data/autoboxing.html

docs.oracle.com/en/java/javase/11/docs/api/java.base/java/lang/Integer.html#valueOf(int)