
이 내용은 Backend / OOP logic in Java 영역에서 “프로그램을 비정상 종료시키지 않고, 예외 상황을 제어 가능한 흐름으로 바꾸는 방법”을 다루는 Exception Handling(예외 처리) 정리이다. 기존 코드에서 잘못 사용된 예외 타입(에러 코드 개념)을 수정하고, 표준적인 구조로 처음부터 다시 정리한다.
Java에서 “에러”와 “예외”는 명확히 구분된다.
즉, 우리가 다루는 대상은 대부분 Exception이며, 목적은 하나다. “프로그램이 예외 때문에 강제 종료되지 않도록 제어하는 것”.
예외 처리는 단순히 “에러를 숨기기”가 아니라,
을 위해 반드시 필요한 구조다.
예외가 발생하기 전에 조건으로 차단하는 방식이다. 단순하지만 모든 예외를 if로 처리하면 코드가 복잡해진다.
int a = 10;
int b = 0;
if (b == 0) {
System.out.println("0으로 나눌 수 없습니다.");
} else {
int result = a / b;
System.out.println("결과: " + result);
}
예외가 “발생할 수 있는 코드”를 try로 감싸고, 발생 시 catch에서 처리한다. finally는 예외 발생 여부와 관계없이 항상 실행된다.
int a = 10;
int b = 0;
try {
int result = a / b;
System.out.println("결과: " + result);
} catch (ArithmeticException e) {
System.out.println("0으로 나눌 수 없습니다: " + e.getMessage());
} finally {
System.out.println("예외 여부와 관계없이 마지막에 실행됨");
}
Java에서 예외 처리는 “출력 메시지”가 아니라 어떤 예외 클래스 타입을 catch 하느냐에 의해 동작한다. 즉, 예외 처리는 문자열 비교가 아니라 타입 기반 분기이며, 타입이 맞지 않으면 catch 블록이 실행되지 않는다.
List.get(index)에서 범위를 벗어난 인덱스를 접근하면 발생하는 예외는 IndexOutOfBoundsException이다.
배열(int[])과 컬렉션(List, ArrayList 등)은 내부 구현이 다르기 때문에, 인덱스 오류에 사용되는 예외 타입도 서로 다르다.
아래 코드는 List에서 존재하지 않는 인덱스를 접근했을 때 발생하는 예외를 IndexOutOfBoundsException 타입으로 받아 처리하는 구조이다.
import java.util.List;
public class ExceptionSummary {
public static void main(String[] args) {
List<Integer> nums = List.of(1, 2, 3, 4, 5);
try {
System.out.println(nums.get(5));
} catch (IndexOutOfBoundsException e) {
System.out.println("Index error: " + e.getMessage());
} finally {
System.out.println("프로그램 정상 종료");
}
}
}
catch는 “메시지”가 아니라 예외 클래스 타입으로 분기된다. 따라서 타입이 맞지 않으면:
즉, 예외 처리는 “에러 문구 출력”이 아니라 어떤 상황을 어떤 타입으로 분류하느냐(에러 코드 개념)가 핵심이다.
이 구조를 기준으로 예외 타입을 선택해야, try/catch가 실제로 “프로그램 흐름 제어” 역할을 수행한다.
login()은 예외를 “던지기만” 하고, 실제 처리는 호출자인 main에서 담당한다. 이는 비즈니스 로직과 출력(UI) 로직을 분리하는 구조다.
public class Exception2 {
public static void main(String[] args) {
String inputId = "admin";
String inputPassword = "1234qwer";
try {
login(inputId, inputPassword);
} catch (LoginFailedException e) {
System.out.println("로그인 실패: " + e.getMessage());
} finally {
System.out.println("프로그램 정상 종료");
}
}
}
실행 흐름:
예외 처리는 단순한 에러 방어가 아니라, “어디서 처리하고 어디로 넘길 것인가(throws)”를 설계하는 과정이다. 특히 예외 타입(에러 코드)을 정확히 쓰지 않으면, try/catch를 작성해도 의미가 없어진다. Custom Exception을 활용하면 로직 자체가 상황을 설명하게 되어, 유지보수성과 가독성이 크게 향상된다.