질문)
Java언어에서 throws Exception 의무화는 어떤 개념인가요?

답변)

Java의 throws Exception 의무화체크 예외(Checked Exception) 라는 Java만의 독특한 예외 처리 규칙 때문에 존재하는 개념입니다.
C#, Python, C++에는 없는 Java만의 강제 규칙입니다.

아래에 아주 쉽게 설명해드립니다.


✅ 1. Java에는 두 종류의 예외가 있다

Java 예외(Exception)는 크게 두 가지로 나눕니다.

종류설명예시
Checked Exception 반드시 처리해야 하는 예외 → “컴파일러가 강제” IOException, SQLException, ParseException
Unchecked Exception 처리해도 되고, 안 해도 컴파일됨 NullPointerException, RuntimeException

여기서 문제는 Checked Exception입니다.


✅ 2. “Checked Exception은 반드시 처리해야 한다”

Java의 규칙:

Checked Exception이 발생할 가능성이 있는 메서드는
반드시

  • try/catch로 잡거나
  • 메서드 선언부에서 throws로 호출자에게 던져야 한다.

예시:

 
public void readFile() throws IOException { FileInputStream f = new FileInputStream("aaa.txt"); }

왜 이렇게 해야 하냐면…

new FileInputStream()은 파일이 없으면 반드시 IOException이 발생할 수 있기 때문입니다.


✅ 3. 왜 “의무적으로 적어야 하는가?”

Java 컴파일러는 다음을 검사합니다:

❌ 만약 IOException이 날 수 있는 코드를

try-catch도 없이

throws도 없이

그냥 실행한다면?

컴파일 에러가 발생합니다.

즉, Java는 다음과 같이 강제로 예외 처리 정책을 코드에 명시하도록 의무화합니다:

✔ 이 메서드 안에서 내가 처리할게

 
try { FileInputStream f = new FileInputStream("aaa.txt"); } catch(IOException e) { e.printStackTrace(); }

또는

✔ 나는 처리 안 할 테니 호출자가 처리해라

 
public void readFile() throws IOException { FileInputStream f = new FileInputStream("aaa.txt"); }

이 두 개 중 반드시 하나를 해야 컴파일됩니다.


✅ 4. C#, Python 등은 왜 이게 없을까?

C#에는 Checked Exception 개념이 아예 없습니다.

즉, 아래 코드도 경고 없이 그냥 컴파일됩니다:

 
var f = new FileStream("aaa.txt", FileMode.Open);

예외가 발생하면 런타임에 처리할지 말지 결정할 수 있기 때문입니다.


✅ 5. Checked Exception(의무 처리)의 장점과 단점

👍 장점

  • 예외가 날 수 있는 부분을 개발자에게 명확히 알림
  • 컴파일 단계에서 누락된 예외 처리를 강제로 방지

👎 단점 (실무에서 더 많이 거론됨)

  • 코드가 지나치게 복잡해짐
    → 메서드 위에 throws가 줄줄이 이어짐
  • 라이브러리 설계가 번잡해짐
  • 결국 “무의미한 try-catch spam”이 생김

그래서 최신 언어들은 대부분 Checked Exception을 채택하지 않음.


📌 결론

Java의 “throws Exception 의무화”란,
Checked Exception을 반드시 명시적으로 처리하도록 컴파일러가 강제하는 규칙입니다.

+ Recent posts