Checked vs Unchecked 에러
Coddy Java 여정의 객체 지향 프로그래밍 섹션에 포함된 레슨 — 87개 중 61번째.
Java의 예외 계층 구조가 여러 분기로 나뉜다는 것을 확인했습니다. 이해해야 할 핵심적인 차이점은 checked 예외와 unchecked 예외 사이의 구분입니다. 이는 코드에서 예외를 처리해야 하는 방식에 영향을 미칩니다.
체크 예외(Checked exceptions)는 컴파일러가 처리를 강제하는 예외입니다. 이들은 RuntimeException을 거치지 않고 Exception을 직접 상속합니다. 반드시 이를 catch하거나 throws를 사용하여 선언해야 합니다:
// IOException을 처리해야 합니다 - 체크 예외(checked exception)입니다
public void readFile(String path) throws IOException {
FileReader reader = new FileReader(path); // IOException이 발생할 수 있습니다
}
// 또는 catch 문으로 처리합니다
public void readFileSafe(String path) {
try {
FileReader reader = new FileReader(path);
} catch (IOException e) {
System.out.println("File error: " + e.getMessage());
}
}비검사 예외(Unchecked exceptions)는 RuntimeException을 상속합니다. 컴파일러는 이를 처리하도록 요구하지 않으며, 이들은 일반적으로 null 참조나 잘못된 배열 접근과 같은 프로그래밍 오류를 나타냅니다:
// throws 선언이 필요하지 않습니다.
public int divide(int a, int b) {
return a / b; // ArithmeticException이 발생할 수 있습니다 (unchecked)
}
String name = null;
name.length(); // NullPointerException (unchecked)사용자 정의 예외를 생성할 때, 호출자가 이를 어떻게 처리하기를 원하는지에 따라 부모 클래스를 선택하세요. 호출자가 예상해야 하는 복구 가능한 조건에는 확인된 예외(checked exceptions)를 사용하세요. 올바른 코드에서 발생하지 않아야 하는 프로그래밍 오류에는 미확인 예외(unchecked exceptions)를 사용하세요.
챌린지
쉬움체크 예외(checked exception)와 언체크 예외(unchecked exception)의 핵심적인 차이점을 보여주는 나이 확인 시스템을 만들어 봅시다! 두 가지 유형의 사용자 정의 예외를 생성하고 컴파일러가 이를 어떻게 다르게 처리하는지 확인해 볼 것입니다.
코드는 다음 네 개의 파일로 구성됩니다:
InvalidAgeException.java: 나이 검증 실패를 위한 체크 예외를 생성합니다. 이 예외는Exception을 직접 상속받아야 하며, 이는 호출자가 반드시 이 예외를 처리해야 함을 의미합니다. 메시지를 받아 부모 클래스로 전달하는 생성자를 포함하세요.NegativeAgeException.java: 음수 나이가 입력되었을 때(올바른 입력이라면 발생하지 않아야 할 프로그래밍 오류)를 위한 언체크 예외를 생성합니다. 이 클래스는RuntimeException을 상속받아야 합니다. 메시지를 받아 부모 클래스로 전달하는 생성자를 포함하세요.AgeVerifier.java: 두 예외 유형을 모두 사용하여 나이를 검증하는 클래스를 생성합니다. 다음 두 개의 정적 메서드를 포함하세요:verifyAge(int age)- 이 메서드는 나이가 0보다 작으면"Age cannot be negative: " + age메시지와 함께NegativeAgeException(언체크)을 던져야 합니다. 나이가 18보다 작으면"Must be 18 or older: " + age메시지와 함께InvalidAgeException(체크)을 던집니다. 그 외의 경우에는"Age " + age + " verified successfully"를 출력합니다. 이 메서드는 체크 예외를 던지므로, 반드시throws InvalidAgeException을 선언해야 합니다.verifyAgeUncheckedOnly(int age)- 이 메서드는 언체크 예외만 사용합니다. 나이가 음수이면 동일한 메시지 형식으로NegativeAgeException을 던집니다. 나이가 18보다 작으면"Too young: " + age메시지와 함께IllegalArgumentException을 던집니다. 그 외의 경우에는"Age " + age + " verified (unchecked method)"를 출력합니다. 이 메서드는throws선언이 필요 없다는 점에 주목하세요!Main.java: 검증 시스템을 하나로 합칩니다! 하나의 입력으로 나이(정수)를 받게 됩니다.먼저,
"=== Checked Exception Method ==="를 출력하고 입력받은 나이로verifyAge를 호출합니다. 체크 예외를 던지므로 반드시 try-catch로 감싸야 합니다.InvalidAgeException을 캐치하여"Checked exception caught: " + e.getMessage()를 출력하세요. 또한NegativeAgeException을 캐치하여"Unchecked exception caught: " + e.getMessage()를 출력하세요.그 다음 빈 줄 하나와
"=== Unchecked Exception Method ==="를 출력합니다. 동일한 나이로verifyAgeUncheckedOnly를 호출합니다. 이 메서드는 예외를 던질 수 있지만, 반드시 캐치할 필요는 없습니다. 하지만 오류를 우아하게 처리하기 위해 try-catch로 감싸세요.NegativeAgeException을 캐치하여"Runtime exception caught: " + e.getMessage()를 출력합니다.IllegalArgumentException을 캐치하여"Illegal argument caught: " + e.getMessage()를 출력합니다.
입력값으로는 검증할 나이를 나타내는 정수 하나를 받게 됩니다.
핵심적인 차이점을 확인하세요: 체크 예외가 있는 메서드는 throws 선언이 필요하며 호출자가 이를 처리하도록 강제하는 반면, 언체크 메서드는 예외 처리 없이도 컴파일이 잘 됩니다. 이것이 Java에서 체크 예외와 언체크 예외의 근본적인 차이점입니다!
치트 시트
Java 예외는 checked 예외와 unchecked 예외로 나뉘며, 이는 컴파일러가 예외 처리를 강제하는 방식을 결정합니다.
Checked 예외는 Exception을 직접 상속합니다 (RuntimeException을 거치지 않음). 컴파일러는 사용자가 이를 직접 catch하거나 throws를 사용하여 선언하도록 강제합니다:
// throws로 선언해야 함
public void readFile(String path) throws IOException {
FileReader reader = new FileReader(path);
}
// 또는 catch 처리
public void readFileSafe(String path) {
try {
FileReader reader = new FileReader(path);
} catch (IOException e) {
System.out.println("File error: " + e.getMessage());
}
}Unchecked 예외는 RuntimeException을 상속합니다. 컴파일러는 이를 처리하도록 요구하지 않습니다. 이들은 주로 프로그래밍 오류를 나타냅니다:
// throws 선언이 필요 없음
public int divide(int a, int b) {
return a / b; // ArithmeticException 발생 가능 (unchecked)
}
String name = null;
name.length(); // NullPointerException (unchecked)사용자 정의 예외를 만들 때는 호출자가 이를 어떻게 처리해야 하는지에 따라 부모 클래스를 선택하세요:
- 호출자가 예상해야 하는 복구 가능한 조건에는 checked 예외(
Exception상속)를 사용하세요 - 올바른 코드에서 발생하지 않아야 하는 프로그래밍 오류에는 unchecked 예외(
RuntimeException상속)를 사용하세요
직접 해보기
import java.util.Scanner;
class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int age = scanner.nextInt();
// TODO: checked exception 메서드 테스트
// 출력: "=== Checked Exception Method ==="
// try-catch 문에서 AgeVerifier.verifyAge(age) 호출
// - InvalidAgeException 캐치: "Checked exception caught: [message]" 출력
// - NegativeAgeException 캐치: "Unchecked exception caught: [message]" 출력
// TODO: 빈 줄을 하나 출력한 후, "=== Unchecked Exception Method ===" 출력
// try-catch 문에서 AgeVerifier.verifyAgeUncheckedOnly(age) 호출
// - NegativeAgeException 캐치: "Runtime exception caught: [message]" 출력
// - IllegalArgumentException 캐치: "Illegal argument caught: [message]" 출력
}
}
이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.
객체 지향 프로그래밍의 모든 레슨
4상속
상속의 기초 (extends)super 키워드메서드 오버라이딩 (@Override)생성자 체이닝Object 클래스단일 및 다중 레벨 상속다중 클래스 상속이 불가능한 이유요약 - 직원 계층 구조