BE/Java

BiConsumer

baek-dev 2025. 5. 18. 16:29

BiConsumer란?

BiConsumer<T, U> 는 자바의 함수형 인터페이스 중 하나로,
두 개의 입력값을 받아 처리(소비)하는 연산을 정의함.
리턴 값은 없고, 부수 효과(side effect) 를 가지는 작업(ex: 출력, 저장 등)을 수행할 때 사용됨.


1. 기본 정의

@FunctionalInterface
public interface BiConsumer<T, U> {
    void accept(T t, U u);
}
  • T, U: 두 개의 입력 타입
  • accept(T t, U u): 두 인자를 받아서 어떤 작업을 수행함 (리턴값 없음)

2. 기본 예시

BiConsumer<String, Integer> printer = (name, age) -> {
    System.out.println("이름: " + name + ", 나이: " + age);
};

printer.accept("홍길동", 30);

→ 출력 결과: 이름: 홍길동, 나이: 30


3. 자주 쓰이는 활용 예시

① Map 순회

Map<String, Integer> scores = Map.of("수학", 90, "영어", 85);

scores.forEach((subject, score) -> {
    System.out.println(subject + ": " + score);
});
  • Map.forEach() 메서드는 BiConsumer<? super K,? super V> 를 받음
  • 키-값 쌍을 받아서 처리하는 데 적합함

② 커스텀 연산 수행

BiConsumer<List<String>, String> adder = (list, item) -> list.add(item);

List<String> names = new ArrayList<>();
adder.accept(names, "김철수");
System.out.println(names); // [김철수]

4. BiConsumer의 메서드 결합 – andThen()

BiConsumer 는 andThen() 메서드를 통해 연속적인 처리 연결이 가능함

BiConsumer<String, Integer> print = (name, age) -> 
    System.out.println("이름: " + name);

BiConsumer<String, Integer> printAge = (name, age) -> 
    System.out.println("나이: " + age);

BiConsumer<String, Integer> combined = print.andThen(printAge);
combined.accept("김영희", 28);

→ 출력 결과:

이름: 김영희  
나이: 28

5. BiConsumer를 쓸 때 적합한 상황

상황 설명
Map 키-값 쌍 순회 Map.forEach() 에서 BiConsumer 사용
두 개의 값으로 로직 처리 (객체, 파라미터) 형식의 연산 수행 시
부수 효과 중심 작업 로그 출력, 리스트 추가, DB 저장 등
함수 조합 andThen() 을 통해 단계별 작업 구성 가능

6. BiConsumer vs BiFunction 차이

항목 BiConsumer BiFunction
입력 2개 2개
리턴 없음 (void) 있음
용도 부수 효과 중심 결과 생성 중심
예시 출력, 저장 연산 결과 계산, DTO 생성 등

정리

BiConsumer<T, U>두 개의 입력값을 받아 리턴 없이 작업을 수행하는 함수형 인터페이스임.
Map.forEach(), List 조작, 로그 출력 등 부수 효과가 필요한 작업에 자주 사용되며,
함수 연결(andThen)로 연속적인 로직 구성도 가능함.
Java 8 이상에서 람다 표현식과 함께 사용하면 코드가 간결하고 유연해짐.

 

 

 

 

출처 : ChatGPT

'BE > Java' 카테고리의 다른 글

chronofield  (0) 2025.05.25
chronounit  (0) 2025.05.24
[Java] ArrayDeque  (0) 2025.04.02
[Java] 비동기 처리 (try-catch)  (0) 2025.03.28
[Java] 체인호출  (0) 2025.03.24