필드와 지역 변수의 또 다른 차이점은 초깃값이다. 필드는 직접 초기화하지 않아도 강제로 초기화된다. 반면, 지역 변수는 직접 초기화 하지 않으면 저장 공간이 빈 공간 그대로 있어 값을 출력하고자 할 때 오류가 발생한다. 이는 사실 필드와 지역 변수의 차이가 아니라 각각이 위치하는 메모리 영역의 특징이다. 힙 메모리에는 빈 공간이 저장될 수 없기 때문에 힙 메모리에 위치하는 필드는 강제로 초기화되는 것이고 스택 메모리는 강제로 초기화되지 않으므로 여기에 저장되는 지역 변수 또한 그 특징을 지니고 있는 것이다.
다음 예제를 살펴보면 필드 m,n 그리고 지역 변수 k를 모두 초기화하지 않았다. 초기화하지 않은 지역 변수를 출력하고자 할 때는 오류가 발생하지만 int 자료형의 두 필드는 값 0을 출력한다. 필드가 강제로 초기화됐기 때문이다.
class A {
int m;
int n;
void work1() {
int k;
//System.out.println(l); // 초깃값 없이 출력을 시도해 오류 발생
}
}
public class jh {
public static void main(String[] args) {
A a = new A();
System.out.println(a.m); // 0
System.out.println(a.n);
// a.work1();
}
}
5장에서 언급한 것처럼 강제 초기화 값은 필드의 자료형에 따라 다르다. 기본 자료형일 때 불리언 자료형은 false, 정수형은 0, 실수형은 0.0으로 초기화된다. 이외에 모든 참조 자료형은 어느 위치도 가리키고 있지 않다는 것을 나타내는 null 값으로 초기화된다.
class A {
boolean m1;
int m2;
double m3;
String m4;
void printFieldValue() {
System.out.println(m1);
System.out.println(m2);
System.out.println(m3);
System.out.println(m4);
// 필드는 초기화하지 않아도 값이 강제 초기화돼 출력 가능
}
void printLocalVariable() {
int k;
// System.out.println(k); // 지역 변수를 초기화하지 않아 오류 발생
}
}
public class jh {
public static void main(String[] args) {
// 클래스를 활용해 객체 생성
A a = new A();
// 객체 활용
a.printFieldValue();
}
}
결과