지역변수와 전역변수의 초기화 initialized 이야기
이번 글에서는 자바 변수의 초기화에 대해서 기본 개념을 정리해볼까 합니다. 자바에서는 변수를 선언하면 종류에 따라서 메모리의 두 곳에 할당되는데 전역변수(이하 멤버)는 Garbage Collection Heap이라는 곳에 위치하며 지역변수(이하 지역)는 Runntime Stack에 할당됩니다.
이것들이 메모리의 어디에 할당되느냐에 딸라서 달라지는 건 스스로 초기화가 되는지 여부인데 Runntime Stack에 자리르 잡는 지역은 자동으로 초기화가 이루어지지 않습니다. 그렇기 때문에 반드시 따로 진행을 해줘야 하는데요. 다른 말로 메서드 내에 있는 것은 무조건 초기화를 해줘야 한다는 의미입니다.
예를 들어 다음과 같은 코드가 있을 때....
public class Test { public static void main(String[]ar){ int a; System.out.println("a의 값은:"+a); } }
a는 main() 메소드 안에 선언되어 있으며 따로 초기화를 거치지 않고 값의 출력을 시도하고 있습니다. 이 소스로 컴파일을 시도하면 다음과 같은 에러가 발생합니다.
대충 내용을 보면 a가 초기화(initialized ) 되지 않았다는 내용입니다. 그럼 예제에서 최초의 값을 대입해서 초기화를 해주겠습니다.
언제 그랬냐는 듯 제대로 컴파일이 진행되고 프로그램도 실행됩니다. 이렇게 지역 반드시 초기화를 해줘야 하다는거 확인했구요. 다음은 멤버의 경우를 확인해보겠습니다.
public class Test { int a; public static void main(String[]ar){ Test tx=new Test(); System.out.println("a의 값은:"+tx.a); } }
이번에는 a를 메소드 내부가 아닌 밖에 선언한 멤버의 형태입니다. 예제에서는 Test 클래스의 객체를 만들어서 a에 접근하고 있는데 객체 생성 관련 내용은 해당 단락에서 정리하기로 하구요. 여기서는 Garbage Collection Heap에 자리를 잡으면서 스스로 '0'으로 초기화 된다는 점만 확인하고 넘어갈게요.
이렇게 자바에서 사용하는 변수 중 메소드 내부에 있는 지역과 밖에 있는 멤버는 스스로 초기화 되는게 다르기 때문에 메소드 안에 선언할 때는 반드시 초기화를 해줘야 한다는 걸 기억하면서 마무리하겠습니다. 수고하셨어요.