자바 코드를 보면 종종 변수가 같은 정수형인데도
어느 곳에서는 int를 사용하고 다른 곳에선 Integer를 사용하는 것을 볼 수 있습니다.
왜 같은 형인데도 표기 방법이 다를까요?
이것은 변수의 원시 타입(Primitive Type)과 래퍼 클래스(Wrapper Class)의 관계로 알 수 있습니다.
# 원시 타입 (Primitive Type)
• 기본형이라고도 부르며, 실제 연산에 사용되는 변수로 모두 8 종류가 있습니다. (byte, short, int...)
• 기본형은 반드시 사용하기 전에 선언되어야 합니다.
• OS에 따라 자료형의 길이가 변하지 않습니다.
• 비객체 타입으로, null 값을 가질 수 없습니다.
여기서 중요한 것은 Primitive Type은 비객체 타입이라는 건데요.
프로그램에 따라서 이런 Primitive Type을 객체로 취급해야 하는 경우가 종종 생깁니다.
그럴 때 Primitive Type을 객체 타입으로 변환해주는 것이 바로 래퍼 클래스(Wrapper Class)입니다.
# 래퍼 클래스 (Wrapper Class)
• 인수로 데이터 타입을 전달 받아, 해당 값을 가지는 객체로 만들어주는 클래스입니다.
• 추가적으로 void도 래퍼 클래스를 통해 변환된 Void도 존재합니다.
• 내부에 멤버 변수가 final로 선언 되어 있습니다.
• 기본 타입을 객체로 변환하는 과정을 박싱(Boxing)이라하며 반대 과정을 언박싱(UnBoxing)이라 합니다.
• 자동화된 박싱과 언박싱을 오토 박싱(AutoBoxing)과 오토언박싱(AutoUnBoxing)이라 합니다.
• 주의할 점은 객체 이므로 비교 연산시에는 동등 연산자(==)가 아닌 equals() 메소드를 이용해야 합니다.
(동등 연산자를 이용할 시에는 두 인스턴스의 주소값을 비교하므로 false가 나옵니다)
----------- Boxing ----------> | |
Primitive Type | Wrapper Class |
byte | Byte |
short | Short |
int | Integer |
long | Long |
float | Float |
double | Double |
char | Character |
boolean | Boolean |
<---------- UnBoxing ---------- |
# 오토 박싱(Auto Boxing)과 오토 언박싱(Auto Unboxing)
JDK 1.5부터는 자바 컴파일러가 박싱과 언박싱을 자동으로 처리해주는데 이걸 오토 박싱, 오토 언박싱이라 합니다.
오토 박싱을 이용하면 new 키워드를 사용하지 않고도 자동으로 인스턴스를 생성할 수 있고,
반대로 오토 언박싱을 통해 메소드 호출 없이 인스턴스에 저장된 값을 바로 참조할 수 있습니다.
예시)
// Boxing & UnBoxing
Character ch = new Character('A'); // Boxing
char c = ch.charValue(); // UnBoxing
// AutoBoxing & AutoUnBoxing
Integer num = 8; // AutoBoxing
int n = num; // AutoUnBoxing