앞에서도 잠깐 언급한 바와 같이 스택 메모리 변수를 초기화하지 않으면 메모리 공간은 텅 비어 있다. 이 상태에서는 해당 변수를 출력할 때 오류가 발생한다. 기본 자료형 변수이든, 참조 자료형 변수이든 모든 변수는 스택 메모리에 위치하고 있다. 따라서 모든 변수는 초기화 이후에만 출력할 수 있다.
🎩초기화 하지 않을 때의 초깃값
int a; // 기본 자료형
int b[]; // 참조 자료형
System.out.println(a); // 오류 발생
System.out.println(b); // 오류 발생
기본 자료형 변수는 스택에 실제 데이터값을 저장하므로 초깃값 역시 실제 데이터값(0, -1, false 등)을 저장한다. 반면 참조 자료형 변수는 실제 데이터의 위치를 저장하므로 초깃값으로는 실제 데이터값이 아닌 '가리키고 있는 위치가 없음.'을 나타내는 null을 사용한다. 정리하면 기본 자료형의 초깃값으로는 '값', 참조 자료형의 초깃값으로는 'null'을 사용하면 된다.
🎩기본 자료형과 참조 자료형의 초깃값
int a = 0; // 기본 자료형
int[]b = null; // 참조 자료형
System.out.println(a); // 0 출력
System.out.println(b); // null 출력
+) 힙 메모리에서의 강제 초깃값
힙 메모리는 모든 공간에 값이 들어가 있어야 하며 초기화를 하지 않았을 때 자바 가상 머신이 강제 초기화한다. 강제 초기화될 때의 기본값은 다음과 같다.
//스택 메모리 값 (강제 초기화되지 않음)
int value1;
// System.out.println(value1); // 오류
int[] value2;
// System.out.println(value2); // 오류
// 스택 메모리에 위치하는 변수는 초기화 없이 출력 불가능
int value3 = 0; //0으로 초기화
System.out.println(value3);
int[] value4 = null; // null로 초기화
System.out.println(value4);
System.out.println();
//힙 메모리 초깃값 ( 강제 초기화 )
//@기본 자료형 배열
boolean[] array1 = new boolean[3]; // false로 초기화
for (int i = 0; i < 3; i++) {
System.out.print(array1[i] + " ");
}
System.out.println();
int[] array2 = new int[3]; // 0으로 초기화
for (int i = 0; i < 3; i++) {
System.out.print(array2[i] + " ");
}
System.out.println();
double[] array3 = new double[3]; // 0.0으로 초기화
for (int i = 0; i < 3; i++) {
System.out.print(array3[i] + " ");
}
System.out.println();
//@참조 자료형 배열
String[] array4 = new String[3]; // null로 초기화
for (int i = 0; i < 3; i++) {
System.out.print(array4[i] + " ");
}
System.out.println();
System.out.println();
//배열을 한 번에 출력
System.out.println(Arrays.toString(array1));
System.out.println(Arrays.toString(array2));
System.out.println(Arrays.toString(array3));
System.out.println(Arrays.toString(array4));
결과