Java

JAVA 오토박싱 & 오토언박싱

차가운개발 2024. 12. 2. 19:52

 

Java에서 기본형 데이터와 그에 대응하는 래퍼 클래스 간의 자동 변환을 말한다 Java5 부터 도입되어 코드 작성이 더 간단하고 직관적이게 되었다.

 

기본형 : int, double, boolean 등 원시 데이터 타입

래퍼 클래스 : 기본형을 객체로 감싸는 클래스 (Integer, Double, Boolean 등)

 

사용 이유 : 객체를 필요로하는 컬렉션(List, Map 등) 이나 제네릭과 함께 사용할 수 있도록 기본형을 객체로 변환

 

ㅇ 오토박싱

기본형 데이터를 해당하는 래퍼 클래스 객체로 자동 변환하는 것

public class Example {
	public static void main(String[] args) {
    	int num = 10; // 기본형 타입
        Integer wrapper = num; // 오토박싱 (기본형 > 래퍼 클래스)
        
        System.out.println(wrapper); // 10 출력
    }
}

Integer wrapper = num 은 내부적으로 컴파일 시 
Integer wrapper = Integer.valueOf(num);을 호출하여 객체로 변환한다

 

ㅇ 오토 언박싱

래퍼 클래스가 객체를 기본형으로 자동 변환하는 것

public class Example {
	public static void main(String[] args) {
    	Integer wrapper = 20; // 래퍼 클래스
        int num = wrapper; // 오토언박싱(래퍼 > 기본형)
        
        System.out.println(num); // 20 출력
    }
}

int num = wrapper;는 내부적으로 컴파일 시
int num = wrapper.intValue();를 호출하여 객체를 기본형으로 변환한다

 

ㅇ 주의사항

빈번한 사용은 성능에 영향을 줄 수 있다

 

오토 언박싱시 래퍼 클래스 객체가 null이면 NullPointException이 발생

 

동등성 비교

== 연산자는 기본형과 객체 간 비교시 오토 언박싱을 수행한다.

Integer a = 100; // 오토박싱
Integer b = 100; // 오토박싱
System.out.println(a == b); // true (캐싱된 객체)

Integer c = 1000;
Integer d = 1000;
System.out.println(c == d); // false (새 객체 생성)


Integer 클래스는 자주사용된다고 생각하는 -128부터 127까지의 값을 캐싱한다.
이 범위 내의 Integer 객체는 객체를 새로 생성하지 않고 캐싱된 객체를 사용한다.
그래서 이 범위를 넘어가는 값 1000을 비교하면 새로운 객체가 생성되기 때문에 
결과가 false가 된다