본문 바로가기
Language/Java

[JAVA] 던지느냐, 알리느냐! throw와 throws의 명확한 차이와 실무 활용법

by Papa Martino V 2026. 1. 20.
728x90

throw와 throws의 명확한 차이
throw와 throws의 명확한 차이

 

 

자바 언어에서 예외 처리(Exception Handling)를 처음 배울 때 가장 헷갈리는 용어 중 하나가 바로 throwthrows입니다. 철자 하나 차이밖에 나지 않지만, 이 둘은 예외를 대하는 태도와 문법적 위치에서 극명한 차이를 보입니다. 단순히 시험을 위해 외우는 지식을 넘어, 견고한 애플리케이션 설계를 위해 반드시 마스터해야 할 이 두 키워드의 본질을 심도 있게 파헤쳐 보겠습니다.

1. 핵심 정의: 수동적 전파 vs 능동적 발생

먼저 두 키워드의 역할을 한 문장으로 정의하자면 다음과 같습니다.

  • throw: 개발자가 직접(능동적으로) 예외 객체를 생성하여 예외를 발생시킬 때 사용합니다.
  • throws: 메서드 선언부에서 호출자에게 "이 메서드는 이러한 예외가 발생할 수 있다"라고 미리 경고(수동적 전파)할 때 사용합니다.

2. throw: 예외의 화살을 쏘다

throw는 주로 비즈니스 로직에서 특정 조건이 만족되지 않을 때, 강제로 예외 흐름을 태우기 위해 사용합니다. 예를 들어 사용자 나이가 음수이거나 결제 잔액이 부족한 경우, 시스템은 예외를 던져서 흐름을 중단해야 합니다.

Sample Example (throw)


public void checkAge(int age) {
    if (age < 0) {
        // 직접 예외 객체를 생성해서 던집니다.
        throw new IllegalArgumentException("나이는 음수일 수 없습니다: " + age);
    }
    System.out.println("나이 확인 완료: " + age);
}

3. throws: 예외의 폭탄을 넘기다

throws는 현재 메서드 내에서 예외를 처리(try-catch)하지 않고, 자신을 호출한 상위 메서드에게 예외 처리를 떠넘길 때 사용합니다. 이는 API 설계 시 사용자가 예외 상황에 대비하도록 강제하는 효과가 있습니다.

Sample Example (throws)


import java.io.IOException;

public void readFile() throws IOException {
    // 내부에서 발생한 IOException을 처리하지 않고 호출자에게 던집니다.
    FileReader reader = new FileReader("test.txt");
    reader.read();
}

4. throw vs throws 일목요연 비교표

두 키워드의 문법적 위치와 사용 목적을 표를 통해 비교해 보겠습니다.

비교 항목 throw throws
사용 위치 메서드 내부 (Body) 메서드 선언부 (Signature)
주요 역할 예외를 발생시킴 예외를 전파(선언)
대상 예외 객체 (Instance) 예외 클래스명 (Class)
개수 제한 한 번에 하나의 예외만 던짐 콤마(,)로 여러 예외 선언 가능
사용 형식 throw new Exception(); void method() throws E1, E2 {}

5. 실무에서의 전문적인 활용 팁

단순히 문법을 아는 것보다 중요한 것은 "언제 무엇을 쓰느냐"입니다. 전문적인 자바 개발자는 다음과 같은 원칙을 지킵니다.

  1. 사용자 정의 예외와 throw: 비즈니스 규칙에 어긋나는 상황에서는 표준 예외보다는 의미가 명확한 Custom Exceptionthrow 하세요.
  2. Checked Exception과 throws: 파일이나 네트워크 작업처럼 복구가 필요한 상황(Checked Exception)에서는 throws를 통해 호출자에게 대처 방안을 마련하게 하세요.
  3. Unchecked Exception은 굳이 throws 하지 않기: RuntimeException 계층의 예외는 throws에 명시하지 않아도 됩니다. 이는 코드를 깔끔하게 유지하는 비결입니다.

6. 결론

throw발생이고, throws회피(전파)입니다. 이 두 도구를 적절히 조합할 때 비로소 예외 상황에서도 중단되지 않는 견고한 시스템을 구축할 수 있습니다. 여러분의 코드에서 예외가 단순히 '터지는' 에러가 아니라, 관리 가능한 '신호'가 되도록 설계해 보시기 바랍니다.


참고 문헌 및 출처

  • Java Platform, Standard Edition 21 API Specification - java.lang.Throwable
  • Joshua Bloch, "Effective Java 3rd Edition", Addison-Wesley.
  • Baeldung, "Difference Between throw and throws in Java" (2025).
728x90