Java의 코드를 보시면 변수나 메서드가 정의될 때, int, boolean, char 등의 타입이 작성된 것을 볼 수 있습니다. 자바에서 사용되는 기본적인 타입이고 값 자체를 저장하며 객체가 아닙니다.
Java에서 원시 타입은 아래와 같은 8가지의 타입으로 구성됩니다.
Java의 타입은 기본형 타입과 참조형 타입으로 나눌 수 있습니다. 기본형 타입은 원시 타입과 동일한 개념이지만, 참조형 타입은 모두 Wrapper Class라고 할 수 없습니다. Wrapper Class는 참조형 타입에 속하지만, 원시 타입을 객체로 감싸서 객체 지향적인 기능을 추가한 특수한 참조형 타입입니다.
Wrapper Class는 원시 타입에 대응하는 8개의 클래스가 있습니다.
Integer 클래스를 예시로 내부 구조를 살펴보겠습니다.
private final int value; // 감싸고 있는 기본형 데이터
public Integer(int value) {
this.value = value;
}
public static Integer valueOf(int i) {
return new Integer(i); // Autoboxing 지원 메서드
}
public int intValue() {
return value; // Unboxing 메서드
}
public static int parseInt(String s) throws NumberFormatException {
return Integer.parseInt(s); // 문자열 → int 변환
}
public int compareTo(Integer anotherInteger) {
return Integer.compare(this.value, anotherInteger.value); // 값 비교
}
public static final int MAX_VALUE = 2147483647; // int의 최대값
public static final int MIN_VALUE = -2147483648; // int의 최소값
Boxing은 원시 타입을 Wrapper Class로 변환하는 것이고,
Unboxing은 Wrapper Class를 원시 타입으로 변환하는 것입니다.
명시적 변환과 내부적 변환으로 나눌 수 있는데, 내부적 변환은 컴파일러가 내부적으로 처리해주는 것을 의미합니다.
// Boxing (명시적)
int primitiveValue = 10;
Integer boxedValue = Integer.valueOf(primitiveValue);
// Unboxing (명시적)
Integer wrapperValue = Integer.valueOf(20);
int unboxedValue = wrapperValue.intValue();
// Auto-boxing (내부적)
Integer autoBoxedValue = primitiveValue;
// Auto-unboxing (내부적)
int autoUnboxedValue = wrapperValue;
구분 | Primitive Type | Wrapper Class |
---|---|---|
Null | Null 불가 | Null 허용 |
메모리 | JVM stack에 저장, 비교적 빠름 | JVM heap에 저장, 비교적 느림 |
변경 | 값을 그대로 저장하고 변경 가능 | 값을 변경하려면 새 인스터스의 주소값을 참조하여 변경 |
데이터베이스 설계에 따라, 객체 지향적 기능에 따라 사용할 표현 방식을 항상 고려하며 작업하자