배열, 객체의 필드 등 heap 메모리 생성되는 데이터들은 데이터 타입에 따라 기본값으로 초기화가 된다. int는 0으로, boolean은 false로, 참조형은 null값으로.. 따라서 우리는 따로 초기화를 해주지 않아도 이 데이터들로 접근 할 수 있고, 기본값을 얻는다.

하지만 지역변수는 다르다. 지역변수는 stack메모리에 생성이 되는데 이 생성되는 시점이 다르기 때문이다. heap메모리에 생성되는 애들은 선언과 동시에 메모리에 생성되지만 지역변수는 초기화가 될 때 stack메모리에 생성이 된다. 즉, 변수에 값이 저장될 때 stack메모리에 생성된다. 즉, 메모리 영역에 따라 초기화를 자동으로 해준다는 말은 결과적으론 맞는 말 같지만 틀린 말이다. 지역변수는 초기화를 해주지 않으면 생성되지 않기 때문에 사용하지 못한다라고 하는 게 맞다.

정리하면 이렇다.

  1. heap 메모리에 생성되는 변수(멤버변수, 배열)들은 선언과 동시에 메모리에 생성되기 때문에 초기화 없이 사용할 수 있다.
  2. stack 메모리에 생성되는 지역변수들은 초기화(값이 처음 저장될 때) 될 때 메모리에 생성되기 때문에 초기화 하지 않고는 사용 할 수 없다.