Computer >> 컴퓨터 >  >> 프로그래밍 >> Java

자바(Java)에서 예외를 던지는 방법: throw와 throws 키워드 완벽 가이드

예외(Exception)는 프로그램 실행 중에 발생하는 예기치 않은 사건입니다. 코드 실행 도중 예외가 발생하면 프로그램의 흐름이 중단됩니다.

따라서 자바로 개발할 때는 예외를 적절하게 처리하는 것이 매우 중요합니다. 예외를 제대로 처리하지 않으면 프로그램이 실행 중간에 비정상 종료되어 최종 사용자 경험에 악영향을 미칠 수 있습니다.

이때 활용되는 것이 바로 throwthrows 키워드입니다. 두 키워드는 자바에서 예외를 발생시키고 선언하는 데 사용됩니다. 이 글에서는 실제 예제와 함께 자바에서 예외를 다루는 방법을 자세히 살펴보겠습니다.

자바 예외(Exception)의 이해

자바에서 프로그램의 흐름에 영향을 줄 수 있는 사건에는 크게 두 가지가 있습니다. 바로 오류(Error)와 예외(Exception)입니다.

오류(Error)는 JVM(자바 가상 머신)에서 발생하는 문제를 의미합니다. 메모리 누수, 시스템 메모리 부족, 라이브러리 호환성 문제 등이 대표적입니다. 오류가 발생하면 프로그램이 스스로 복구되기 어렵지만, 대부분 개발자가 통제할 수 있는 범위 밖의 문제이기 때문에 자바에서는 오류를 별도로 처리하지 않습니다.

예외(Exception)는 코드에서 직접 잡아내고(catch) 처리(handle)할 수 있는 사건입니다. 예외가 발생하면 해당 예외에 대한 정보를 담은 객체가 생성되며, 이 객체를 활용해 예외 발생 시 어떤 동작을 수행할지 코드로 지정할 수 있습니다.

예외가 발생하는 대표적인 원인은 다음과 같습니다.

  • 코드 자체의 논리적 오류
  • 존재하지 않는 파일 열기 시도
  • 잘못된 사용자 입력
  • 네트워크 연결 끊김

예외 처리를 시작하기 전에 반드시 알아야 할 두 가지 예외 유형이 있습니다.

  • 비체크 예외(Unchecked Exception): 런타임에 검사되는 예외입니다. ArithmeticException, ArrayIndexOutOfBoundsException 등이 여기에 속합니다.
  • 체크 예외(Checked Exception): 컴파일 타임에 검사되는 예외입니다. IOException, InterruptedException 등이 대표적입니다.

대체로 코드에서 직접 처리해야 하는 것은 체크 예외입니다. 비체크 예외는 대부분 프로그래밍 실수에서 비롯되기 때문입니다.

throws 키워드란?

자바의 throws 키워드는 특정 코드 블록에서 발생할 수 있는 예외의 유형을 선언할 때 사용합니다. throws 절의 기본 문법은 다음과 같습니다.

accessModifier return functionName() throws Exception1, Exception2 {
   // 실행할 코드
}

예제를 통해 살펴보겠습니다. 영화관에서 16세 이상 관람 영화의 연령을 확인하는 프로그램을 만든다고 가정해 보겠습니다. 고객이 16세 미만이면 입장이 불가능하고, 16세 이상이면 입장을 허용해야 합니다.

다음은 고객의 나이를 확인하고, 16세 미만일 경우 ArithmeticException을 던지는 코드입니다.

class Main {
	public static void verifyAge(int age) throws ArithmeticException {
		if (age < 16) {
			throw new ArithmeticException("This customer is not old enough to see the movie.");
		} else {
			System.out.println("This customer is old enough to see the movie.");
		}
	}

	public static void main(String[] args) {
		verifyAge(14);
	}
}

실행 결과:

Exception in thread "main" java.lang.ArithmeticException: This customer is not old enough to see the movie.
	at Main.verifyAge(Main.java:4)
	at Main.main(Main.java:11)

main 메서드에서 나이 인수로 14를 전달했기 때문에, verifyAge() 메서드가 실행될 때 조건식 age < 16이 참으로 평가되고 ArithmeticException이 발생합니다.

여기서 throws 키워드는 verifyAge() 메서드가 반환할 수 있는 예외의 유형을 정의하는 데 사용되었고, throw 키워드는 실제로 예외를 발생시키는 데 사용되었습니다.

throw 키워드란?

자바의 throw 키워드는 코드에서 단 하나의 예외를 발생시킬 때 사용합니다. throw 뒤에는 예외 발생 시 프로그램에서 던질 객체가 위치합니다.

throw 키워드의 기본 문법은 다음과 같습니다.

throw throwObject;

이제 throw 문을 활용해 예외를 처리하는 몇 가지 예제를 살펴보겠습니다.

체크 예외(Checked Exception) 던지기

프로그램에서 IOException이 발생했을 때 "This file does not exist."라는 메시지를 출력하고 싶다고 가정해 보겠습니다. IOException은 체크 예외이므로 throw 키워드로 처리해야 합니다.

import java.io.*;

class Main {
	public static void getFile() throws IOException {
		throw new IOException("This file does not exist.");
	}

	public static void main(String[] args) {
		try {
			getFile();
		} catch (IOException error) {
			System.out.println(error.getMessage());
		}
	}
}

실행 결과:

This file does not exist.

코드를 하나씩 살펴보겠습니다. 먼저 파일을 다루는 프로그램에서 필요한 java.io 라이브러리를 임포트합니다. 그다음 프로그램 코드를 담을 Main 클래스를 생성합니다.

Main 클래스 안에는 IOException을 던지는 getFile() 함수를 정의했습니다. 이 함수가 호출되면 "This file does not exist."라는 메시지와 함께 IOException이 발생합니다.

main 함수에서는 getFile() 메서드를 실행하는 try/catch 블록을 만들었습니다. IOException이 발생하면 catch 블록의 코드가 실행되어 예외 메시지가 콘솔에 출력됩니다. 그 결과 앞서 선언한 "This file does not exist." 메시지가 화면에 나타나는 것입니다.

비체크 예외(Unchecked Exception) 던지기

이번에는 프로그램이 문자열에 존재하지 않는 인덱스 값에 접근하려 할 때 StringIndexOutOfBoundsException을 던져 보겠습니다.

class Main {
	public static void outOfBounds() {
		throw new StringIndexOutOfBoundsException("This index value is invalid.");
	}

	public static void main(String[] args) {
		outOfBounds();
	}
}

코드를 분석해 보겠습니다. 먼저 프로그램 코드를 담는 Main 클래스를 선언했습니다. 그다음 실행될 때 StringIndexOutOfBoundsException을 던지는 outOfBounds() 함수를 만들었으며, 예외와 함께 "This index value is invalid."라는 메시지가 전달됩니다. 마지막으로 main 메서드에서 outOfBounds() 함수를 호출하면 다음과 같은 결과가 출력됩니다.

Exception in thread "main" java.lang.StringIndexOutOfBoundsException: This index value is invalid.
	at Main.outOfBounds(Main.java:3)
	at Main.main(Main.java:7)

이 예제에서는 비체크 예외를 던졌습니다. 앞서 설명했듯이 비체크 예외를 명시적으로 던지는 경우는 드물지만, 문법을 익히기 위해 예제로 살펴보았습니다.

마무리

체크 예외를 적절히 처리하는 것은 자바에서 유지보수하기 좋은 코드를 작성하는 데 필수적인 요소입니다. 자바에서는 throwthrows 키워드를 사용해 예외를 발생시키고 선언합니다.

이 글에서는 자바에서 throw와 throws 키워드를 사용하는 방법을 예제와 함께 알아보았습니다. 이제 여러분도 자바에서 예외를 능숙하게 던지고 처리할 준비가 되었습니다!