코딩/sparta TIL

TIL 37 : Optional, 람다식, instanceof

americanoallday 2025. 4. 24. 12:52

 

💡 instanceof가 뭐야?

👉 instanceof는 자바에서 객체의 타입을 판별하는 키워드!

if (object instanceof String) { ... }

이건 말 그대로:

“이 object가 String 타입인지 확인해줘” 라는 뜻.

 

☕️ Optional이란?

👉 “값이 있을 수도, 없을 수도 있는 경우”를 안전하게 처리하는 자바 객체

Optional<User> user = userRepository.findByEmail(email);
  • 이건 null 대신 Optional로 감싼 User
  • 값이 있을 수도 있고 (isPresent()), 없을 수도 있음 (isEmpty())

 

✅ 왜 Optional을 쓸까?

전통 방식 (NullPointerException 위험)

User user = userRepository.findByEmail(email);  // null 가능
if (user.isDeleted()) { ... }  // ❌ NPE 위험

 

 

Optional 방식

userRepository.findByEmail(email)
    .ifPresent(user -> {  // ✅ 안전
        if (user.isDeleted()) { ... }
    });

 

📌 장점

  • NPE 방지
  • 명시적인 값 체크 (isPresent(), orElse(), orElseThrow() 등)
  • 함수형 API와 잘 어울림

 

🎯 Optional 자주 쓰는 메서드

메서드 설명
isPresent() 값이 있으면 true
isEmpty() 값이 없으면 true
orElse(default) 값이 없으면 디폴트 리턴
orElseThrow() 없으면 예외 던짐
map() 값이 있으면 변환
filter(predicate) 조건 만족할 때만 유지
ifPresent(consumer) 값이 있으면 실행

 

 

⚡️ 람다식(Lambda)이란?

👉 자바에서 “함수를 변수처럼” 다루기 위한 문법

(매개변수) -> { 실행문 }

 

🎯 람다 자주 쓰는 곳

어디서? 예시
forEach() 리스트 순회
filter(), map() Stream, Optional
Comparator, 정렬 컬렉션 정렬 기준

 

 

✅ 예시

List<String> names = List.of("Eunji", "Yujin", "Minjae");

names.stream()
    .filter(name -> name.startsWith("Y"))
    .forEach(name -> System.out.println(name));

👉 filter(...) 안에 들어간 name -> name.startsWith("Y")가 람다식!

 

 

✨ 정리

개념 한 줄 요약
Optional 값이 있을 수도 없을 수도 있는 객체. NPE 방지용
람다식 실행할 코드 블록을 간단히 표현한 문법
메서드 참조 user -> user.isDeleted()User::isDeleted 처럼 표현 축약

 

 

 

✅ 예시 2

userRepository.findByEmail(requestDto.getEmail())
    .filter(User::isDeleted)
    .ifPresent(user -> {
        throw new UserException(UserErrorCode.USER_ALREADY_DELETED);
    });
“이메일로 유저를 찾고, 그 유저가 삭제 상태(true)이면 USER_ALREADY_DELETED 예외를 던져라.”

 

.filter(User::isDeleted)

filter(...)Optional 안의 값이 조건을 만족할 때만 남겨두는 메서드

 

User::isDeleted

메서드 참조, user -> user.isDeleted() 를 짧게 쓴 문법

해당 유저가 삭제된 경우(true)만 통과시킴

 

.ifPresent(user -> { ... })

필터 통과 후, Optional 안에 유저가 존재한다면 실행
여기서 userfilter를 통과한 유저 객체, 이 블록 안에서 예외를 던짐

 

User -> 어디에 선언된 변수인가

user람다 함수의 매개변수 Optional<User> 안에 값이 있을 때, 그 값을 꺼내서 user라는 이름으로 쓰는 것.
마치 이런 느낌

Optional<User> opt = ...;
if (opt.isPresent()) {
    User user = opt.get();
    ...
}

 

'코딩 > sparta TIL' 카테고리의 다른 글

TIL 38 : AOP  (0) 2025.04.24
TIL 36 : EntityManagerFactory, EntityManager, EntityTransaction  (1) 2025.04.16
TIL 35 : 예외처리 복습  (1) 2025.04.15
TIL 34 : HttpMessageConverter  (0) 2025.04.15
Paging 공부중  (0) 2025.04.09