본문 바로가기
Language/Java

[JAVA] Java7 multi-catch란? 코드 다이어트의 핵심

by Papa Martino V 2026. 1. 20.
728x90

Java7 multi-catch
Java7 multi-catch

 

자바 개발을 하다 보면 여러 종류의 예외를 처리해야 할 때가 많습니다. Java 7 이전에는 각 예외마다 별도의 catch 블록을 작성해야 했기에 코드가 길어지고 가독성이 떨어지는 고질적인 문제가 있었습니다. 이를 해결하기 위해 등장한 혁신적인 기능이 바로 'multi-catch' 블록입니다. 오늘은 multi-catch가 왜 등장했는지, 어떻게 사용하는지, 그리고 사용 시 반드시 주의해야 할 기술적 제약사항은 무엇인지 전문적인 시각에서 심도 있게 분석해 보겠습니다.

1. Multi-catch의 등장 배경

과거에는 서로 다른 예외임에도 불구하고 예외 처리 로직(로그 기록, 알림 등)이 동일한 경우가 많았습니다. 개발자들은 어쩔 수 없이 동일한 코드를 복사해서 붙여넣거나, 아니면 모든 예외의 부모인 Exception 클래스로 한 번에 묶어서 처리하곤 했습니다. 하지만 Exception으로 묶는 것은 구체적인 예외 처리를 방해하는 안티 패턴으로 간주되었습니다. Multi-catch는 이러한 코드 중복정밀한 예외 처리 사이의 간극을 메우기 위해 도입되었습니다.

2. Multi-catch 사용법과 문법

사용 방법은 매우 직관적입니다. catch 블록 내에서 처리하고 싶은 예외 클래스들을 파이프 기호( | )로 구분하여 나열하면 됩니다.

try {
    // 예외 발생 가능 코드
} catch (IOException | SQLException e) {
    // 두 예외 모두 이 블록에서 처리
    e.printStackTrace();
}

3. 기존 방식 vs Multi-catch 방식 비교 요약

두 방식의 차이점을 명확하게 이해하기 위해 표로 정리해 보았습니다.

구분 Java 7 이전 (기존 방식) Java 7 이후 (Multi-catch)
코드 길이 예외마다 블록이 필요하여 길어짐 하나의 블록으로 해결되어 간결함
코드 중복 동일 로직 반복 작성 (Copy & Paste) 로직을 한 번만 작성하여 관리 용이
변수 속성 변수 재할당 가능 변수 e는 implicitly final (재할당 불가)
가독성 낮음 (보일러플레이트 코드 과다) 높음 (핵심 로직에 집중 가능)

4. 결정적인 주의사항: 상속 관계 금지

Multi-catch를 사용할 때 범하는 가장 흔한 실수는 부모-자식 관계에 있는 예외를 동시에 나열하는 것입니다. 예를 들어 catch (FileNotFoundException | IOException e)와 같은 코드는 컴파일 에러를 유발합니다. IOException이 이미 FileNotFoundException을 포함하고 있기 때문에 나열하는 의미가 없기 때문입니다.

5. Sample Example: 실무 적용 사례

전형적인 DB 연결 및 파일 처리 예제

public void processData() {
    try {
        // DB 연결 및 파일 읽기 로직
        Class.forName("com.mysql.jdbc.Driver");
        DriverManager.getConnection("jdbc:mysql://localhost/test");
        new java.io.FileReader("config.txt");

    } catch (ClassNotFoundException | SQLException | IOException e) {
        // 서로 다른 성격의 예외지만 공통적인 로그 처리가 필요한 경우
        logger.error("데이터 처리 중 장애 발생: " + e.getMessage());
        // 주의: e는 final이므로 e = new Exception(); 과 같은 재할당은 불가합니다.
    }
}
    

6. 전문가의 제언: Multi-catch는 언제 사용해야 하는가?

Multi-catch는 단순히 코드를 줄이기 위한 도구가 아닙니다. "예외의 종류는 다르지만, 시스템의 대응 방식이 동일할 때" 사용하는 것이 가장 이상적입니다. 만약 각 예외마다 사용자에게 전달해야 하는 메시지가 다르거나 복구 프로세스가 상이하다면, 가독성이 조금 떨어지더라도 개별 catch 블록을 유지하는 것이 설계적으로 더 우수합니다.


내용 출처:
- Oracle Java SE Documentation: Catching Multiple Exception Types and Rethrowing Exceptions with Improved Type Checking
- Java SE 7 Language Changes (Project Coin)
- Effective Java 3rd Edition by Joshua Bloch (Item 9, 72)

728x90