wrapper 클래스란?
- 자바의 자료형은 데이터의 타입을 의미하고, 기본 타입(primitive type)과 참조 타입(reference type)으로 나누어짐
[ 자료형 ]
1. 기본 타입 : byte, short, int, long, float, double, char, boolean
2. 참조 타입 : 참조할 수 있는 모든 자료형(배열, class, enum 등)
- 기본 타입의 데이터를 참조 타입으로 표현해야 하는 경우가 있는데, 이 경우에 기본 타입의 데이터를 객체화 해야 할 필요가 있음
- 기본 타입의 데이터를 객체화 하기 위해서 사용하는 클래스를 래퍼 클래스(wrapper class)라고 함
- 따라서, 모든 기본 타입은 객체로 표현할 수 있음
- 이러한 객체를 포장 객체라고 하는데, 기본 타입의 값을 내부에 두고 외부에서 포장(wrap)하는 것처럼 보이기 때문이고
- 래퍼 클래스가 기본 타입의 값을 감싸고 있기 때문에, 기본 타입의 값은 외부에서 변경할 수 없음
wrapper 클래스를 사용하는 이유
- 참조 타입의 자료형을 사용하는 이유와 같음
- 기본 자료형의 데이터를 단순히 값으로만 사용하지 않고
- 그 값을 메서드에서 사용하거나
- null 값을 이용하기 위해(참조형태만 null을 가질 수 있음)
1. 제네릭에서 사용
2. 기본 자료형의 데이터를 문자열로 변환하거나, 문자열을 기본 자료형으로 변환할 때
기본 타입에 대한 래퍼 클래스의 종류
기본 타입 | 래퍼 클래스 |
byte | Byte |
short | Short |
int | Integer |
long | Long |
float | Float |
double | Double |
char | Character |
boolean | Boolean |
문법
Integer num = new Integer(20); // 기본 타입 정수를 래퍼 클래스로 감싸기
Integer num2 = 5; // 생략 가능(오토박싱)
Double num3 = new Double(22.33);
Double num4 = 22.33; // 생략 가능(오토박싱)
박싱(Boxing)과 언방식(UnBoxing)
Boxing
- 기본 타입의 데이터를 래퍼 클래스의 인스턴스로 변환
UnBoxing
- 래퍼 클래스의 인스턴스에 저장된 값을 기본 타입의 데이터로 변환
Integer num = new Integer(22); // 박싱
int num2 = num.intValue(); // 언박싱: 객체(Integer)의 값을 int 기본 타입으로 변경
UnBoxing 메서드
- 래퍼 클래스의 인스턴스에 저장된 값을 기본 타입으로 변경해주는 메서드
메서드 | 변환값 | 설명 |
intValue() | int | 객체의 값을 기본 타입의 데이터로 변경 |
byteValue() | byte | |
shortValue() | short | |
longValue() | long | |
floatValue() | float | |
doubleValue() | double | |
booleanValue() | boolean |
오토 박싱(Auto Boxing)과 오토 언방식(Auto UnBoxing)
오토박싱과 오토 언박싱
- JDK5부터 래퍼 클래스 변수에 기본 타입의 값을 대입하면 컴파일러가 자동으로 박싱하고
- 기본 타입 변수에 래퍼 클래스에 저장된 값을 대입하면 자동 언박싱을 처리함
- 즉, 기본 타입의 데이터와 래퍼 클래스 객체간의 변환이 자동으로 이루어짐
Integer num = 22; // new Integer() 생략 가능
int number = num; // 객체를 int 타입으로 변경하는 intValue() 생략
- 오토 박싱
- new 키워드를 사용하지 않고 자동으로 래퍼 클래스의 인스턴스를 생성할 수 있음
- new Integer( ); 생략 가능
- 오토 언박싱
- 언박싱 메서드를 사용하지 않고도 인스턴스에 저장된 값을 기본 타입 데이터로 변경
- intValue( ); 생략 가능
오토박싱과 언방식을 사용하는 예
컬렉션에 기본 타입의 데이터를 저장하면, 자동으로 래퍼 클래스 객체로 변환하여 저장
- 컬렉션에 기본 타입의 데이터를 저장하려면, 래퍼 클래스 객체를 사용해야 했음
- 컬렉션에는 객체만 저장할 수 있음
- 하지만 오토박싱, 언오토박싱 기능이 도입 되어서
- 기본 타입의 데이터를 저장하면 래퍼 객체로 변환해서 컬랙션에 저장되고
- 기본 타입의 데이터를 가지고 올 때 다시 래퍼 클래스 객체에서 기본 타입 데이터로 자동 변환해줌
- 즉, 기본 타입의 데이터와 래퍼 클래스 객체간의 변환이 자동으로 이루어지는 것
public class Test {
public static void main(String[] args) {
List<Integer> list = new ArrayList<Integer>();
// Integer 객체로 자동 변환(오토박싱)되어 List에 저장
list.add(100);
list.add(200);
list.add(300);
System.out.println(list); // [100, 200, 300]
// Ingeger(100) 객체가 정수 100으로 변환되어 intNum에 저장
Integer integerNum = list.get(0);
System.out.println(integerNum); // 100
// Ingeger(100) 객체가 정수 100으로 변환되어 intNum에 저장
int intNum = list.get(0);
System.out.println(intNum); // 100
}
}
출처
https://inpa.tistory.com/entry/JAVA-%E2%98%95-wrapper-class-Boxing-UnBoxing
'JAVA' 카테고리의 다른 글
[JAVA] 자바 스레드 생성(Thread, Runnable) (0) | 2024.04.29 |
---|---|
[JAVA] 프로세스와 스레드, 시스템 발전 과정(멀티 프로그래밍, 멀티태스킹) (0) | 2024.04.29 |
[JAVA] Map 인터페이스(HashMap, TreeMap) (1) | 2024.04.28 |
[JAVA] Queue 인터페이스 (0) | 2024.04.28 |
[JAVA] 공변성이 없는 제네릭, 제네릭 와일드 카드 (0) | 2024.04.26 |