사용하는 API에 따라 다형성에 입각하여 Primitive type 데이터를 객체처럼 다뤄야 할 때가 있다.
메소드 매개변수 값을 객체로 넣어야 하면 기본타입 그대로 사용할 수 없기 때문에 기본타입 각각이 객체타입으로 변환할 수 있는 Wrapper Class를 가지고 있다.
Primitive Type | Wrapper Class |
byte | Byte |
short | Short |
int | Integer |
long | Long |
float | Float |
double | Double |
char | Character |
boolean | Boolean |
JDK1.4 이전에는 기본형과 참조형 간의 연산이 불가능했기 때문에 래퍼 클래스로 기본형을 객체로 만들어서 연산해야 했다. 기본형을 참조형으로 만들 때도 기본형 선언한 변숫값을 래핑클래스 인스턴스를 만들며 값을 전달하고
래핑클래스를 다시 기본형으로 만들 때에는 메서드를 사용해서 변환된 값을 할당해준다.
기본 타입 -> 래퍼 클래스로 변환하는 과정을 박싱(Boxing)
래퍼 클래스 -> 기본 타입으로 변환하는 과정을 언박싱(UnBoxing)이라 칭한다.
//JDK1.4이전
int i = 10;
// Boxing
Integer objInt = new Integer(i);
// UBoxing
int j = objInt.intValue();
int k = 5;
int sum = k + objInt; // 기본형, 참조형간 연산 불가
JDK1.5부터 기본형과 참조형간의 연산이나 박싱, 언박싱이 필요한 상황에서 컴파일러가 자동으로 변환하는 코드를 넣어주는데 이를 오토박싱(AutoBoxing) 오토언박싱(AutoUnBoxing)이라고 부른다.
// JDK1.5부터
int i = 10;
// AutoBoxing
Integer objInt = i; // new 키워드 없이 인스턴스 생성
// AutoUnBoxing
int j = objInt; // intValue() 메소드 사용없이 인스턴스에 저장된 값 참조
int k = 5;
int sum = k + objInt; // 기본형 참조형 연산 가능
객체 배열을 가지고 있는 Vector 클래스나 ArrayList 클래스에 기본형 값을 저장하거나 형변환할 때 오토박싱, 오토언박싱 되어 편리하게 사용할 수 있다.
ArrayList<Integer> list = new ArrayList<>();
list.add(10); // 오토박싱 list.add(new Integer(10));
int value = list.get(0); // 오토언박싱 list.get(0).intValue();
오토박싱, 오토언박싱은 랭귀지 규칙을 위배한 것이 아닌 생성자가 없는 클래스에 컴파일러가 기본 생성자를 자동 추가해 주듯이 개발자가 간략하게 쓴 구문을 컴파일러 타임에 변경해 주는 것뿐이다.
참고
-자바의 정석 기초
-http://www.tcpschool.com/java/java_api_wrapper
'Effective Java > 키워드' 카테고리의 다른 글
플라이 웨이트 패턴 (Flyweight Pattern) (0) | 2023.01.07 |
---|---|
브리지 패턴 (Bridge Pattern) (0) | 2023.01.07 |
정규표현식 (Regular Expression) (0) | 2023.01.06 |
의존 객체 주입 패턴 (Dependency Injection Pattern) (0) | 2023.01.06 |
정적 유틸리티 클래스 (Static Utility Class) (0) | 2023.01.06 |