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를 상속받았다.
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)
'프로그래밍 언어 > Java' 카테고리의 다른 글
프로젝트 시작할 때 자바 버전 고르기 Java 8 vs Java 11 (0) | 2022.01.12 |
---|---|
[Effective Java] Item 1. 생성자 대신 정적 팩터리 메서드를 고려하라 (0) | 2021.07.24 |
[JAVA 기초] Method Overriding이란 무엇인가 (0) | 2021.01.15 |
[JAVA 참고] JCP, JSR, TCK란 무엇인가 (0) | 2021.01.09 |
[JAVA 기초] JDK, JRE, JVM이란 무엇인가 (0) | 2021.01.09 |