code

[자바] Supplier

sinply 2025. 4. 9. 10:45
반응형
SMALL

🌱 자바의 Supplier,  이해해보기

개발을 하다 보면 “값을 나중에 계산하고 싶다”거나, “필요할 때만 어떤 작업을 수행하고 싶다”는 상황이 자주 생깁니다. 이런 경우 자바에서는 함수형 인터페이스인 Supplier<T>를 사용하면 깔끔하게 해결할 수 있어요.

이번 글에서는 자바의 Supplier<T>가 어떤 것인지, 어떻게 쓰는지, 언제 사용하면 좋은지 아주 쉽게 설명드릴게요. 코드 예제도 함께 보면서 확실하게 개념을 잡아봅시다.

✨ Supplier란?

Supplier<T>는 자바 8부터 제공되는 함수형 인터페이스(Function Interface) 중 하나입니다. 아주 단순한 인터페이스예요.

@FunctionalInterface
public interface Supplier<T> {
    T get();
}

🔍 쉽게 말하면?

“아무것도 받지 않고, 어떤 값을 반환하는 함수”

이게 바로 Supplier<T>의 정체입니다.

  • 입력값은 없고 (매개변수 없음)
  • 반환값만 있어요 (T 타입)

💡 간단한 예제

Supplier<String> helloSupplier = () -> "Hello, World!";
System.out.println(helloSupplier.get()); // 결과: Hello, World!
  • helloSupplierString 값을 주는 공급자입니다.
  • 이 공급자는 아무런 입력도 받지 않지만, get()을 호출하면 문자열 "Hello, World!"를 리턴해요.

📦 Supplier는 왜 쓰나요?

그냥 메서드 만들어서 호출하면 되는 거 아닌가요? 맞아요. 하지만 Supplier는 아래와 같은 상황에서 특히 유용해요:

1. 💤 게으른 초기화 (Lazy Initialization)

값을 지금 당장 계산하지 않고, 정말 필요할 때만 계산하고 싶을 때 사용합니다.

Supplier<Double> lazyRandom = () -> {
    System.out.println("계산 중...");
    return Math.random();
};

System.out.println("필요할 때만 호출:");
System.out.println(lazyRandom.get()); // 여기서만 계산됨

2. 🔄 매번 새로운 값이 필요할 때

매번 호출할 때마다 새로운 값을 만들고 싶을 때 유용해요.

Supplier<UUID> uuidSupplier = () -> UUID.randomUUID();
System.out.println(uuidSupplier.get());
System.out.println(uuidSupplier.get());

매번 고유한 UUID가 생성되죠.

3. 💻 의존성 주입에서 객체 생성을 지연할 때

Spring 같은 프레임워크에서는 Supplier를 사용해서 객체 생성을 지연할 수 있어요. 필요할 때만 객체를 만들기 때문에 자원을 효율적으로 사용할 수 있어요.

🎯 실전 예제: 조건에 따라 실행

public void runIfTrue(Supplier<Boolean> condition, Runnable action) {
    if (condition.get()) {
        action.run();
    }
}
  • condition: 조건을 나중에 평가
  • Runnable action: 조건이 참일 때 실행

사용 예:

runIfTrue(() -> LocalTime.now().getHour() < 12, () -> System.out.println("오전입니다!"));

🧩 Supplier는 어디에 쓰일까?

  • 로그 메시지를 나중에 평가할 때
  • 리소스를 늦게 열거나 생성할 때
  • 스트림(Stream) API에서 무한 시퀀스를 만들 때
  • 테스트에서 더미 데이터를 공급할 때

예: 무한 스트림

Stream<Double> infiniteRandoms = Stream.generate(() -> Math.random());
infiniteRandoms.limit(5).forEach(System.out::println);

🔚 마무리하며

Supplier<T>는 처음 보면 생소할 수 있지만, 익숙해지면 지연된 실행, 게으른 계산, 동적 값 생성 등에 매우 강력한 도구가 됩니다. 특히 람다식과 함께 쓰면 코드가 훨씬 간결하고 유연해지죠.

이제 Supplier가 단순히 “값을 공급하는 함수” 이상이라는 것을 이해하셨을 거예요. 실무에서도 한두 번 써보다 보면 자연스럽게 어디에 쓰면 좋을지 감이 오실 거예요. 😊

반응형
LIST