자바의 데이터 타입
자바의 데이터 타입은 실제 값을 의미하는 기본 타입(Primitive type)과 어떤 값이 저장된 주소를 값으로 갖는 참조 타입(Reference type)이 존재한다.
- 기본 타입(primitive type): byte, char, short, int, long, float, double, boolean
- 참조 타입(reference type): 배열 타입, 열거 타입, 클래스, 인터페이스
기본형 타입 (Primitive Data Type)
정수, 실수, 문자, 논리 리터럴을 저장하는 타입을 말하고 원시 타입이라고도 부른다.
- 정수형 : byte, short, int, long
- 실수형 : float, double
- 문자형 : char
- 논리형 : boolean
기본형 타입은 실제 데이터 값을 메모리 공간 중 Stack에 저장하는 타입이다.
비객체 타입이므로 null 값을 가질 수 없고, 무조건 기본값이 정해져 있어야한다.
int a = 20;
boolean flag = false;
예를 들어 위와 같은 코드가 있다고 가정하면, 실제 메모리 공간상의 그림은 아래와 같다.
그림처럼 기본형 타입은 Memory 공간 중 Stack에 a와 flag의 실제 데이터 값이 저장된다.
참조형 타입
참조형 타입의 경우에는 값을 저장할 때, 데이터가 저장된 위치를 나타내는 주소 값이 저장된다.
즉, 실제 값은 다른 곳에 있으며 값이 있는 주소를 가지고 있어서 나중에 그 주소를 참조해서 값을 가져온다.
메모리의 힙(heap)에 실제 값을 저장하고, 그 참조값(주소값)을 갖는 변수는 스택에 저장한다.
참조형 변수는 null로 초기화 시킬 수 있다.
int a = 20;
boolean flag = false;
Person person = new Person();
예를 들어 이전 코드에서 Person이라는 클래스를 정의해서 추가했다고 가정하면
전체적인 그림은 다음과 같이 그릴 수 있을 것이다.
참조형 타입 - 배열
참조형 타입 중 배열의 경우에는 데이터가 저장된 위치를 나타내는 주소 값은 스택에 저장되고 실제 값은 Heap에 저장된다.
예시를 들어 설명해보자면
int[] array1 = new int[]{1,2,3,4,5};
array1을 가리키는 주소값은 Stack 영역에 저장되고 array1의 객체는 Heap 영역에 저장된다.
이때 1가지 의문점이 들 수 있는데, 1, 2, 3, 4, 5는 Primitive type으로 원래는 Stack 영역에 저장되는 것 아닌가? 라고 생각할 수 있다.
하지만 이 경우에는 배열의 원소이기 때문에 미리 할당된 Heap 영역에 저장되는 것이다.
Member[] members = new Member[]{member1, member2};
만약 위와 같이 배열의 원소가 Reference type인 경우에는 Stack에 members의 주소값이 저장되어 있고 Heap 영역에는 원소인 member1, member2의 주소값이 저장되어 있다.
이 코드는 Goods 배열을 선언한 후 각 배열 요소에 Goods 객체를 할당하는 예제 코드다.
public static void main(String[] args) {
...
Goods[] goods = new Goods[COUNT_GOODS];
for(int i = 0; i < COUNT_GOODS; i++) {
String line = scanner.nextLine();
goods[i] = new Goods();
...
}
...
해당 코드에서 Goods 배열을 선언하고, goods[i]에 값을 넣을 때는 new Goods로 객체를 생성하고 할당하는 과정이 필요하다. 만약 goods[i] = new Goods() 구문이 빠지면, 배열의 각 원소 값에 null 값을 가지게 되어 NullPointerException이 발생한다.
'Java' 카테고리의 다른 글
[Java] 상속과 다형성 + (메소드 오버라이딩) (2) | 2024.12.06 |
---|---|
[Java] Static 변수 & 메서드 (0) | 2024.11.28 |
[Java] 클래스, 인스턴스, 레퍼런스에 대해 알아보자 (0) | 2024.11.27 |
[Java] Maven이란? (1) | 2024.11.26 |
[Java] JVM, JRE, JDK에 대해 알아보자! (0) | 2024.11.25 |