☕️ Java 문법 종합반 (3) - ①예외처리, Optional / TIL - day 14

하리비·2025년 3월 10일
0

☕️ Java

목록 보기
7/8

▪️ 예외와 예외처리 ▪️


📖 예외

프로그램 실행중 예상하지 못한 상황

📌 의도하지 않은 예외 (예상하지 못한 예외)

  • 개발자가 예측하지 못했거나, 예외 처리를 해두지 않아서 프로그램이 비정상 종료되는 경우
  • 사용자가 입력한 값이나 실행 중 상황에 따라 우연히 발생할 수도 있음
    ➡ 예를 들어 10/0 같은 경우, (내가 해당 예외를 예측하지 않았다는 가정하에)
    이 연산으로 인해 발생하는 예외는 내가 의도하지 않은 것임

📌 의도적인 예외 (내가 특정 조건에서 일부러 발생시킨 예외)

  • 개발자가 특정한 조건에서 예외를 발생시키도록 throw 를 사용한 경우
    ➡ 예를 들어, 미성년자의 접근등 비즈니스 규칙에 대한 예외상황을 정의해두고 제어하는 것 !

✔️ throw - 예외 발생시키기

  • throw new IllegalArgumentException 사용하기
  • 예시 ) 나이 제한이 있는 경우
    public class Main {
       public static void main(String[] args) {
           int age = 10;
           if (age < 18) {
    		        // ✅ 의도적으로 예외를 발생시키는 부분
               throw new IllegalArgumentException("미성년자는 접근할 수 없습니다!");
           }
           System.out.println("....");
       }
    }
  • 예외 발생 내용을 콘솔에서 알려준다 (가독성)


📖 예외의 구조와 종류

  • 예외의 구조

언체크드 - RuntimeException

  • 예외처리를 컴파일러가 확인하지 않는다 ➝ 예외처리 하지 않아도 컴파일 가능

체크드 - Exception

  • 예외처리를 컴파일러가 확인한다 ➝ 예외처리하지 않으면 컴파일 오류 발생
    🌟 반드시 예외 처리를 해야한다 🌟

💡 예외의 전파

상위 메서드로 계속 퍼져서 프로그램 시작지점 메인까지 도달하게된다!
끝내 처리만 되면 프로그램은 종료되지 않을 것. (메인에서 처리해도 된다는 말)


📖 예외 처리

❎ UncheckedException

  • RuntimeException 을 상속받는 모든 예외는 UncheckedException 이다
  • 예외처리를 하지 않으면 비정상적인 결과가 나오거나 프로그램이 종료될 수 있다

    1️⃣ RuntimeException() 으로 ExceptionPractice를 예외 상황으로 가정.

    2️⃣ 처리하지 않는 경우 - 언체크 예외가 호출되고 나면 예외가 발생하고, 실행되지 않는다

    3️⃣ 예외 처리 - 이 예시에서는 main에서 try-catch로 모든 예외를 처리해주고 있다

    • 예외는 전파되기에 메인에서 잡아줘도 된다!
    • try문 안에서 if문을 사용하고, throw new RuntimeException();을 통해 특정 조건에서 예외를 발생시킬 수 있다

✅ CheckedException

  • Exception 클래스를 직접 상속받는 모든 예외는 CheckedException이다
    ( RuntimeException을 상속받는 예외 제외 )
  • 예외처리는 필수, 하지 않으면 컴파일 오류
    ① 바로 try-catch를 사용한다
    throws로 다른 클래스에 책임을 전가 후에 처리한다

    1️⃣ Exception() 으로 callCheckedException를 예외 상황으로 가정.
    아직 처리되기 전이므로 컴파일 오류(빨간줄) 발생 !

    2️⃣ 예외 처리 - 이번에는 예외 객체를 생성후에 처리했다!

📌 throw와 throws의 차이

1️⃣ throw예외를 "직접" 발생시키는 키워드

개발자가 특정한 조건에서 예외를 발생시킬 때 사용
throw new 예외클래스명("예외 메시지") 형태로 사용

📌 예제 (throw로 직접 예외 발생)

public class Example {
    public static void main(String[] args) {
        int age = 10;
        if (age < 18) {
            throw new IllegalArgumentException("미성년자는 접근할 수 없습니다!"); // 예외 발생
        }
        System.out.println("정상 실행됨");
    }
}

throw즉시 예외를 발생시키고 프로그램을 중단시킴
✔ 특정한 조건에서 "잘못된 입력이 들어왔다!" 하고 예외를 던지는 역할


2️⃣ throws메서드에서 "예외를 던질 수 있다"고 선언

메서드가 예외를 직접 처리하지 않고, 호출한 곳에서 처리하도록 예외를 넘기는 역할
throws 예외클래스명 형태로 메서드 선언부에 사용

📌 예제 (throws를 사용해 예외를 호출한 곳에서 처리)

public class Example {
    // 메서드에서 예외를 던질 수 있다고 선언
    public static void checkAge(int age) throws IllegalArgumentException {
        if (age < 18) {
            throw new IllegalArgumentException("미성년자는 접근할 수 없습니다!");
        }
    }

    public static void main(String[] args) {
        try {
            checkAge(10); // 메서드 호출 → 예외 발생 가능
        } catch (IllegalArgumentException e) {
            System.out.println("예외 발생: " + e.getMessage());
        }
    }
}

throws메서드가 예외를 직접 처리하지 않고, 예외를 던질 수 있다고 알리는 것
✔ 호출한 main() 메서드에서 try-catch로 예외를 처리


📍 throwthrows 같이 쓰는 예제

throws로 예외를 넘기고, throw로 예외를 발생시키는 코드

public class Example {
    // throws로 예외를 넘길 수 있다고 선언
    public static void checkNumber(int num) throws IllegalArgumentException {
        if (num < 0) {
            throw new IllegalArgumentException("음수는 허용되지 않습니다!"); // throw로 예외 발생
        }
        System.out.println("정상적인 숫자입니다: " + num);
    }

    public static void main(String[] args) {
        try {
            checkNumber(-5); // 메서드 호출 → 예외 발생 가능
        } catch (IllegalArgumentException e) {
            System.out.println("예외 처리: " + e.getMessage());
        }
    }
}

throwIllegalArgumentException실제 발생시키는 역할
throwscheckNumber(int num) 메서드가 예외를 던질 수 있다는 걸 선언하는 역할


throw 🆚 throws 비교 요약

구분throwthrows
역할예외를 "직접" 발생시킴메서드에서 예외를 "던질 수 있음"을 선언
사용 위치메서드 내부에서 사용메서드 선언부에서 사용
사용 방식throw new 예외클래스명("메시지");메서드명() throws 예외클래스명
처리 방식예외를 즉시 발생시키고 프로그램 중단호출한 곳에서 예외를 처리해야 함
  • 예외를 던질 때 👉 throw
  • 메서드에서 넘길때는 👉 throws

▪️ Optional ▪️


📖 Optional

  • null을 안전하게 다루게 해주는 객체이다! ➝ 관련 예외인 *NullPointerException 을 방지
  • Optional 객체는 값이 있을 수도 있고 없을 수도 있는 컨테이너다!

💡 NullPointerException (언체크드 예외)

  • 단순 값이 없을 때보다도, 없는 객체의 메서드를 사용할 때 발생!
  • 컴파일러가 확인해주지 않기 때문에 미리 예외 처리 해둬야함
    -> if문 을 활용해 논리적으로 예외를 잡을 수도 있지만,,! 하나씩 언제 다해?????

📌 Optional 활용하기

1️⃣ ofnullable

  • 🌟ofnullable로 null이 담길 가능성이 있는 데이터를 감싸서 메서드에 넣자!🌟
  • 이 메서드를 사용하게 되면 Optional 객체가 생성되므로, "어쩌면 null 값이 있을 수도 있겠다!"
    ➝ 가독성 높아짐


2️⃣ isPresent()

  • Optional이 비었는지 아닌지 알 수 있다!

  • True = 안 비었음 , False = 비어있음


3️⃣ get()

  • Optional 안의 값들을 꺼내준다

💡 Optional 사용 예시

  • student가 null이 아닌 경우 안전하게 가져오고, 게터 사용
  • student가 null인 경우 메세지 출력
public class Main {
    public static void main(String[] args) {
        Camp camp = new Camp();

        //  Optional 객체 반환받음
        Optional<Student> studentOptional = camp.getStudent();// Optional 객체의 기능 활용
        boolean flag = studentOptional.isPresent(); // ✅false 반환
        if (flag) {
            // 존재할 경우
            Student student = studentOptional.get(); // ✅ 안전하게 Student 객체 가져오기
            String studentName = student.getName();
            System.out.println("studentName = " + studentName);

        } else {
            // null 일 경우
            System.out.println("학생이 없습니다.");
        }
    }
}

0개의 댓글