네, 자바에서는 메서드의 return 문을 catch 블록이나 finally 블록 안에 작성할 수 있습니다. 다만 각 경우마다 코드의 흐름과 결과가 달라지므로 정확히 이해하고 사용하는 것이 중요합니다.
핵심 개념 정리
- 메서드가 반환 타입을 가지고 있다면, 조건에 따라 메서드 내 어느 위치에서든 값을 반환할 수 있습니다.
catch블록에서 값을 반환하고, 메서드 마지막에도 return 문이 존재한다면 코드는 정상적으로 컴파일되고 실행됩니다.- 반면
catch블록에서 값을 반환한 후, 메서드 마지막 return 문 뒤에 추가로 문장을 작성하면 해당 코드는 절대 실행되지 않습니다. 이를 도달 불가능한 코드(unreachable code)라고 하며, 자바는 도달 불가능한 코드를 허용하지 않으므로 컴파일 오류가 발생합니다. finally블록에서 값을 반환하면 메서드 마지막에 별도의 return 문을 두지 않아도 됩니다. 단, finally의 return은 try나 catch의 반환값보다 우선 적용되므로 주의해야 합니다.
예제 1: catch 블록에서 값 반환하기
public class CatchReturn {
int calc() {
try {
int x = 12 / 0;
} catch (Exception e) {
return 1;
}
return 10;
}
public static void main(String[] args) {
CatchReturn cr = new CatchReturn();
System.out.println(cr.calc());
}
}실행 결과
1
위 예제에서 12 / 0은 ArithmeticException을 발생시키므로 try 블록은 즉시 중단되고, catch 블록의 return 1;이 실행되어 결과값으로 1이 출력됩니다.
예제 2: finally 블록에서 값 반환하기
public class FinallyReturn {
int calc() {
try {
return 10;
} catch (Exception e) {
return 20;
} finally {
return 30;
}
}
public static void main(String[] args) {
FinallyReturn fr = new FinallyReturn();
System.out.println(fr.calc());
}
}실행 결과
30
try 블록에서 이미 10을 반환하려 했지만, finally 블록은 예외 발생 여부와 관계없이 항상 실행되며 여기서 반환된 값이 최종 결과를 덮어씁니다. 따라서 출력 결과는 30입니다.
정리 및 주의사항
catch와 finally 블록에서 return 문을 사용하는 것은 문법적으로 가능하지만, 특히 finally 블록에서의 return은 try 또는 catch의 반환값을 무조건 덮어쓰기 때문에 코드의 의도를 모호하게 만들고 디버깅을 어렵게 할 수 있습니다. 따라서 실무에서는 finally 블록에서 return을 사용하는 것을 피하고, 리소스 해제 등의 정리 작업만 수행하는 것이 권장됩니다.