예외처리가 필요한 이유 - 반환 값으로 예외 처리

SungMin·2026년 6월 1일

자바 심화 정리

목록 보기
24/34
package exception.ex1;

public class NetworkServiceV1_2 {
    public void sendMessage(String data) {
        String address = "http://example.com";
        NetworkClientV1 client = new NetworkClientV1(address);
        client.initError(data); // 추가

        String connectResult = client.connect();
        if (isError(connectResult)) {
            System.out.println("[네트워크 오류 발생] 오류코드: " + connectResult);
            return;
        }

        String sendResult = client.send(data);
        if (isError(sendResult)) {
            System.out.println("[네트워크 오류 발생] 오류코드: " + sendResult);
            return;
        }
        client.disconnnect();
    }

    private boolean isError(String connectResult) {
        return !connectResult.equals("success");
    }
}
  • NetworkService는 NetworkClient를 사용하는 전체 흐름을 관리한다.
  • 오류가 발생한 경우 오류 코드를 출력한다.

package exception.ex1;

import java.util.Scanner;

public class MainV1 {
    public static void main(String[] args) {
//        NetworkServiceV1_1 networkServiceV0 = new NetworkServiceV1_1();
//        NetworkServiceV1_2 networkServiceV0 = new NetworkServiceV1_2();
        NetworkServiceV1_3 networkServiceV0 = new NetworkServiceV1_3();
        Scanner scanner = new Scanner(System.in);

        while (true) {
            System.out.print("전송할 문자: ");
            String input = scanner.nextLine();

            if (input.equals("exit")) {
                break;
            }

            networkServiceV0.sendMessage(input);
            System.out.println();
        }
        System.out.println("프로그램을 정상 종료합니다.");
    }
}
  • connect()가 실패한 경우 send()를 호출하면 안된다.
  • 사용 후에는 반드시 disconnect()를 호출해야 한다.

참고

자바의 경우 GC가 있기 때문에 JVM 메모리에 있는 인스턴스를 자동으로 해제할 수 있다.
하지만 외부 연결과 같은 자바의 외부 자원은 자동으로 해제되지 않는다.
따라서, 외부 자원을 사용한 후에는 연결을 해제하여 외부 자원을 반납해야한다.


package exception.ex1;

public class NetworkServiceV1_3 {
    public void sendMessage(String data) {
        String address = "http://example.com";
        NetworkClientV1 client = new NetworkClientV1(address);
        client.initError(data); // 추가

        String connectResult = client.connect();
        if (isError(connectResult)) {
            System.out.println("[네트워크 오류 발생] 오류코드: " + connectResult);
            return;
        } else {
            String sendResult = client.send(data);
            if (isError(sendResult)) {
                System.out.println("[네트워크 오류 발생] 오류코드: " + sendResult);
                return;
            }
        }
        client.disconnnect();
    }

    private boolean isError(String connectResult) {
        return !connectResult.equals("success");
    }
}

현재 해당 코드들을 보면 정상 흐름, 예외 흐름이 잘 구분이 되어 있지 않다.
코드 해석도 어렵고 심지어 예외 흐름의 코드가 훨씬 많다.

어떻게 하면 정상흐름과 예외흐름을 구분할 수 있을까?
지금과 같이 반환값을 사용해서 예외 처리를 하는 방식으로는 해결할 수 없을 것이다.
이런 문제를 해결하기 위해 예외 매커니즘이 존재한다.


[정리]

  • 반환값을 이용한 오류 처리 방식은 호출할 때마다 오류 여부를 확인해야 한다.
  • 정상 흐름과 오류 처리 흐름이 섞여 코드의 가독성이 떨어진다.
  • 계층이 깊어질수록 오류 코드를 계속 전달해야 하므로 코드가 복잡해진다.
  • 자바는 이러한 문제를 해결하기 위해 예외(Exception) 메커니즘을 제공하며, 이를 통해 정상 흐름과 예외 흐름을 명확하게 분리할 수 있다.
profile
오늘도 한 걸음씩 나아가

0개의 댓글