반응형
// js : 함수의 매개변수로 함수를 넣을 수 있음, 리턴값도 함수 내보내기 가능
// java : 함수의 매개변수/리턴값으로 함수 사용 금지
// => 부가기능 추가 : 5가지 경우의 대표 함수(형태)를 만들어서 사용
// Runnable(실행) 함수 : 매개변수(x), 리턴값(x) 함수 예) void run()
// Supplier(공급자) 함수 : 매개변수(x), 리턴값(o) 함수 예) int get()
// Consumer(소비자) 함수 : 매개변수(o), 리턴값(x) 함수 예) void accept(int t)
// Function(일반) 함수 : 매개변수(o), 리턴값(o) 함수 예) int apply(int t)
// Predicate(논리(명제)) 함수 : 매개변수(o), 리턴값(o, 참/거짓) 함수 예) boolean apply(int t)
/**
* 1~100까지 중 10개의 랜덤 숫자 배열에 넣기 함수
* 제네릭 함수 : 제네릭을 매개변수에 사용하는 함수, 반환타입 앞에 <T>를 붙임
* T 클래스 : 대표 T : 임의의 어떤 클래스를 대표하는 클래스로 사용
* 제네릭 함수 : static <T> 반환타입 함수명(매개변수타입 매개변수명...) {}
*
* @param s
* @param list
* @param <T>
*/
static <T> void makeRandomList(Supplier<T> s, List<T> list) {
for (int i = 0; i < 10; i++) {
list.add(s.get()); // s.get() : 매개변수로 전달되는 생산자 함수를 대리하는 함수
}
}
/**
* List에 저장된 요소의 값이(i) 짝수인것만 화면에 출력
*
* @param p
* @param c
* @param list
* @param <T>
*/
static <T> void printEventNum(Predicate<T> p, Consumer<T> c, List<T> list) {
for (T i : list) {
// 명제 : 참/거짓이 있는 문장
if (p.test(i)) { // p.test(값) : 매개변수로 전달되는 논리(명제) 함수를 대리하는 함수
c.accept(i); // c.accept(값) : 매개변수로 전달되는 소비자 함수를 대리하는 함수
}
}
System.out.println(); // 줄바꿈
}
/**
* 1의 자리를 없앤 새로운 배열을 만들어서 List에 저장하는 함수(1의 자리는 0으로 변경)
* 제네릭 함수 : 함수의 리턴값 앞에 <T>, 제네릭표현식을 사용하는 함수
*
* @param f
* @param list
* @param <T>
* @return
*/
static <T> List<T> doSomething(Function<T, T> f, List<T> list) {
List<T> newList = new ArrayList<T>(list.size());
for (T i : list) {
newList.add(f.apply(i)); // p.apply(값) : 매개변수로 전달되는 일반 함수를 대리하는 함수
}
return newList;
}
public static void main(String[] args) {
Supplier<Integer> s = () -> (int)(Math.random()*100) + 1; // 1 ~ 100까지 랜덤
Consumer<Integer> c = i -> System.out.println(i + ","); // i 출력 함수
Predicate<Integer> p = i -> i % 2 == 0; // 2의 배수만 리턴하는 함수
Function<Integer, Integer> f = i -> i/10*10; // i의 값 중 1의 자리를 없애는 함수
// 예) 9.7 -> 90
// TODO : 결과 실행
List<Integer> list = new ArrayList<>();
// TODO : 정적 함수를 호출하면 마지막 매개변수(배열)에 값이 저장되어 리턴됨(화면출력됨)
makeRandomList(s, list);
System.out.println(list); // 결과출력 : 1 ~ 100까지 랜덤수가 화면출력됨
System.out.println("------------------------------------------------------");
printEventNum(p, c, list); // 결과 : 배열에 짝수인것만 화면에 출력
System.out.println("------------------------------------------------------");
List<Integer> list2 = doSomething(f, list);
System.out.println(list2); // 결과 : 일의 자리를 없앤 배열
}
실행 결과
[97, 38, 64, 5, 62, 76, 58, 49, 35, 29]
------------------------------------------------------
38,
64,
62,
76,
58,
------------------------------------------------------
[90, 30, 60, 0, 60, 70, 50, 40, 30, 20]
반응형
'Java > Java 이론' 카테고리의 다른 글
스레드(Thread) (0) | 2023.10.04 |
---|---|
중첩 클래스 (0) | 2023.10.02 |
파일 클래스를 이용한 파일 출력 (0) | 2023.10.02 |
objectstream (0) | 2023.10.02 |
printstream (0) | 2023.10.02 |