ํจ์ํ ์ธํฐํ์ด์ค
์๋ฐ 8๋ถํฐ ์๋ฐ๋ ๊ฐ์ฒด์งํฅ ์ธ์ด์ผ ๋ฟ๋ง ์๋๋ผ ํจ์ํ ์ธ์ด๋ ์ง์ํ ์ ์๊ฒ๋์๋ค.
์๋ฐ์์๋ ์ซ์, ๋ฌธ์ ๊ฐ์ ์์ ํ์
, ํด๋์ค๋ฅผ ํตํด ์ ์ํ๋ ์ฐธ์กฐ ํ์
๊ฐ์ฒด๋ค์ด
์ผ๊ธ ๊ฐ์ฒด๊ฐ ๋ ์ ์์ง๋ง,
(ํจ์ํ ์ธํฐํ์ด์ค๊ฐ ๋ฑ์ฅํ๊ธฐ ์ ๊น์ง๋) ํจ์์ ํด๋นํ๋ ๋ฉ์๋๋ ์ผ๊ธ ๊ฐ์ฒด๊ฐ ์๋์๋ค.
๋๋ถ์ ์ค๋ ๋ฏ์ด ๋ณผ Functional Interface์ ๋ฑ์ฅ์ผ๋ก,
๊ฐ์ฒด ์์๋ง ์กด์ฌํ๋ ํจ์(๋ฉ์๋)๋ฅผ ์ผ๊ธ ๊ฐ์ฒด๋ก ๋ค๋ฃฐ ์ ์๊ฒ๋์๋ค.
๐ค ์ผ๊ธ ๊ฐ์ฒดโฆ?
์ด๋ค ๊ฐ์ฒด๊ฐ ๋ค์ 3๊ฐ์ง ์กฐ๊ฑด์ ๋ง์กฑํ๋ ๊ฒฝ์ฐ, ์ด๋ฅผ ์ผ๊ธ ๊ฐ์ฒด๋ผ๊ณ ๋งํ๋ค.
- ํ๋ผ๋ฏธํฐ๋ก ์ ๋ฌํ ์ ์๋ค.
- ๋ฐํ๊ฐ์ผ๋ก ์ฌ์ฉํ ์ ์๋ค.
- ๋ณ์๋ ๋ฐ์ดํฐ ๊ตฌ์กฐ ์์ ๋ด์ ์ ์๋ค.
- ํ ๋น์ ์ฌ์ฉ๋ ์ด๋ฆ๊ณผ ๊ด๊ณ์์ด ๊ณ ์ ํ ๊ตฌ๋ณ์ด ๊ฐ๋ฅํ๋ค.
์์ธํ ๋ด์ฉ์ ์ด ๊ธ์ ์ฐธ๊ณ ํ๋ฉด ์ข์ ๊ฒ ๊ฐ๋ค.
ํจ์ํ ์ธํฐํ์ด์ค ์ ์ํ๊ธฐ
์ธํฐํ์ด์ค์ ์ถ์ ๋ฉ์๋๊ฐ ๋ฑ ํ๋๋ง ์กด์ฌํ๋ ๊ฒ์ ํจ์ํ ์ธํฐํ์ด์ค๋ผ๊ณ ํ๋ค.
์๋ฐ์ ๋๋ค์์ ํจ์ํ ์ธํฐํ์ด์ค๋ฅผ ํตํด์๋ง ๋ค๋ค์ง๋ค.
ํจ์ํ ์ธํฐํ์ด์ค๋ ๋๋ค์๊ณผ ์ธํฐํ์ด์ค ๋ฉ์๋๊ฐ 1:1๋ก ์ฐ๊ฒฐ๋๊ธฐ ์ํด,
์ถ์ ๋ฉ์๋๊ฐ ๋จ ํ๋๋ฟ์ธ ์ธํฐํ์ด์ค์ด๋ค.
(static, defualt ๋ฉ์๋๋ ์ ์ธ๋ค.)
์๋ฐ์์๋ ์ด๋ฅผ @FunctionalInterface
์ด๋
ธํ
์ด์
์ ์ฌ์ฉํ์ฌ ๋ํ๋ธ๋ค.
์ฐธ๊ณ ๋ก ์ด๋
ธํ
์ด์
์ ๋ถ์ผ ๊ฒฝ์ฐ ์ปดํ์ผ๋ฌ์์ ์ด๋
ธํ
์ด์
์ด ๋ถ์ ์ํฐํฐ๊ฐ
๋จ์ผ ์ถ์๋ฉ์๋๋ฅผ ๊ฐ์ถ ์ธํฐํ์ด์ค์ธ์ง ๊ฒ์ฌํ๋ ๋ถ์ด๋๋ก ํ์.
@FunctionalInterface
interface Calculate {
int cal(int a, int b);
}
๋ฏธ๋ฆฌ ์ ์๋์ด ์๋ ํจ์ํ ์ธํฐํ์ด์ค
java.util.function ํจํค์ง
์ ๋ค๋ฆญ ๋ฉ์๋๋ก ์ ์ํ๋ค๋ฉด, ๋งค๊ฐ๋ณ์๋ ๋ฐํ ํ์
์ด ๋ฌ๋ผ๋ ๋ฌธ์ ๊ฐ ๋์ง ์๋๋ค.
๋๋ฌธ์ ์๋ฐ ํจํค์ง์์๋ ์์ฃผ ์ฐ์ด๋ ํ์์ ๋ฉ์๋๋ฅผ ํจ์ํ ์ธํฐํ์ด์ค๋ก
๋ฏธ๋ฆฌ ์ ์ํด ๋์๋ค.
์ฌ์ค ๋งค๋ฒ ๋๋ค์์ ์ํด ํจ์ํ ์ธํฐํ์ด์ค๋ฅผ ์ ์ํ๋ ๊ฒ์ ๊ท์ฐฎ์ ์ผ์ด๋
๊ฐ๊ธ์ ์ด ํจํค์ง์ ํจ์ํ ์ธํฐํ์ด์ค๋ฅผ ์ฌ์ฉํ์!
ํ์ค์ผ๋ก ์ ์๋ ๋ํ์ ํจ์ํ ์ธํฐํ์ด์ค์ ๊ทธ ์์ ์๋ ์ถ์ ๋ฉ์๋
ํจ์ํ ์ธํฐํ์ด์ค | ์ถ์ ๋ฉ์๋ |
---|---|
Predicate<T> |
boolean test(T t) |
Supplier<T> |
T get() |
Consumer<T> |
void accept(T t) |
Funtion<T, R> |
R apply(T t) |
Predicate<T>
๋งค๊ฐ๋ณ์ ํ์ T, ๋ฐํํ์ Boolean
boolean test(T t);
- ๋งค๊ฐ๋ณ์๊ฐ 2๊ฐ์ธ ๊ฒฝ์ฐ
BiPredicate<T, U>
์ ๋ฌ๋ ์ธ์๋ฅผ ๋์์ผ๋ก true, false๋ฅผ ๋ฐํํด์ผํ๋ ์ํฉ์ ์ ์ฉํ๊ฒ ์ฌ์ฉ๋๋ค.
class PredicateDemo {
public static int sum(Predicate<Integer> p, List<Integer> lst) {
int s = 0;
for(int n : lst) {
if(p.test(n))
s += n;
}
return s;
}
public static void main(String[] args) {
List<Integer> list = Arrays.asList(1, 5, 7, 9, 11, 12);
int s;
s = sum(n -> n%2 == 0, list);
System.out.println("์ง์ ํฉ: " + s);
s = sum(n -> n%2 != 0, list);
System.out.println("ํ์ ํฉ: " + s);
}
}
sum(Predicate<Integer> p, List<Integer> lst)
์๋
boolean test(Integer t)
๋ฉ์๋ ์ ์์ ํด๋นํ๋ ๋๋ค์์ ์์ฑํด์ ์ ๋ฌํด์ผํ๋ค.
Supplier<T>
๋งค๊ฐ๋ณ์ ์์, ๋ฐํ ํ์ T
T get();
๋จ์ํ ๋ฌด์ธ๊ฐ๋ฅผ ๋ฐํํด์ผ ํ ๋ ์ฌ์ฉ๋๋ค.
class SupplierDemo {
public static List<Integer> makeIntList(Supplier<Integer> s, int n) {
List<Integer> list = new ArrayList<>();
for(int i = 0; i < n; i++)
list.add(s.get());
return list;
}
public static void main(String[] args) {
Supplier<Integer> spr = () -> {
Random rand = new Random();
return rand.nextInt(50);
};
List<Integer> list = makeIntList(spr, 5);
System.out.println(list);
list = makeIntList(spr, 10);
System.out.println(list);
}
}
makeIntList(Supplier<Integer> s, int n)
๋ ์ ์๋ฅผ ๋ด๊ณ ์๋ ์ปฌ๋ ์
์ธ์คํด์ค๋ฅผ ๋ฐํํ๋ค.
์ฒซ ๋ฒ์งธ ์ธ์์์ ์ปฌ๋ ์
์ธ์คํด์ค์ ๋ด์ ์ ์์ ์์ฑ ๋ฐฉ๋ฒ์ ๊ฒฐ์ ํ ์ ์๋ค.
Consumer<T>
๋งค๊ฐ๋ณ์ ํ์ T, ๋ฐํ ํ์ ์์
void accept(T t);
- ๋งค๊ฐ๋ณ์๊ฐ 2๊ฐ์ผ ๊ฒฝ์ฐ
BiConsumer<T, U>
์ ๋ฌ ์ธ์๋ฅผ ์๋นํ๋ ํํ๋ก ๋งค๊ฐ๋ณ์์ ๋ฐํํ์ด ์ ์ธ๋์ด ์๋ค.
์ ๋ฌ๋ ์ธ์๋ฅผ ๊ฐ์ง๊ณ ์ด๋ค ๊ฒฐ๊ณผ๋ฅผ ๋ณด์ฌ์ผ ํ ๋ ์ ์ฉํ๊ฒ ์ฌ์ฉ๋๋ค.
class ConsumerDemo {
public static void main(String[] args) {
Consumer<String> c = s -> System.out.println(s);
c.accept("Pineapple"); // ์ถ๋ ฅ์ด๋ผ๋ ๊ฒฐ๊ณผ๋ฅผ ๋ณด์ธ๋ค.
c.accept("Strawberry");
}
}
Funtion<T, R>
๋งค๊ฐ๋ณ์ ํ์ T, ๋ฐํํ์ R
R apply(T t);
- ๋งค๊ฐ๋ณ์๊ฐ 2๊ฐ์ธ ๊ฒฝ์ฐ
BiFunction<T, U, R>
์ ๋ฌํ ์ธ์์ ๋ฐํ ๊ฐ์ด ๋ชจ๋ ์กด์ฌํ๋ ๊ฐ์ฅ ๋ณดํธ์ ์ธ ํํ์ด๋ค.
class FunctionDemo {
public static void main(String[] args) {
Function<String, Integer> toInt = value -> Integer.parseInt(value);
Integer number = toInt.apply("100");
}
}
ํจ์ํ ์ธํฐํ์ด์ค์ ์ฅ์ ?
์ด ๋ถ๋ถ์ ์ฌ๋ฌ ์๋ฃ๋ฅผ ์ฐพ์๋ณด๋ฉด์ ์ค์ค๋ก ์๊ฐํด๋ณธ ๋ถ๋ถ์ด๋ค.
๊ฐ๊ฒฐํ ํํ๊ณผ ๊ฐ๋ ์ฑ
ํ์๋ ๊ฐ(value)์ฒ๋ผ ์ฐ์ผ ์ ์๋ค
1~100๊น์ง์ ์ง์ ํฉ์ ๊ตฌํ๋ ๋ก์ง์ ํจ์ํ ์ธํฐํ์ด์ค๋ฅผ ์ฌ์ฉํ์ง ์๊ณ ,
ํจ์ํ ์ธํฐํ์ด์ค๋ฅผ ์ฌ์ฉํ์ฌ ๋ ๊ฐ์ง ์ฝ๋๋ฅผ ํ์ธํด๋ณด์.
public static int evenSum() {
int sum = 0;
for (int i = 1; i <= 100; i++) {
if ( i % 2 == 0)
sum += i;
}
return sum;
}
public static int evenSum() {
return IntStream.rangeClosed(1, 100)
.filter(i -> i % 2 ==0)
.reduce(0, (l, r) -> l + r);
}
filter()
์ ์ ์ธ๋ถ๋ฅผ ๋ณด๋ฉด ๋ค์๊ณผ ๊ฐ๋ค.
Predicate<>
ํจ์ํ ์ธํฐํ์ด์ค๋ฅผ ๋ฐ๊ธฐ ๋๋ฌธ์ ์กฐ๊ฑด์ ๋ํ ํจ์๋ฅผ ๋งค๊ฐ๋ณ์๋ก ๋ฐ์,
ํ์ ์์ฒด๋ฅผ ๊ฐ์ผ๋ก ๋ฐ๊ณ ์๋ค.
๋ํ ์ด ๋๋ถ์ filter()์ ๋งค๊ฐ๋ณ์๋ก ํ์๊ฐ ์ด๋ค ๊ฒ์ธ์ง ๋๋ค์์ผ๋ก ๋ช
์์ ์ผ๋ก ๋๋ฌ๋ด๋ฉฐ
๋๊ฒจ์ฃผ๊ธฐ ๋๋ฌธ์ ์ง๊ด์ฑ์ ๋์ธ๋ค๊ณ ๋ ์๊ฐํ๋ค. (๋ง๋์ง๋ ๋ชจ๋ฅด๊ฒ ์ผ๋ ๊ฐ์ธ์ ์๊ฐ๐ฅฒ)
ํจ์ํ ์ธํฐํ์ด์ค์ ๋ช
ํํ ์ฅ์ ์ ๋งํ๊ณ ์ถ์๋ฐ,
์ ์ ๋ฆฌ๊ฐ ์๋๋ค.
์ด์ ๋ํด ํจ์ํ ํ๋ก๊ทธ๋จ์ ์ฅ์ ์ ์ฝ์ด ๋ณด๋ ๊ฒ์ด ์ข์ ๊ฒ ๊ฐ๋ค(โ)