
자바(Java)를 처음 공부하거나 실무에 적용할 때, int와 Integer, boolean과 Boolean의 차이로 인해 혼란을 겪는 분들이 많습니다. 이번 글에서는 자바에서의 **기본형(primitive type)**과 참조형(wrapper class) 데이터타입의 차이를 명확하게 정리해 보겠습니다. 실무에서 자주 마주치는 변수 초기화 이슈까지 함께 다뤄봅니다.
기본형 vs 참조형 데이터타입
자바에는 int, boolean, char 등의 기본형 데이터타입과, Integer, Boolean, Character 같은 **참조형(wrapper class)**이 존재합니다.
기본형은 메모리에 값 자체가 저장되며 성능이 좋지만, 객체로 사용할 수 없습니다. 반면, 참조형은 클래스이므로 null 할당 가능, 컬렉션 사용 가능, 메서드 활용 가능 등의 장점이 있습니다.
예시:
int num1 = 10;
Integer num2 = null; // 가능
초기화에서 발생하는 차이
초기화를 하지 않았을 때의 동작은 특히 주의가 필요합니다. 클래스 멤버 변수일 경우:
int a; // 기본형 → 자동 초기화 (0)
Integer b; // 참조형 → 자동 초기화 (null)
그러나 로컬 변수는 자동 초기화되지 않기 때문에 직접 초기화를 해야 합니다.
초기화 이슈 예시:
public class Test {
Integer val;
public void check() {
System.out.println(val + 1); // NullPointerException 발생 가능
}
}
참조형은 null 상태에서 연산 시 예외가 발생할 수 있으니 주의가 필요합니다. 이런 점에서 기본형은 안전하지만 유연성은 참조형이 더 뛰어납니다.
자동 박싱과 언박싱
자바에서는 기본형과 참조형 간의 자동 변환 기능이 있습니다. 이를 오토박싱(Autoboxing), **언박싱(Unboxing)**이라고 부릅니다.
Integer num = 5; // 오토박싱
int result = num + 2; // 언박싱
간편하게 사용할 수 있지만, 내부적으로 불필요한 객체가 생성될 수 있으므로 성능에 민감한 코드에서는 주의가 필요합니다.
컬렉션 사용 시 선택 기준
컬렉션(예: ArrayList, HashMap)을 사용할 때는 참조형 타입만 사용할 수 있습니다.
List<Integer> list = new ArrayList<>();
따라서 자바에서 데이터타입을 선택할 때는 목적에 따라 결정하는 것이 중요합니다. 계산이 중심이라면 기본형, 객체 활용이나 컬렉션 저장이 목적이라면 참조형이 적합합니다.
마무리하며
자바에서의 int와 Integer, boolean과 Boolean 등은 비슷해 보이지만 동작 방식에서 큰 차이를 보입니다. 변수 초기화, null 처리, 컬렉션 활용, 성능 고려 등 실무에서는 각각의 특징을 명확히 알고 선택하는 것이 중요합니다. 자바 데이터타입의 이해는 코드의 안정성과 유지보수성을 높이는 첫걸음입니다.