[JAVA] Primitive type & Reference type
자바의 기본적인 데이터는 두가지 형식으로 구분될 수 있다.
자바에서 기본적으로 제공하는 Primitive type 과 객체(Object)로 정의하는 Reference type이다.
이 둘의 가장 큰 차이점은 데이터의 크기가 결정되어 있는지, 그리고 메모리에 주소값을 이용하는지 여부이다.
Primitive Type
기본형 데이터 타입으로 각 타입은 사용하는 데이터의 크기가 정해져있다. 해당 타입으로 데이터를 저장하게 되면 메모리의 stack 영역에 해당 데이터가 직접 저장된다.
ex)
int a = 5;
|
1 byte |
2 byte |
4 byte |
8 byte |
정수형 |
byte |
short |
int |
long |
실수형 |
|
|
float |
double |
문자형 |
char |
|
|
|
논리형 | boolean |
|
Reference Type
레퍼런스 타입은 참조형으로 데이터의 주소값을 저장한다. 객체 및 배열을 저장할 때 레퍼런스 타입을 사용한다. 대표적으로 String 타입이 있으며 그 외에 개발자가 작성한 객체들이 모두 여기에 해당한다.
레퍼런스 타입은 위에 얘기한 것과 같이 객체의 주소값을 stack 영역에 저장한다. 그리고 객체가 생성될 때 heap 메모리 영역에 실제 데이터를 저장한다. 그래서 객체에 접근하면 stack 에 있는 주소값을 참조하여 데이터에 접근하게 된다.
ex)
String str = "test";
Reference ref = new Reference(); // 개발자가 정의한 클래스를 객체로 생성
추가로 Primitive type 과 Reference type 은 속도차이가 나기 때문에 목적에 따라 사용할 필요도 있다.
비교연산이 목적이라면 Primitive type을 사용하는게 좋다.
비교연산이 아닌 Method의 경우는 신중하게 고민해야 한다.
속도차이가 나는 이유는
1. Heap 메모리 할당 비용이 크다
위에서 정리할 때 이야기 한 것처럼 Primitive type 은 데이터를 직접 stack 영역에 저장한다.
그러나 Reference type 은 stack 에는 주소값, heap 에 또 할당받아서 데이터를 저장해야 한다.
2. Stack 과 Heap 은 JVM 에서 처리하는 방식도 다르다
JVM 에서 데이터를 저장할 때 stack 은 비교적 예측 가능한 크기의 메모리가 할당되고, heap 은 가변적 크기의 메모리가 할당된다. 또 heap 보다 stack 이 캐싱될 확률이 높다.
int n1 = 100; Integer n2 = new Integer(100);
상황에 맞게 제대로 쓰도록 연습해야 할 것으로 보인다.
*참조