자바의 데이터 타입은 크게 기본 타입(primitive type:원시 타입)과 참조 타입(reference type)으로 분류된다.
기본 타입은 정수, 실수, 문자, 논리 리터럴을 저장하는 타입이다.
참조 타입은 객체(Object)의 번지를 참조하는 타입으로 배열, 열거, 클래스, 인터페이스 등이 있다.
데이터 타입
- 기본 타입(primitive type)
- 정수 타입
- byte
- char
- short
- int
- long
- 실수 타입
- float
- double
- 논리 타입
- boolean
- 정수 타입
- 참조 타입(reference type)
- 배열
- 열거
- 클래스
- 인터페이스
기본 타입과 참조 타입으로 선언된 변수의 차이점은 저장되는 값이 무엇이냐가 중요하다.
기본 타입으로 선언된 변수는 실제 값을 변수 안에 저장하지만 참조 타입으로 선언된 변수는 메모리의 번지를 값으로 갖는다.
번지를 통해 객체를 탐조한다는 뜻에서 참조 타입이라고 부른다.
메모리 상에서 변수는 스택 영역에 생성되고, 객체는 힙 영역에 생성된다.
참조 타입에 대해 자세히 알기 위해서는 JVM이 사용하는 메모리 영역에 대해서 알아야 할 필요가 있다.
메모리 사용 영역
java.exe로 JVM이 시작되면 JVM은 운영체제에서 할당받은 메모리 영역을 다음과 같이 세부 영역으로 구분해서 사용한다.
영역은 크게 메서드 영역, 힙 영역, JVM Stack 영역 세 가지로 나뉜다.
메서드(Method) 영역
메소드 영역에는 코드에서 사용되는 클래스들을 클래스 로더로 읽는다.
클래스 별로 런타임 상수풀, 필드 데이터, 메서드 데이터, 메서드 코드, 생성자 코드 등을 분류해서 저장한다.
메서드 영역은 JVM이 시작할 때 생성되고 모든 스레드가 공유하는 영역이다.
힙(heap) 영역
객체와 배열이 생성되는 영역이다. 힙 영역에 생성된 객체와 배열은 JVM Stack 영역의 변수나 다른 객체의 필드에서 참조한다.
참조하는 변수나 필드가 없다면 의미 없는 객체가 되기 때문에 쓰레기로 취급하고 JVM은 가비지 컬렉터(Garbage Collector)를
실행시켜 쓰레기 객체를 힙 영역에서 자동으로 제거한다.
JVM 스택(Stack) 영역
JVM 스택 영역은 각 스레드마다 하나씩 존재하며, 스레드가 시작될 때 할당된다.
JVM 스택은 메서드를 호출할 때마다 프레임(Frame)을 추가(push)하고, 메서드가 종료되면 해당 프레임을 제거(pop)한다.
프레임 내부에는 로컬 변수 스택이 있는데, 기본 타입 변수와 참조 타입 변수가 추가되거나 제거된다.
변수는 선언된 블록 안에서만 스택에 존재하고, 블록을 벗어나면 스택에서 제거된다.
앞에서 말했듯이 기본 타입 변수는 스택 영역에 직접 값을 갖고 있지만 참조 타입 변수는 힙 영역이나 메서드 영역의 주소를 가진다.
참고로 자바에서는 배열을 객체로 취급한다.