자바에서는 데이터 타입에 대해 크게 두 가지를 제공한다. 바로 원시 타입(Primitive Type)과 참조 타입(Reference Type)이 있다.
원시 타입은 논리형, 문자형, 정수형, 실수형 등의 실제 데이터(값)를 저장하는 타입이고,
참조 타입은 객체가 생성된 메모리의 주소를 저장하는 타입이다.
원시 타입과 참조 타입을 알아보기 전에 이 두개의 타입은 서로 다른 메모리 영역에 저장된다.
해당 영역에서는 원시 타입의 변수가 할당되고 실제 값들이 저장된다.
참조 타입의 변수들은 힙 영역에 생성된 객체들의 주소 값을 저장하고 있다.
객체 안의 메소드의 작업이 종료되면 할당되었던 메모리 공간은 반환되어 비워진다.
해당 영역에선 객체와 배열이 생성된다.
참조 타입(배열, 객체, 인터페이스)들이 가지고 있는 주소 값은 Stack 영역에 저장된다.
원시 타입과는 다르게 크기가 정해져 있지 않으며, 프로그램 실행 시 Heap 영역에 동적으로 할당된다.
만약 참조하는 변수가 없다면 GC가 제거하는 대상이 된다.
원시타입은 JVM 메모리 구조 중 Stack 영역에 저장된다.
원사타입의 갯수는 총 8개가 있으며, 기본적으로 자바가 데이터를 다루는 최소 범위는 1 Byte이다.
종류 | 데이터형 | 크기(byte / bit) | 표현 범위 |
---|---|---|---|
논리형 | boolean | 1 / 8 | true 또는 false |
문자형 | char | 2 / 16 | '\u0000' ~ 'uFFFF' (16비트 유니코드 문자 데이터) |
정수형 | byte | 1 / 8 | -128 ~ 127 |
정수형 | short | 2 / 16 | -32768 ~ 32767 |
정수형 | int | 4 / 32 | -2147483648 ~ 2147483647( -21억 ~ + 21억) |
정수형 | long | 8 / 64 | -9223372036854775808 ~ 9223372036854775807(-100경 ~ + 100경) |
실수형 | float | 4 / 32 | 1.4E-45 ~ 3.4028235E38 |
실수형 | double | 8 / 64 | 4.9E-324 ~ 1.7976931348623157E308 |
원시타입을 제외한 나머지 타입은 전부다 참조 타입이라고 볼 수 있다.
실제 객체는 Heap 영역에 저장되며, 참조 타입 변수는 Stack 영역에 실제 객체의 주소 값을 저장하게 된다.
스택 영역 | 힙 영역 |
---|---|
int age = 25 | |
char cc = 'c' | |
String name = 1111번지 | 1111번지 : "커피" |
Boxing은 원시 타입을 참조 타입으로 변환 시키는 것을 말하고, UnBoxing은 참조 타입을 원시 타입으로 변환 시키는 것을 말한다.
자바 1.5부터 추가된 Auto Boxing / UnBoxing 기능으로 인해 명시적으로 형변환을 하지 않아도 자동으로 Boxing / UnBoxing을 해준다.
public class BoxingUnBoxing {
public static void main(String[] args) {
// Boxing
int i = 10;
Integer integer = i;
System.out.println(i);
System.out.println(integer);
// UnBoxing
Integer integer2 = 20;
int i2 = integer2;
System.out.println(i2);
System.out.println(integer2);
}
}
결과
10
10
20
20
원시타입은 null을 담을 수 없고, 참조 타입은 가능하다.
int a = null; // 불가능
Integer integer = null; // 가능
원시 타입은 제네릭 타입에서 사용할 수 없지만, 참조 타입은 가능하다.
ArrayList<int> list; // 불가능
ArrayList<Integer> list; // 가능