도달 불가능한 문(Unreachable Statement)이란 프로그램이 실제로 실행되는 과정에서 한 번도 실행되지 않는 코드를 의미합니다. 컴파일러는 이러한 코드를 감지하면 컴파일 오류를 발생시켜 개발자에게 알려줍니다.
도달 불가능한 문이 발생하는 주요 원인
- 코드 앞에
return문이 있어 해당 지점 이후의 코드가 실행되지 않는 경우 - 코드에 무한 루프가 존재하여 루프를 벗어날 수 없는 경우
- 프로그램이 해당 코드에 도달하기 전에 강제로 종료되는 경우
이번 글에서는 final 키워드와 함께 사용될 때 도달 불가능한 문이 어떻게 나타나는지 예제를 통해 살펴보겠습니다.
예제 코드
class Demo_example{
final int a = 56, b = 99;
void func_sample(){
while (a < b){
System.out.println("The first value is less than the second.");
}
System.out.println("This is an unreachable statement");
}
}
public class Demo{
public static void main(String args[]){
Demo_example my_instance = new Demo_example();
my_instance.func_sample();
}
}출력 결과
/Demo.java:11: error: unreachable statement
System.out.println("This is an unreachable statement");
^
1 error
코드 설명
Demo_example이라는 클래스에는 두 개의 final 정수 변수(사실상 상수 역할)가 선언되어 있으며, 두 값을 비교하는 func_sample 메서드가 정의되어 있습니다. 이후 별도의 클래스 Demo의 main 메서드에서 Demo_example의 인스턴스를 생성하고, 해당 인스턴스를 통해 func_sample 메서드를 호출합니다.
왜 컴파일 오류가 발생할까?
핵심은 변수 a와 b가 final로 선언되었다는 점입니다. final 변수는 값이 절대 변경되지 않으므로, 컴파일러는 컴파일 시점에 a < b(즉, 56 < 99)의 결과가 항상 참임을 확정할 수 있습니다. 따라서 이 while 루프는 사실상 무한 루프이며, 루프 뒤에 위치한 System.out.println 문은 어떤 경우에도 실행될 수 없습니다.
컴파일러는 이를 미리 판단하여 "unreachable statement" 오류를 발생시킵니다. 만약 변수가 final이 아니었다면 실행 중에 값이 변경될 가능성이 있어 컴파일러가 루프 종료 여부를 판단할 수 없고, 따라서 오류 없이 정상적으로 컴파일됩니다.
이처럼 final 키워드는 상수 선언 외에도 컴파일러의 흐름 분석(flow analysis)에 영향을 주어, 도달 불가능한 코드를 사전에 잡아내는 데 중요한 역할을 합니다.