
Java의 자료형은 크게 기본 자료형(Primitive Type)과 참조 자료형(Wrapper Type)을 나뉩니다. 오늘은 이 두 자료형에 대해 알아보도록 하겠습니다.
기본 자료형은 메모리에 직접 값을 저장하는 자료형을 말합니다. Java에서 제공하는 8가지 기본 자료형은 다음과 같습니다.
| 자료형 | 크기 | 기본값 |
|---|---|---|
| boolean | 1 bit | false |
| 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 bit 지만, JVM에서는 1 Byte 할당byte, short, int, long)은 오버플로우 조심float, double)은 부동소수점 연산 오차 발생참조 자료형은 객체를 참조하는 방식으로 저장되는 자료형을 말합니다. Java는 기본 자료형을 객체로 감싸는 참조 자료형을 제공하는데, 이를 Wrapper 클래스라 하며 다음과 같습니다.
| 기본 자료형 | 참조 자료형 |
|---|---|
| boolean | Boolean |
| byte | Byte |
| short | Short |
| int | Integer |
| long | Long |
| float | Float |
| double | Double |
| char | Character |
이에 대한 특징은 다음과 같습니다.
"기본 자료형은 메모리에 직접 저장되는 자료형이다."
"참조 자료형은 객체를 참조하는 방식으로 저장하는 자료형이다."
위는 두 자료형에 대한 정의입니다. 둘 다 결국 어떤 자료를 저장하는 목적은 동일하지만 저장하는 방식이 다른 것을 알 수 있습니다.
다음 그림과 같이 기본 자료형은 메모리에 직접 저장하기 때문에 데이터를 바로 조회할 수 있습니다. 반면, 참조 자료형은 데이터가 아닌 Heap 메모리에 할당된 객체를 참조하기 위한 주소값을 저장하고 있습니다. 또한, Heap에 객체를 할당하는 것은 GC의 대상이 되는 객체의 갯수를 증가시키는 것과 같습니다.

기본 자료형은 메모리에 직접 값을 저장하며 이에 즉시 접근하여 값을 조회하는 방식으로 동작합니다. 즉, 참조 자료형보다 효율적으로 저장된 값을 사용하며 조회할 수 있습니다.
따라서, 다음과 같은 경우 기본 자료형을 사용하는 것이 적절합니다.
null이 필요없는 경우이러한 이유로 인해, 기본 자료형은 연산 속도와 메모리 효율성이 중요한 경우 사용하는 것이 가장 적절합니다.
참조 자료형은 Heap에 할당된 객체 주소값을 참조해서 저장된 값을 가져오는 방식으로 동작합니다. 즉, 같은 값 10이라도 서로 다른 객체로 생성되었다면 주소값이 다르므로 다른 값으로 판단될 수 있습니다.
또한, 메모리 주소를 저장하기 때문에 값이 할당되지 않은 경우 null을 저장할 수 있습니다. 이를 통해, 값이 없는 상태를 명확하게 표현할 수 있습니다.
따라서, 다음과 같은 경우 참고 자료형을 사용하는 것이 적절합니다.
List, Map, Set)에 저장해야 하는 경우이러한 이유로 인해, 참조 자료형은 객체 지향적인 설계가 필요한 경우나 값의 유무를 보다 정확하게 표현해야 할 때 사용하는 것이 가장 적절합니다.
기본 자료형은 왜 컬렉션에 저장할 수 없을까요?
Java의 제네릭은 기본 자료형을 지원하지 않기 때문입니다. 하지만, Java 8 이상에서는 기본 자료형을 효율적으로 다룰 수 있는 Primitive Stream과 같은 전용 자료구조를 제공합니다.
아래는 위 개념을 공부하면서 추가 학습이 필요할 것 같은 내용들입니다. 이 내용들은 차차 정리하여 링크를 달도록 하겠습니다.
두 자료형의 가장 큰 차이는 데이터를 저장하는 방식입니다. 기본 자료형의 경우 Stack 영역에 직접 저장하지만, 참조 자료형의 경우 Stack 영역에 참조 변수를 저장하여 Heap 메모리에 할당된 객체를 가르키는 주소를 저장합니다.
기본 자료형의 경우 단순 데이터 조회나 연산을 수행하는 경우나 메모리를 효율적으로 사용할 때 사용하는 것이 좋습니다. 참조 자료형의 경우 객체 지향적인 설계나 기본 자료형을 컬렉션 자료구조에 사용할 때 사용하는 것이 좋습니다.
Auto-Boxing은 기본 자료형을 참조 자료형으로 바꾸는 작업이고, Unboxing은 참조 자료형을 기본 자료형으로 바꾸는 작업을 말합니다.
컬렉션 자료구조의 경우 Genric이라는 문법을 사용합니다. 해당 문법은 기본 자료형을 지원하지 않기 때문에 컬렉션 자료구조에 저장하기 위해선 참조 자료형을 사용해야 합니다. 이에 따라, Java 8 이상에서는 기본 자료형을 효율적으로 다룰 수 있는 Primitive Stream 같은 자료구조를 제공하고 있습니다.