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<T>
옵셔널(Optional)은 NPE(NullPointerException) 문제를 해결하는 데 사용될 수 있다.
옵셔널을 쓰게 되면 값이 있을 수도 있고 없을 수도 있다는 것을 명확하게 타입으로 알려주게 된다.