코디잉

초기화하지 않은 지역 변수를 사용할 수 없는 이유 본문

CS/Java

초기화하지 않은 지역 변수를 사용할 수 없는 이유

yong_ღ'ᴗ'ღ 2025. 12. 16. 09:39

자바에서 지역 변수는 반드시 초기화한 후에 사용해야 한다.

 

이 규칙은 자바를 처음 배울 때부터 자주 들었지만,

왜 이렇게까지 엄격하게 제한하는지 깊이 생각해보지 않고 넘어갔다.


초기화하지 않은 변수를 사용하면 어떻게 되고, 왜 자바에서는 이를 허용하지 않을까?

 


❗ 초기화하지 않은 지역변수 사용

자바에서는 초기화하지 않은 지역변수를 읽거나 사용하려고 하면 컴파일 에러가 발생한다.

int local;
System.out.println(local);	// 컴파일 에러
java: variable local might not have been initialized

🤔 왜 이런 에러가 발생하는 걸까?

자바 컴파일러는

지역 변수가 사용되기 전에 반드시 초기화되었다고 확실하게 판단할 수 없는 경우,

코드 실행 자체를 허용하지 않는다.

참고: Definite Assignment(확정 할당)

자바 컴파일러는 지역 변수가 사용되기 전에 반드시 초기화되었는지를 컴파일 타임에 정적으로 검사한다. 이 규칙을 Definite Assignment(확정 할당)라고 한다.

 

🔍 "확실하게 판단할 수 없는 경우"란??

int local;

if (condition) {
    local = 10;
}

System.out.println(local);	// 컴파일 에러

 

위의 코드를 보면,

"condition이 true면 초기화되는데 왜 컴파일 에러 발생하지?"

라고 생각할 수 있다.

 

하지만 컴파일러 입장에서는

  ◽  condition이 항상 true라는 보장이 없고,

  ◽  따라서 local항상 초기화된다고 확신할 수 없다.

 

그래서 자바 컴파일러는 실행 자체를 허용하지 않고 컴파일 에러를 발생시킨다.

 

에러 메시지를 다시 보자.

java: variable local might not have been initialized

 

이것이 바로 에러 메시지에 나오는 "might not have been initialized"

"초기화하지 않았을 수도 있다" 는 의미다.

 


🛡️ 왜 이렇게 엄격할까?

자바는 실행 중 발생할 수 있는 오류를 가능한 한 컴파일 단계에서 차단한다.

 

초기화되지 않은 변수를 허용하면,

  ◽  어떤 값이 들어있을지 예측할 수 없고

  ◽  실행 결과가 환경에 따라 달라질 수 있으며

  ◽  디버깅이 매우 어려워진다.

 

자바는 이런 문제를 실행 시점이 아니라 컴파일 시점에 차단한다.

 

C/C++ 계열 언어에서는 초기화되지 않은 지역 변수를 사용할 수 있지만, 그 값은 예측할 수 없다.

반면 자바에서는 그러한 상황이 발생하기 전에 컴파일 단계에서 코드 실행을 아예 차단한다.

 


📌 참고: 지역 변수 vs 멤버 변수

위 규칙은 지역 변수에만 해당한다.

  ◽  지역 변수 → 반드시 초기화 필요

  ◽  멤버 변수 / 클래스 변수 → 자동으로 기본값으로 초기화

 


✍️ 정리

  ◽  자바에서는 초기화하지 않은 지역 변수를 사용할 수 없다.

  ◽  이는 실행 중 오류를 방지하기 위한 컴파일 타임 안전 장치다.

  ◽  자바 컴파일러는 "이 변수가 확실히 초기화되었는가?"를 기준으로 코드를 판단한다.

  ◽  확실하지 않다면, 컴파일 단계에서 실행 자체를 막는다.

 

💬 이 글은 인프런 김영한님의 자바 강의를 듣고,
지역 변수 초기화 규칙을 다시 이해하며 정리한 내용입니다.
Comments