Day 14 자바 객체 지향 연습

정채림·2026년 1월 21일

예외 처리

public class Main {

    public static void main(String[] args) {

        int ticketPrice = 100_000; // 티켓값
        int myFanPower = 50_000;   // 내돈

        // Bad Case - return으로 막는 경우
        boolean isSuccess = buyTicketLegacy(myFanPower, ticketPrice);

        if (isSuccess) {
            // 결제창으로 전환
            System.out.println("결제를 진행합니다.");
        } else {
            System.out.println("돈을 더 모아오세요");
        }

        System.out.println("===========");

        System.out.println("Good Case - throw로 실패를 알리는 경우");
        
        buyTicket(myFanPower, ticketPrice);

        System.out.println("결제를 진행합니다.");
    }

    // 실패하면 에러를 던지는 방식
    private static void buyTicket(int myFanPower, int ticketPrice) {
        if (myFanPower < ticketPrice) {
            throw new RuntimeException("팬심이 부족합니다.");
        }
        System.out.println("예매 성공!!");
    }

    /**
     * 티켓을 구매하는 기능
     * @param myFanPower - 팬심(돈)
     * @param ticketPrice - 실제 티켓 가격
     * @return 구매 성공 실패를 논리로 리턴
     */
    private static boolean buyTicketLegacy(int myFanPower, int ticketPrice) {
        if (myFanPower < ticketPrice) {
            System.out.println("팬심이 부족합니다.");
            return false;
        }
        return true;
    }
}
public class IdolRepository {
    private static Map<String, Idol> db = new HashMap<>();

    static {
        db.put("wonyoung", new Idol("장원영", "IVE"));
        db.put("karina", new Idol("카리나", "Aespa"));
    }

    // 1. 고전적인 방식 (값이 없으면 null 리턴)
    // ⚠️ 위험: 사용하는 쪽에서 null 체크를 까먹으면 펑! (NullPointerException)
    public Idol findByNameLegacy(String name) {
        return db.get(name);
    }

    // 2. 요즘 방식 (Optional 리턴)
    // ✅ 안전: "값이 없을 수도 있다"고 명시적으로 알려줌.
    public Optional<Idol> findByNameOptional(String name) {
        // ofNullable: null이면 empty, 아니면 그 값을 감싼 Optional 반환
        return Optional.ofNullable(db.get(name));
    }
}

Optional

Optional<T>

옵셔널(Optional)은 NPE(NullPointerException) 문제를 해결하는 데 사용될 수 있다.

옵셔널을 쓰게 되면 값이 있을 수도 있고 없을 수도 있다는 것을 명확하게 타입으로 알려주게 된다.

  • ifPresent : 값이 있으면 실행
  • orElse : 값이 없으면 기본값 제공
  • orElseThrow : 값이 없으면 에러 처리

0개의 댓글