CodeGym /행동 /JAVA 25 SELF /예외 처리 소개

예외 처리 소개

JAVA 25 SELF
레벨 11, 레슨 1
사용 가능

1. 예외 소개

간단한 비유로 시작해 봅시다. 여러분의 프로그램 — 이것을 도로를 달리는 자동차라고 생각해 보세요. 모든 것은 잘 돌아가지만, 어느 순간 예상치 못한 일이 벌어집니다: 타이어가 펑크 나거나, 연료가 바닥나거나, 엔진이 과열됩니다. 이 상황을 “처리”하지 않으면(예: 스페어 타이어를 끼우거나 주유하지 않으면) 자동차는 멈추고 더 이상 가지 못합니다. 프로그램도 마찬가지입니다. 예외를 처리하지 않으면 프로그램은 비정상 종료됩니다.

예외 (exception) — 프로그램 실행 중 어떤 문제가 발생했을 때 생성되는 객체입니다. 예외는 이렇게 알립니다: “정지! 뭔가 잘못됐습니다!”

예외가 발생하는 상황의 예:

  • 0으로 나누기 (10 / 0)
  • 존재하지 않는 배열 요소에 접근 시도 (arr[999])
  • 디스크에 없는 파일 열기
  • 문자열 "abc"를 숫자로 변환 (Integer.parseInt("abc"))

중요: 예외는 컴파일 오류(예: 코드 오타)가 아니라, 프로그램 실행 중에 발생하는 문제입니다.

왜 예외가 유용할까요?

  • 깨끗한 코드: 프로그램의 핵심 로직이 자잘한 검증 코드로 어지럽혀지지 않습니다.
  • 유연성: 오류를 중앙집중식으로 처리할 수 있습니다(예: 파일 읽기 오류를 한 곳에서 처리).
  • 신뢰성: 프로그램이 알 수 없는 메시지와 함께 ‘뚝’ 꺼지는 대신, 무엇이 발생했는지 알려 줍니다.

2. 예외 (Exceptions) vs 오류 (Errors)

Java에는 프로그램 실행 중에 발생할 수 있는 문제 유형이 크게 두 가지가 있습니다:

오류 (Errors)

오류 — Java 가상 머신(JVM) 자체의 동작 장애로 인해 발생하는 치명적이고 복구 불가능한 문제입니다. 보통 컴퓨터 자원이나 JVM 내부의 장애와 관련되어 있습니다.

오류의 예:

  • OutOfMemoryError — 메모리가 부족함.
  • StackOverflowError — 스택 오버플로(예: 무한 재귀).

중요: 이러한 오류는 보통 프로그램에서 처리하려고 하지 않는 것이 좋습니다.

예외 (Exceptions)

예외 — 프로그램이 대응할 수 있고(또는 해야 하는) 문제입니다. 프로그램 로직의 실수나 외부 요인(예: 사용자가 예상과 다른 값을 입력) 때문에 발생합니다.

예외의 예:

  • NullPointerException — null을 객체처럼 사용하려는 시도.
  • ArrayIndexOutOfBoundsException — 배열 범위를 벗어남.
  • IOException — 파일 작업 중 오류.

Java의 예외는 두 가지로 나뉩니다:

  • Checked exceptions (체크 예외) — 컴파일러가 처리를 요구합니다(예: IOException).
  • Unchecked exceptions (언체크 예외) — 컴파일러가 처리를 요구하지 않습니다(예: NullPointerException).

도식: 구조 한눈에 보기

graph TD
    Throwable --> Error
    Throwable --> Exception
    Exception --> RuntimeException
    Exception --> Checked["(기타 예외)"]

    style Throwable fill:#ffa64d,color:#000
    style Exception fill:#ffa64d,color:#000
    style Checked fill:#ffa64d,color:#000
    style Error fill:#ff4d4d,color:#fff
    style RuntimeException fill:#4dff88,color:#000

설명:

  • Throwable — Java의 오류와 예외 계층 구조의 루트입니다.
  • Error — JVM의 치명적 오류로, 처리하지 않습니다.
  • Exception — 처리할 수 있고 처리해야 하는 ‘일반적인’ 예외입니다.
  • RuntimeException — 언체크 예외(프로그래머 실수).

3. 코드에서는 어떻게 보이나요?

예제 1: 0으로 나누기

public class ExceptionDemo 
{
    public static void main(String[] args) 
    {
        int a = 10;
        int b = 0;
        int c = a / b; // 여기서 ArithmeticException이 발생합니다!
        System.out.println("결과: " + c);
    }
}

무슨 일이 일어날까요?
프로그램은 오류와 함께 종료되고, 다음과 같은 메시지가 출력됩니다:

Exception in thread "main" java.lang.ArithmeticException: / by zero
    at ExceptionDemo.main(ExceptionDemo.java:5)

예제 2: 존재하지 않는 배열 요소에 접근

int[] arr = {1, 2, 3};
System.out.println(arr[10]); // ArrayIndexOutOfBoundsException

예제 3: 파일 작업

import java.io.FileReader;
import java.io.IOException;

public class FileDemo 
{
    public static void main(String[] args) throws IOException 
    {
        FileReader reader = new FileReader("nofile.txt");     // FileNotFoundException (checked)
        int data = reader.read();
        System.out.println(data);
        reader.close();
    }
}

이제 이러한 예외 상황을 깔끔하게 처리하는 방법을 살펴보겠습니다.

1
과제
JAVA 25 SELF, 레벨 11, 레슨 1
잠금
조르그 계산기와 위대한 0으로의 나눗셈 🌌
조르그 계산기와 위대한 0으로의 나눗셈 🌌
1
과제
JAVA 25 SELF, 레벨 11, 레슨 1
잠금
배낭에서 존재하지 않는 크리스탈 찾기 🎒
배낭에서 존재하지 않는 크리스탈 찾기 🎒
1
과제
JAVA 25 SELF, 레벨 11, 레슨 1
잠금
플레이어 나이: "스물" 대신 20 🎮
플레이어 나이: "스물" 대신 20 🎮
1
과제
JAVA 25 SELF, 레벨 11, 레슨 1
잠금
비밀 요원 이름 없음 🤫
비밀 요원 이름 없음 🤫
코멘트
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION