너무나 당연하게 예외처리를 하고 있었던 와중에, 예외처리가 꼭 필요할까 ? 에 대한 생각이 들었다. 그냥 습관적으로 예외 핸들링을 하고 있었던 것 같달까 ….
따지고 보면 if-else
와 같은 조건문으로 입력 값을 처리하는거나 try-catch
등을 활용하여 예외를 처리하는 것이 콘솔의 결과창으로 봤을 때는 동일하게 느껴졌기 때문이다.
따라서 원초적인 질문에 대해 정리하는 시간을 가졌다. 요즘 개발을 하면서 사소한 것 하나부터 끈질기게 의심하고 “왜” 해야하는지에 대해 치열하게 고민하려고 노력중이다.
그래서, 왜 ! 예외처리가 필요할까 ?
if-else
로 예상되는 잘못된 값을 처리하는 것과 예외를 처리하는 것은 개념적으로 차이가 있다.
1. if-else
로 예상되는 잘못된 값 처리
if-else
는 예측 가능한 잘못된 입력을 방지하기 위해 사용한다. 예를 들어, 사용자가 입력한 값이 특정 조건을 만족하는지 확인하고 적절한 조치를 취하는 방식이다.
✅ 예제 1: 사용자 입력 검증
import java.util.Scanner;
public class IfElseExample {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
System.out.print("나이를 입력하세요: ");
if (scanner.hasNextInt()) { // 숫자인지 검증
int age = scanner.nextInt();
if (age >= 0 && age <= 150) { // 나이 범위 검증
System.out.println("입력한 나이: " + age);
} else {
System.out.println("잘못된 나이입니다.");
}
} else {
System.out.println("숫자를 입력해야 합니다.");
}
scanner.close();
}
}
✅ 실행 결과
나이를 입력하세요: abc
숫자를 입력해야 합니다.
나이를 입력하세요: 200
잘못된 나이입니다.
나이를 입력하세요: 25
입력한 나이: 25
이처럼 if-else
는 예상할 수 있는 문제(범위 벗어난 값, 잘못된 데이터 타입 등)를 미리 체크하고 처리하는 용도로 사용했다.
2. try-catch
로 예외 처리
예외 처리는 예상하지 못한 오류를 방지하고 프로그램이 강제 종료되지 않도록 하는 역할을 했다.
예를 들어, 숫자로 변환할 수 없는 값을 Integer.parseInt()
로 변환하면 NumberFormatException
이 발생할 수 있다.
이런 경우, try-catch
를 사용하면 프로그램이 멈추지 않고 정상적으로 실행될 수 있도록 했다.
✅ 예제 2: 예외 처리 적용
import java.util.Scanner;
public class TryCatchExample {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
System.out.print("나이를 입력하세요: ");
try {
int age = Integer.parseInt(scanner.nextLine()); // 숫자로 변환 시도
if (age >= 0 && age <= 150) {
System.out.println("입력한 나이: " + age);
} else {
System.out.println("잘못된 나이입니다.");
}
} catch (NumberFormatException e) {
System.out.println("숫자를 입력해야 합니다.");
}
scanner.close();
}
}
✅ 실행 결과
나이를 입력하세요: abc
숫자를 입력해야 합니다.
나이를 입력하세요: 200
잘못된 나이입니다.
나이를 입력하세요: 25
입력한 나이: 25
이처럼 try-catch
는 if-else
로 예상되는 잘못된 값을 처리하는 것과 예외를 처리하는 것은 개념적으로 차이가 있다.
3. 좀 더 복잡한 경우 ex.파일 읽기
이제 조금 더 복잡한 예외 처리를 보겠다.
파일을 읽을 때는 if-else
로 파일이 존재하는지 미리 확인할 수도 있지만,
파일이 갑자기 삭제되거나, 권한이 없어서 접근할 수 없는 등의 예상할 수 없는 오류가 발생할 수 있다.
이런 경우 try-catch
를 사용하면 안전하게 예외를 처리할 수 있다.
✅ 예제 3: 파일 읽기 (try-catch
적용)
import java.io.File;
import java.io.FileNotFoundException;
import java.util.Scanner;
public class FileReadExample {
public static void main(String[] args) {
File file = new File("data.txt");
if (!file.exists()) {
System.out.println("파일이 존재하지 않습니다.");
return;
}
try {
Scanner fileScanner = new Scanner(file);
while (fileScanner.hasNextLine()) {
System.out.println(fileScanner.nextLine());
}
fileScanner.close();
} catch (FileNotFoundException e) {
System.out.println("파일을 찾을 수 없습니다: " + e.getMessage());
}
}
}
✅ 실행 결과
파일이 존재하지 않습니다.
혹은, 파일이 존재하지만 접근할 수 없을 경우:
파일을 찾을 수 없습니다: data.txt (No such file or directory)
이처럼 파일 관련 작업에서는 단순한 if-else
체크로는 부족하고,
파일이 존재하더라도 접근 권한이 없거나, 다른 프로그램이 파일을 점유하고 있는 경우 등의 예측할 수 없는 문제를 대비하기 위해 예외 처리가 필요하다.
4. 언제 if-else
를 쓰고, 언제 예외 처리를 해야 할까?
- 예상 가능한 문제(비즈니스 로직 관련된 문제)는
if-else
로 처리하는 게 좋음- 예: 사용자가 나이를 입력할 때 음수인지 확인 (
if age < 0: return "잘못된 나이입니다."
)
- 예: 사용자가 나이를 입력할 때 음수인지 확인 (
- 예상치 못한 오류(시스템적인 문제)는
try-catch
로 처리하는 게 좋음- 예: 파일이 존재하지 않을 때(
FileNotFoundError
), 네트워크 오류 등
- 예: 파일이 존재하지 않을 때(
즉, 예외 처리는 "정상적인 흐름"을 제어하는 용도가 아니라, "비정상적인 상황"을 복구하기 위한 용도다.
만약 단순한 검증이라면 if-else
가 적합하고, 다양한 예외 상황을 다뤄야 한다면 try-catch
를 쓰는 게 좋다.
상황 | if-else 사용 |
try-catch 사용 |
---|---|---|
사용자가 0~5 사이 숫자를 입력해야 하는 경우 | ✅ (값을 미리 검증) | ❌ (예외 처리할 필요 없음) |
입력이 숫자가 아닐 가능성이 있는 경우 | ❌ (미리 검증 어렵) | ✅ (NumberFormatException 처리) |
배열 인덱스 접근 (arr[index] ) |
❌ | ✅ (IndexOutOfBoundsException 처리) |
파일을 열거나 네트워크 요청을 할 때 | ❌ (예측 불가) | ✅ (FileNotFoundException , IOException 처리) |
DB에 접근하거나 API 호출 시 오류 발생 가능 | ❌ | ✅ (SQLException , IOException 처리) |
3줄 요약
if-else
: 정상적인 흐름을 유지하기 위한 조건 검사,
try-catch
는 비정상적인 상황을 대비하여 프로그램이 멈추지 않도록 하기 위한 예외 처리라는 차이가 있다.
'Language > Java' 카테고리의 다른 글
[Java] 스트림 (0) | 2025.03.17 |
---|---|
[Java] 제네릭(Generic) (0) | 2025.03.06 |
[Java] 기본형과 참조형 (0) | 2025.03.06 |
[Java] 익명 클래스 (Annoymous Class)와 람다 (Lamda) (0) | 2025.03.05 |
[Java] 컬렉션 (Collection) (0) | 2025.03.04 |