2020-12-21
우선 Consumer의 함수적 인터페이스를 알아보자. 이름에서도 느껴지듯이 매개 값을 받아 소비만 하고 리턴 값을 가지지 않는다. 이러한 매개 값을 받는 메서드로는 accept ()를 가지고 있으며, 사용법은 아래와 같다.
package LambdaConsumer;
import java.util.function.BiConsumer;
import java.util.function.Consumer;
public class main {
public static void main(String[] args) {
Consumer<String> consumer = t ->{
System.out.println(t +"이다.");
};
//매개값만 받고 리턴값은 없는 인터페이스
consumer.accept("king");
BiConsumer<String, Integer> bis = (a, b)->{
System.out.println("이름은 " + a + "나이는 " + b);
};
bis.accept("king", 25);
//두가자 제네릭 타입을 받는 인터페이스 마찬가지로 리턴값은 없다.
}
}
Consumer의 선언 방법은 위와 같이 [ Consumer<T> 변수명 ]으로 선언해주면 되며, 이후 그에 따른 람다식을 작성해주면 된다. 위의 코드는 단순히 매개변수를 받아 해당 매개변수를 출력해주도록 람다식을 작성하였다. 또한 Consumer 인터페이스는 BiConsumer <A, B>와 같이 두 가지 제네릭 타입을 받거나, IntConsumer / DoubleConsumer와 같은 인터페이스를 사용하면, 매개 값을 한정 지을 수도 있다. (이후 accept() 메서드를 실행해보면 아래와 같이 정상적으로 값이 출력되는 것을 확인할 수 있다.)
다음은 Supplier이다. 이는 Consumer 와 정반대의 기능을 수행한다고 생각하면 된다. 역시 이름에서도 느껴지듯이 매개변수 없이 리턴 값이 있는 인터페이스이다. 사용법은 아래와 같다.
package LambdaSupplier;
import java.util.Scanner;
import java.util.function.BooleanSupplier;
import java.util.function.Supplier;
public class main {
public static void main(String[] args) {
Supplier<String> supplier = () ->{
String result = "king";
return result;
};
System.out.println(supplier.get());
//Consumer와는 반대로 매개값은 없지만 리턴값은 있다.
Scanner scan = new Scanner(System.in);
BooleanSupplier bs = () ->{
int a = scan.nextInt();
if(a > 0) {
return true;
}else {
return false;
}
};
//입력 받는 값이 양수인지 음수인지 체크하는 간단한 supplier 람다식
System.out.println(bs.getAsBoolean());
}
}
Supplier도 선언 인터페이스에 따라 다양한 리턴값을 줄 수 있는데, 제네릭 타입으로 리턴할 수도 있고 / Boolean / long... 등 한정된 값으로 리턴할 수 도 있다. 예제의 코드 첫 번째는 단수 Supplier의 제네릭 타입으로써 람다식안에 result라는 변수명을 선언해 주고 이후 해당 값은 Supplier의 get() 메서드를 통해서 호출해 출력해 주었다.
두번째 구현 코드는 뭔가 아쉬워 Scanner 통해 직접 콘솔 창에 값을 입력받아, 해당 값이 과연 양수인지 아닌지를 체크하는 간단한 if / else문을 람다식으로 구연하였고, 이후 Boolean에 맞게 getAsBoolean()를 통해 결과를 출력하도록 하였다.