
자바(Java)에서 안정적인 애플리케이션을 개발하기 위해 가장 중요한 개념 중 하나가 **예외 처리(Exception Handling)**입니다.
이때 throw와 throws는 매우 자주 사용되지만, 문법이 유사하여 혼동하기 쉽습니다.
이번 글에서는 자바에서 throw와 throws의 차이점과 각각의 역할을 명확하게 정리해드리겠습니다.
1. 예외 처리가 중요한 이유
애플리케이션 실행 중 예외가 발생하면 프로그램이 비정상 종료될 수 있습니다.
이러한 상황을 방지하고, 오류를 제어 가능한 흐름으로 처리하기 위해 자바에서는 try-catch와 함께 예외 객체를 명시적으로 다루는 방식을 채택합니다.
throw와 throws는 이 예외 흐름을 정의하는 핵심 키워드입니다.
2. throw 키워드의 개념과 사용 예시
throw는 예외 객체를 직접 생성해 발생시키는 데 사용됩니다.
if (age < 0) {
throw new IllegalArgumentException("나이는 음수가 될 수 없습니다.");
}
- throw 뒤에는 Exception 객체가 반드시 와야 함
- 예외를 발생시키는 행위 자체를 수행
- 일반적으로 조건 검사 후, 비정상 입력이나 상태일 때 사용
✅ throw는 하나의 예외만 던질 수 있으며, 실행 즉시 흐름이 중단됩니다.
3. throws 키워드의 개념과 역할
throws는 메서드 시그니처에서 예외가 발생할 가능성을 선언하는 데 사용됩니다.
public void readFile() throws IOException {
// 파일 읽기 로직
}
- 해당 메서드를 호출하는 측에 예외 처리 책임을 위임
- **체크 예외(checked exception)**의 경우 반드시 throws 선언 필요
- 비즈니스 로직에서 발생 가능한 예외를 명시적으로 문서화하는 역할
📌 throws는 발생이 아닌 **"예외 발생 가능성 선언"**이라는 점에서 throw와 다릅니다.
4. throw vs throws 문법과 기능 비교
| 항목 | throw | throws |
| 역할 | 예외 발생 | 예외 선언 |
| 위치 | 메서드 내부 | 메서드 선언부 |
| 뒤따르는 값 | 예외 객체 | 예외 클래스명 |
| 한 번에 처리 가능 수 | 1개 예외 객체 | ,로 여러 개 선언 가능 |
| 사용 목적 | 실제 예외를 던짐 | 예외 처리 책임 위임 |
// 예시 코드
public void check(int num) throws IllegalArgumentException {
if (num < 0) {
throw new IllegalArgumentException("음수는 허용되지 않습니다.");
}
}
- throws는 호출자에게 책임을 넘기고
- throw는 실제 예외를 발생시킵니다.
5. 실무에서 자주 하는 실수와 팁
- throw 뒤에 예외 객체 없이 예외 클래스만 쓰는 실수
throw IllegalArgumentException; // ❌ 오류
throw new IllegalArgumentException(); // ✅
- throws는 꼭 필요한 경우에만 선언
- 과도한 예외 위임은 코드 복잡성 증가
- 필요 없는 throws Exception 선언은 지양
- RuntimeException은 명시적 throws 없이도 가능
- NullPointerException, IllegalArgumentException 등은 비체크 예외
✅ 마무리
자바의 throw와 throws는 비슷한 이름이지만 역할과 사용 위치가 완전히 다릅니다.
- throw는 예외를 직접 발생시키고
- throws는 예외가 발생할 수 있음을 선언합니다.
정확한 이해를 바탕으로 예외를 체계적으로 처리하면, 더 안정적이고 예측 가능한 애플리케이션을 개발할 수 있습니다.