Consumer<T>는 제네릭 인터페이스로, 하나의 인자를 받아 어떤 동작을 수행하지만 결과를 반환하지 않는 함수형 인터페이스다.
@FunctionalInterface
public interface Consumer<T> {
void accept(T t);
}
T: 입력 파라미터의 타입
accept(T t): 전달받은 값을 소비(consume)하는 메서드
컬렉션 요소를 출력하거나 로깅할 때
입력값에 대해 부수 효과(side effect)가 필요한 경우 (예: 저장, 출력, 변경 등)
Stream API의 forEach, peek와 함께 자주 사용
🔹 기본 예제
import java.util.function.Consumer;
public class ConsumerExample {
public static void main(String[] args) {
Consumer<String> printUpper = s -> System.out.println(s.toUpperCase());
printUpper.accept("hello"); // 출력: HELLO
}
}
🔹 List와 함께 사용하기
import java.util.Arrays;
import java.util.List;
import java.util.function.Consumer;
public class ListConsumerExample {
public static void main(String[] args) {
List<String> names = Arrays.asList("Java", "Python", "C++");
Consumer<String> printName = name -> System.out.println("언어: " + name);
names.forEach(printName);
}
}
여러 개의 Consumer 동작을 순차적으로 연결할 수도 있다.
Consumer<String> print1 = s -> System.out.println("1차 출력: " + s);
Consumer<String> print2 = s -> System.out.println("2차 출력: " + s);
Consumer<String> combined = print1.andThen(print2);
combined.accept("Java");
// 출력:
// 1차 출력: Java
// 2차 출력: Java
❗ andThen은 첫 번째 Consumer 실행 후 두 번째 Consumer를 실행한다.
순서가 중요하며, 둘 다 같은 인자를 받는다.\
| 구분 | Consumer | Function |
|---|---|---|
| 반환값 | 없음 (void) | 있음 (R) |
| 메서드 | accept(T t) | apply(T t) |
| 사용 목적 | 동작 수행 (출력 등) | 결과 생성 및 반환 |
Consumer<T>는 반환값이 없는 함수형 인터페이스로, 간단한 동작(출력, 저장 등)에 매우 유용하다. 특히 Stream API의 forEach()와 함께 사용하면, 가독성 좋고 선언적인 코드를 작성할 수 있다.
함수형 프로그래밍에 익숙해질수록, Consumer는 자연스럽게 자주 사용하는 도구가 된다.