박싱(Boxing) & 언박싱(UnBoxing)
래퍼 클래스는 값을 포장하여 객체로 만드는것 이지만 값을 더하거나 변환시켜야 할 필요가 생길경우 포장을 다시 뜯을 필요가 필요하다. 이러한 행위를 박싱(Boxing)과 언박싱(UnBoxing) 이라고 한다.
- Boxing : 기본타입의 데이터 → 래퍼 클래스의 인스턴스로 변환
- UnBoxing : 래퍼 클래스의 인스턴스에 저장된 값 → 기본타입의 데이터로 변환
주의할점은 래퍼 클래스는 산술 연산을 위해 정의된 클래스가 아니다.
생성된 인스턴스의 값만 참조할수 있기 때문에 따라서 래퍼 클래스 인스턴스에 저장된 값을 직접 변경이 불가능하다.
그래서 래퍼 클래스를 언박싱 한 뒤에 값을 변경한 뒤 박싱해야 하는 중간 단계를 거칠 필요가 있다.
자동 박싱(AutoBoxing) & 자동 언박싱(AutoUnBoxing)
기존 박싱 & 언박싱
Integer num = new Integer(17); // 박싱
int n = num.intValue(); // 언박싱
오토 박싱 & 언박싱
Integer num = 17; // new Integer() 생략
int n = num; // intValue() 생략
기본타입 값을 직접 박싱, 언박싱하지 않아도 래퍼 클래스 변수에 대입만하면 자동으로 박싱과 언박싱이 된다.
new 키워드를 사용하지 않고도 자동으로 인스턴스를 생성가능하다.
언박싱 메소드를 사용하지 않고도, 오토 언박싱을 이용하여 인스턴스에 저장된 값을 바로 참조할수있다.
래퍼 클래스 연산
Integer num1 = new Integer(7); // 박싱
Integer num2 = new Integer(3); // 박싱
int int1 = num1.intValue(); // 언박싱
int int2 = num2.intValue(); // 언박싱
// 박싱된 객체를 오토 언박싱하여 연산하고 다시 박싱하여 저장
Integer result1 = num1 + num2; // 10
Integer result2 = int1 - int2; // 4
int result3 = num1 * int2; // 21
래퍼 클래스는 직접연산이 불가능 하지만 컴파일러가 스스로 판단해 자동으로 언박싱하여 연산하기 때문에 다음 구문이 허용된다.
래퍼 클래스 동등 비교
Integer num1 = new Integer(100);
Integer num2 = new Integer(100);
num1 == num2; // 참조형과 참조형 비교 false
---------------------------------------------------------
Integer num1 = new Integer(10);
Integer num2 = new Integer(20);
Integer num3 = new Integer(10);
System.out.println(num1 == num3); // false
System.out.println(num1.equals(num3)); // true
// 동등 비교 외의 연산은 문제 없다.
System.out.println(num1 < num2); // true
System.out.println(num1 + num2); // 30
---------------------------------------------------------
Integer num = new Integer(10); // 래퍼 클래스1
Integer num2 = new Integer(10); // 래퍼 클래스2
int i = 10; // 기본타입
// 래퍼클래스 == 기본타입
System.out.println(num == i); // true
// 래퍼클래스.equals(기본타입)
System.out.println(num.equals(i)); // true
// 래퍼클래스 == 래퍼클래스
System.out.println(num == num2); // false (invalid)
// 래퍼클래스.equals(래퍼클래스)
System.out.println(num.equals(num2)); // true
래퍼클래스의 객체 값 비교는 포장 내부의 값을 얻어 비교해야 되기 때문에 직접 언박싱해서 비교하던가, equals() 메소드를 통해 바로 비교가 가능하다.
대신 래퍼클래스와 기본 자료형과의 비교는 자동으로 오토박싱과 언박싱을 해주기 때문에 == 연산과 equals 연산 모두 가능하다.
자료형 변환 메소드
String str = "10";
String str2 = "10.5";
String str3 = "true";
byte b = Byte.parseByte(str);
int i = Integer.parseInt(str);
short s = Short.parseShort(str);
long l = Long.parseLong(str);
float f = Float.parseFloat(str2);
double d = Double.parseDouble(str2);
boolean bool = Boolean.parseBoolean(str3);
System.out.println("문자열 byte값 변환 : "+b);
System.out.println("문자열 int값 변환 : "+i);
System.out.println("문자열 short값 변환 : "+s);
System.out.println("문자열 long값 변환 : "+l);
System.out.println("문자열 float값 변환 : "+f);
System.out.println("문자열 double값 변환 : "+d);
System.out.println("문자열 boolean값 변환 : "+bool);
객체를 포장하는 기능 외에도, 래퍼 클래스는 자체 지원하는 parse타입() 메소드를 이용하여 데이터 타입을 형 변환 할때도 유용히 쓰인다.
'JAVA' 카테고리의 다른 글
[JAVA] Collection(Set) (0) | 2023.07.18 |
---|---|
[JAVA] Collection(List) (0) | 2023.07.18 |
[JAVA] Wrapper class (0) | 2023.07.18 |
[JAVA] 중첩 클래스, 익명객체 (0) | 2023.07.18 |
[JAVA] 클래스 상속, 참조형 캐스팅, 추상클래스, 인터페이스 (0) | 2023.07.18 |