회사 코드 보다가 리턴 타입이 Optional<User> 이렇게 되어 있는 걸 봤는데요, 이게 왜 필요한지 잘 모르겠어요. 그냥 User 리턴하고 없으면 null 주면 되는 거 아닌가 싶어서요.


제가 기존에 쓰던 방식은 이거였거든요.


User u = findUser(id);
if (u != null) {
    System.out.println(u.getName());
}


근데 Optional 쓰면 이런 식으로 쓰던데요.


findUser(id).ifPresent(u -> System.out.println(u.getName()));


솔직히 둘이 하는 일은 똑같아 보여요. 오히려 Optional은 감싸고 벗기고 하는 게 더 귀찮은 느낌인데, 이걸 쓰면 NullPointerException(널 참조 예외)이 안 난다는 게 무슨 말인지 잘 이해가 안 돼요. Optional도 결국 안에 값이 없을 수 있는 거잖아요. 그리고 optional.get() 이거 그냥 쓰면 안 된다고 하던데 그럼 대체 어떻게 값을 꺼내 쓰라는 건지도 모르겠고요. 실무에서 이걸 리턴 타입으로 쓰는 이유가 뭔지 좀 쉽게 설명해주실 분 계실까요.