오토박싱의 함정
널 언박싱과 ==의 함정
오토박싱의 함정은(는) CoddyKit의 무료 Java Academy 강의입니다. 이것은 4개 중 4번째 강의입니다. 아래에서 전체 강의를 무료로 읽을 수 있으며, 내장 코드 에디터와 24/7 AI 튜터와 함께 브라우저에서 직접 실습할 수 있습니다. 이 강의는 Java Academy 학습 경로의 일부이며, 진행 상황이 웹과 CoddyKit 앱에 동기화됩니다. Java Academy 강의에는 총 4개의 강의가 포함되어 있습니다.
편리함의 함정
오토박싱은 코드를 깔끔하게 만들어 주지만, 예상하지 못한 오류를 일으킬 수 있는 변환을 숨깁니다. 가장 큰 함정은 널 언박싱과 동일성 비교인 ==입니다.
이 강의에서는 두 문제를 모두 피하는 방법을 보여 드립니다.
널 언박싱의 함정
래퍼가 null을 저장하고 있을 때 이를 기본형으로 언박싱하면 Java가 NullPointerException을 발생시킵니다.
코드가 단순한 대입처럼 보여서 이 문제를 놓치기 쉽습니다.
public class Main {
public static void main(String[] args) {
Integer maybe = null;
try {
int value = maybe;
System.out.println(value);
} catch (NullPointerException e) {
System.out.println("Cannot unbox null!");
}
}
}널 값과 산술 연산
이 함정은 식 안에서도 발생합니다. null인 래퍼를 더하면 먼저 언박싱되므로, 계산이 실행되기도 전에 예외가 발생합니다.
public class Main {
public static void main(String[] args) {
Integer count = null;
try {
int total = count + 5;
System.out.println(total);
} catch (NullPointerException e) {
System.out.println("Null in arithmetic!");
}
}
}널 방어하기
래퍼를 언박싱하기 전에 항상 null인지 확인하거나 기본값을 제공하세요.
public class Main {
public static void main(String[] args) {
Integer maybe = null;
int safe = (maybe != null) ? maybe : 0;
System.out.println(safe);
}
}== 캐시의 뜻밖의 동작
Integer.valueOf는 -128부터 127까지의 값을 캐시합니다. 따라서 이 범위에 있는 두 박싱 값이 같은 객체를 공유할 수 있고, ==는 참을 반환합니다.
public class Main {
public static void main(String[] args) {
Integer a = 100;
Integer b = 100;
System.out.println(a == b);
}
}캐시 범위 밖
캐시 범위를 벗어나면 박싱할 때마다 서로 다른 객체가 생성됩니다. 이때 ==는 참조를 비교하므로 숫자가 같더라도 거짓을 반환합니다.
public class Main {
public static void main(String[] args) {
Integer a = 200;
Integer b = 200;
System.out.println(a == b);
}
}항상 equals 사용하기
래퍼에서 ==는 객체 동일성을 비교하므로 실제 숫자 값을 비교하려면 .equals()를 사용해야 합니다.
public class Main {
public static void main(String[] args) {
Integer a = 200;
Integer b = 200;
System.out.println(a.equals(b));
}
}기본형과 == 함께 사용하기
==의 한쪽이 기본형이면 Java가 래퍼의 포장을 해제하므로 값으로 비교합니다. 이는 안정적이지만 래퍼가 null이면 여전히 오류가 발생할 수 있습니다.
public class Main {
public static void main(String[] args) {
Integer a = 200;
int b = 200;
System.out.println(a == b);
}
}반복문에 숨은 박싱
반복문의 누적 변수를 래퍼로 선언하면 반복할 때마다 새 객체가 생성됩니다. 아래에서 long 대신 Long을 사용하면 반복해서 박싱이 발생합니다. 기본형을 우선 사용하세요.
public class Main {
public static void main(String[] args) {
long sum = 0;
for (int i = 0; i < 1000; i++) {
sum += i;
}
System.out.println(sum);
}
}Map get은 Null 반환
실제 코드에서 흔히 발생하는 버그입니다. Map.get은 키가 없으면 null을 반환합니다. 그 결과를 int로 포장 해제하면 오류가 발생합니다. 대신 getOrDefault를 사용하세요.
import java.util.HashMap;
import java.util.Map;
public class Main {
public static void main(String[] args) {
Map<String, Integer> scores = new HashMap<>();
int score = scores.getOrDefault("missing", 0);
System.out.println(score);
}
}안전하게 사용하기
두 가지 습관으로 오토박싱 버그 대부분을 예방할 수 있습니다. null일 수 있는 값은 절대 포장을 해제하지 말고, 래퍼 값은 == 대신 항상 .equals()로 비교하세요.
빠른 확인
오토박싱의 함정을 얼마나 잘 알고 있는지 확인해 보세요.
복습
오토박싱의 주요 함정을 배웠습니다.
null래퍼의 포장을 해제하면NullPointerException이 발생합니다- null 확인 또는 기본값으로 방어하세요
- 래퍼에서
==는 참조를 비교하며, -128부터 127까지는 캐싱이 적용됩니다 - 값을 비교할 때는 항상
.equals()를 사용하세요 - 맵 조회에서 null을 피하려면
getOrDefault를 사용하세요
자주 묻는 질문
“오토박싱의 함정” 강의는 무료인가요?
네 — “오토박싱의 함정” 전체 내용을 이 웹사이트에서 무료로 읽을 수 있습니다. 인터랙티브하게 실습하려면(내장 코드 에디터와 24/7 AI 튜터), CoddyKit PRO로 업그레이드하면 Java Academy 강의 전체를 잠금 해제할 수 있습니다. Java Academy 강의에는 총 4개의 강의가 포함되어 있습니다.
“오토박싱의 함정”에서 뭘 배우나요?
널 언박싱과 ==의 함정 브라우저에서 직접 실행하는 실습 코드로 Java Academy을(를) 배우며, 24/7 AI 튜터가 강의를 진행하면서 질문에 답변해줍니다.
Java Academy을(를) 시작하는 데 경험이 필요한가요?
사전 경험은 필요하지 않습니다. CoddyKit의 Java Academy은(는) 초급자부터 고급 학습자까지를 위해 구성되어 있으므로, 여기서 시작하거나 처음부터 시작할 수 있으며 자신의 속도대로 진행할 수 있습니다. 이것은 4개 중 4번째 강의입니다.
“오토박싱의 함정” 강의는 얼마나 걸리나요?
대부분의 CoddyKit 강의는 약 5~10분이 소요됩니다. 각 강의는 간결하고 인터랙티브하여 꾸준한 진행이 가능하며, 웹과 앱에서 중단한 부분부터 바로 시작할 수 있습니다.
이 Java Academy 강의에서 코드를 작성하고 실행할 수 있나요?
네. 모든 Java Academy 강의에는 내장 코드 에디터가 포함되어 있으므로, 브라우저에서 바로 실제 코드를 작성하고 실행한 후 즉시 AI 피드백을 받을 수 있습니다 — 로컬 설정이 필요 없습니다.