📑 자바 자료형 완전 정리 [기본형, 참조형, Wrapper 클래스]
자바에서 자료형(Data Type)은 변수가 어떤 종류의 데이터를 저장할 수 있는지를 정의한다. 크게 기본형(Primitive Type)과 참조형(Reference Type)으로 나눌 수 있다.
1. 기본형 (Primitive Type)
기본형은 값 자체를 저장하는 타입이다. 총 8가지가 존재하며 메모리에 바로 값이 저장된다.
각 타입별 메모리 크기와 기본값은 아래와 같다.
정수형
- byte - 1 byte - 0
- short - 2 byte - 0
- int - 4 byte - 0
- long - 8 byte - 0L
실수형
- float - 4 byte - 0.0f
- double - 8 byte - 0.0d
문자형
- char - 2 byte - ‘\u0000’
논리형
- boolean - 1 byte* - false
(boolean은 JVM 내부적으로 1 byte를 사용하지만 명세상 크기가 고정되어 있지 않다.)
기본형 데이터는 스택(Stack) 메모리에 직접 값이 저장되어 접근 속도가 빠르고 관리가 단순하다.
2. 참조형 (Reference Type)
참조형은 객체의 주소(참조값)를 저장한다. 대표적으로 String, 배열, 클래스, 인터페이스 등이 있다.
String name = "Java"; // 문자열 객체 참조
int[] numbers = {1, 2, 3}; // 배열 객체 참조
myClass obj = new MyClass(); // 사용자 정의 클래스 객체 참조
기본형이 스택에 메모리가 저장되는 것과 달리 참조형의 경우 스택에는 객체의 주소값만 저장되고 실제 데이터는 힙(Heap)에 저장된다.
때문에 여러 변수가 같은 객체를 참조할 수도 있고 값에 접근 시 스택 → 힙을 거치므로 기본형보다 접근 속도가 다소 느리다.
또한 이러한 특성 때문에 참조형 변수끼리 == 비교 시 주소값을 비교하게 되며 실제 값의 비교는 equals() 메서드를 사용해야 한다.
String a = new String("BlueCool");
String b = new String("BlueCool");
System.out.println(a == b); // false (주소 비교)
System.out.println(a.equals(b)); // true (값 비교)
추가적으로 자바에서는 가비지 컬렉터(Garbage Collector)가 더 이상 참조되지 않는 객체를 자동으로 정리하여 메모리를 관리한다.
3. Wrapper 클래스
Wrapper 클래스는 기본형 데이터를 객체처럼 다루기 위해 제공된다.
Wrapper 클래스를 사용하는 이유?
1. 컬렉션 프레임워크
List, Map, Set과 같은 컬렉션은 객체만 저장할 수 있으므로 기본형 대신 Wrapper 클래스를 사용해야 한다.
2. null 값 표현
DB값이 없을 때 API 응답에서 필드가 비어있을 때 유용하다.
3. 편의 메서드 제공
Wrapper 클래스는 형 변환, 문자열 변환, 상수값 반환 등 다양한 유틸리티 메서드를 제공한다.
4. 제네릭(Generic)과 함께 사용
제네릭 타입에는 기본형을 사용할 수 없으므로 Wrapper 클래스를 사용해야 한다.
5. 객체 지향 호환성
자바 API 상당수가 객체 타입을 전제로 설계되어 있기 때문에 객체로 다뤄야 하는 경우 Wrapper 클래스가 필수적이다.
각 기본형 자료형에 대응하는 Wrapper 클래스는 다음과 같다.
byte → Byte
short → Short
int → Integer
long → Long
float → Float
double → Double
char → Character
boolean → Boolean
오토박싱(Auto-Boxing) & 언박싱(Unboxing)
자바5 부터는 기본형과 Wrapper 클래스 간 변환이 자동으로 이루어진다.
// 오토박싱: 기본형 -> Wrapper
Integer numObj = 10; // Integer.valueOf(10) 자동 적용
// 언박싱: Wrapper -> 기본형
int num = numObj; // numObj.intValue() 자동 적용
Wrapper 클래스 사용 시 주의점
1. null 가능성
Wrapper 클래스는 참조형이므로 null 값을 가질 수 있다.
Integer n = null;
// int m = n; // NullPointerException 발생 (언박싱 시)
2. 성능
기본형보다 메모리 사용량이 많고 접근 속도가 느리다. (참조형이기 때문)
3. 값 비교 방법
== 연산자는 주소값을 비교하므로 값 비교 시 equals()를 사용해야 한다.