자바는 객체지향 언어임에도 성능을 위해 8개의 기본형을 객체로 다루지 않는다. 하지만, 때로는 기본형 변수도 객체로 다뤄야 하는 경우가 있다.
기본형 값을 객체로 다룰 수 있게 하는 클래스
Integer num1 = new Integer(100);
Integer num2 = new Integer(100);
num1 == num2; // 참조형과 참조형 비교 false
/* 기존 박싱 & 언박싱 */
Integer num = new Integer(17); // 박싱
int n = num.intValue(); // 언박싱
/* 오토 박싱 & 언박싱 */
Integer num = 17; // new Integer() 생략
int n = num; // intValue() 생략
wrapper 클래스와 기본 자료형과의 비교는 자동으로 오토박싱과 언박싱을 해주기 때문에 == 연산과 equals 연산 모두 가능하다.
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
wrapper 객체가 null인 상태에서 auto-unboxing이 일어난 경우
Integer num = null;
int x = num; // 여기서 NullPointerException 발생!
null 체크 if (num1 != null) {
int result = num1 + 5;
} else {
System.out.println("num1이 null입니다.");
}
Optional 클래스 Integer num1 = null;
int result = Optional.ofNullable(num1).orElse(0) + 5;
System.out.println(result); // 5 출력
단지 똑같은 자료값을 저장하지만 어떤 타입 방식으로 선언했느냐에 따라 어플리케이션 성능 차이가 있다.
작성한 코드에 불필요한 auto casting이 반복적으로 이루어지고 있는지 확인해야한다.