[자바] Supplier
🌱 자바의 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!
- helloSupplier는 String 값을 주는 공급자입니다.
- 이 공급자는 아무런 입력도 받지 않지만, 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가 단순히 “값을 공급하는 함수” 이상이라는 것을 이해하셨을 거예요. 실무에서도 한두 번 써보다 보면 자연스럽게 어디에 쓰면 좋을지 감이 오실 거예요. 😊