코디잉
초기화하지 않은 지역 변수를 사용할 수 없는 이유 본문
자바에서 지역 변수는 반드시 초기화한 후에 사용해야 한다.
이 규칙은 자바를 처음 배울 때부터 자주 들었지만,
왜 이렇게까지 엄격하게 제한하는지 깊이 생각해보지 않고 넘어갔다.
초기화하지 않은 변수를 사용하면 어떻게 되고, 왜 자바에서는 이를 허용하지 않을까?
❗ 초기화하지 않은 지역변수 사용
자바에서는 초기화하지 않은 지역변수를 읽거나 사용하려고 하면 컴파일 에러가 발생한다.
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 멤버 변수
위 규칙은 지역 변수에만 해당한다.
◽ 지역 변수 → 반드시 초기화 필요
◽ 멤버 변수 / 클래스 변수 → 자동으로 기본값으로 초기화
✍️ 정리
◽ 자바에서는 초기화하지 않은 지역 변수를 사용할 수 없다.
◽ 이는 실행 중 오류를 방지하기 위한 컴파일 타임 안전 장치다.
◽ 자바 컴파일러는 "이 변수가 확실히 초기화되었는가?"를 기준으로 코드를 판단한다.
◽ 확실하지 않다면, 컴파일 단계에서 실행 자체를 막는다.
💬 이 글은 인프런 김영한님의 자바 강의를 듣고,
지역 변수 초기화 규칙을 다시 이해하며 정리한 내용입니다.
'CS > Java' 카테고리의 다른 글
| 리터럴(Literal)이란 무엇이고, 타입은 어떻게 결정될까? (0) | 2025.12.17 |
|---|---|
| 자바 프로그램은 어떻게 컴파일되고 실행될까? (0) | 2025.12.15 |
