티스토리 뷰

Backend/Java8

#6 Supplier

RadderNepa 2022. 9. 18. 00:02

● 도입

- java가 제공하는 여러 Functional Interface에 대해 알아보자

- Supplier, Consumer, BiConsumer, Predicate 등을 배울 것이다.

프로그래밍에서 1급 시민의 조건
1. 함수/메서드의 매개변수(parameter)로서 전달할 수 있는가
2. 함수/메서드의 반환값(return)이 될 수 있는가
3. 변수에 담을 수 있는가

- 이전까지의 글에서는 Lambda를 이용해 변수에 넣는 것만 배웠다.

- 앞으로는 그 외의 것도 배울 것이다.

 

 

● Supplier

- 맨 먼저 Supplier에 대해 공부할 것이다. Supplier의 구조는 아래와 같다.

- Supplier는 공급하는 interface를 의미한다.

@FunctionalInterface
public interface Supplier<T> {
	T get(); // input 없이 return 값만 가지는 함수
}

- Supplier 또한 Functional Interface 이기에 단 하나의 abstract method를 갖는다.

 

 

 실습

1.

- 먼저 간단하게 구현해보자

package com.fastcampus.functionalprogramming.chapter3;

import java.util.function.Supplier;

public class Chapter4Section1 {
	public static void main(String[] args) {
		// Supplier interface는 input parameter가 없기에 '() ->'로 작성
		// 아래의 Supplier는 항상 "hello world!"라는 String을 반환해준다.
		Supplier<String> stringSupplier = () -> {
			return "hello world!"; 
		};
		// Supplier interface의 abstract method 이름은 'get' 이다.
		System.out.println("Supplier1 : " + stringSupplier.get());
		
		// 간단히
		// 아래의 Supplier는 항상 "bye world!"라는 String을 반환해준다.
		Supplier<String> stringSupplier2 = () -> "bye world!";
		System.out.println("Supplier2 : " + stringSupplier2.get());
		
		// 호출을 할 때마다 랜덤한 double을 주는 Supplier를 만들어 보자
		Supplier<Double> ramdomDoubleSupplier = () -> Math.random();
		System.out.println("Supplier3-0 : " + ramdomDoubleSupplier.get());
		System.out.println("Supplier3-1 : " + ramdomDoubleSupplier.get());
		System.out.println("Supplier3-2 : " + ramdomDoubleSupplier.get());
	}
}

 

2.

- 함수가 1등 시민이 됐으므로 해당 함수를 parameter로 넘겨보자

[count 만큼 randomDoubleSupplier를 호출해서 출력을 해주는 기능을 만들어보자]

package com.fastcampus.functionalprogramming.chapter3;

import java.util.function.Supplier;

public class Chapter4Section1 {
	public static void main(String[] args) {
		// 호출을 할 때마다 랜덤한 double을 주는 Supplier를 만들어 보자
		Supplier<Double> randomDoubleSupplier = () -> Math.random();
		
		// count 만큼 위의 randomDoubleSupplier를 호출
		printRandomDoubles(randomDoubleSupplier, 5);
	}
	
	public static void printRandomDoubles(Supplier<Double> randomDouble, int count) {
		// count 만큼 위의 randomDoubleSupplier를 호출해서 출력을 해주는 기능을 만들어보자
		int i = 0;
		while(i < count) {
			System.out.println("printRandom : " + randomDouble.get());
			i++;
		}
	}
}

 

- printRandomDoubles 함수의 parameter로 원하는 형식의 random number를 출력하는 함수만 argument로 적절히 넘겨주면 printRandomDoubles 함수의 내용을 굳이 직접 수정할 필요 없이 원하는 결과를 얻을 수 있다.

공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/12   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31
글 보관함