⭐⭐⭐
래퍼 클래스는 자바의 기본 자료형을 객체로 다루기 위해 사용하는 클래스로, 박싱과 언박싱을 통해 기본형과 객체 간의 변환이 가능하며, 오토 박싱과 언박싱이 지원되어 개발자가 이를 의식하지 않고 사용할 수 있지만, 래퍼 클래스와 기본형을 혼용하면 성능 저하가 발생할 수 있으므로 가능한 같은 타입을 일관되게 사용하는 것이 좋음
기본 자료형 ( primitive type )을 객체로 감싸주는 클래스
즉, byte, short, int, long, float, double, char, boolean과 같은 값을 객체로 다루고 싶을 때 사용
Interger num1 = new Integer(5);
or Integer num1 = 5;
박싱과 언박싱을 통해 기본형과 래퍼 클래스로 변환함
자동 박싱과 자동 언박싱
JDK 1.5부터는 박싱과 언박싱이 필요한 상황에 자바 컴파일러가 자동으로 처리해주거 시작
⇒ 오토 박싱, 오토 언박싱
⇒ 기본 타입 값을 직접 박싱, 언박싱 하지 않아도 래퍼 클래스 변수에 대입만 하면 자동으로 해줌
/* 기존 박싱 & 언박싱 */
Integer num = new Integer(17); // 박싱
int n = num.intValue(); // 언박싱
/* 오토 박싱 & 언박싱 */
Integer num = 17; // new Integer() 생략
int n = num; // intValue() 생략
래퍼 클래스의 동등 비교
오토 언박싱을 통해 객체의 값을 더하고 빼는 등의 연산을 문제가 없지만, 객체 값을 비교할 대는 조심 !!
Integer num1 = new Integer(100);
Integer num2 = new Integer(100);
num1 == num2; // 참조형과 참조형 비교 false
따라서, 래퍼 클래스의 객체 값 비교는 포장 내부의 값을 얻어 비교해야 하기에, 직접 언박싱해서
비교하거나, equals() 메서드를 통해 비교해야 함
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
대신 래퍼 클래스와 기본 자료형과의 비교는 자동으로 오토 박싱, 언방식을 해주기에 ==. equals() 모두 가능
Integer num = new Integer(10);
Integer num2 = new Integer(10);
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
래퍼 클래스 사용의 성능 문제
기본형(primitive)과 래퍼 클래스를 혼용하면 성능에 좋지 않기에 가능하면 타입을 일치시켜서 사용 !!
public class PerformanceTest {
public static void main(String[] args) {
long start = System.currentTimeMillis();
Long sum = 0L; // 래퍼 클래스 사용 (주의!)
for (long i = 0; i < Integer.MAX_VALUE; i++) {
sum += i; // 오토박싱 + 언박싱 계속 발생!
}
System.out.println("합계: " + sum);
System.out.println("걸린 시간: " + (System.currentTimeMillis() - start) + "ms");
}
}
sum += i는 내부적으로 언박싱 → 연산 → 박싱을 반복하게 됨
따라서, long sum = 0L으로 바꿔서 진행하는게 성능이 훨씬 좋음