ν¨μν νλ‘κ·Έλλ°(Functional Programming, FP)μ νλ‘κ·Έλλ° ν¨λ¬λ€μ μ€ νλλ‘, μμν(pure) ν¨μμ κ°λ κ³Ό λΆλ³μ±(immutability), κ·Έλ¦¬κ³ λͺ λ Ήν μ€νμΌμ΄ μλ μ μΈν μ€νμΌμ κ°μ‘°νλ€. ν¨μν νλ‘κ·Έλλ°μ μ£Όλ‘ μνμ μΈ μ κ·Όμ ν΅ν΄ λ¬Έμ λ₯Ό ν΄κ²°νλ©°, ν¨μμ μ λ ₯λ§μ΄ μΆλ ₯μ μν₯μ λ―ΈμΉλλ‘ μ€κ³λλ€. μ΄λ κ°μ μ λ ₯μ λν΄ νμ κ°μ μΆλ ₯μ λ°ννλ€λ λ»μ΄λ©°, μ΄λ¬ν ν¨μλ₯Ό μμ ν¨μλΌκ³ νλ€.
Java, JavaScript, Python λ± λ§μ νλ νλ‘κ·Έλλ° μΈμ΄λ€μ ν¨μν νλ‘κ·Έλλ° ν¨λ¬λ€μμ μ§μνλ©°, νΉν λ°μ΄ν° μ²λ¦¬μ λ³λ ¬ μ²λ¦¬μ μ΄μ μ΄ μλ€. μ΄λ¬ν μ΄μ λ‘ ν¨μν νλ‘κ·Έλλ°μ λκ·λͺ¨ λ°μ΄ν°λ₯Ό μ²λ¦¬νλ λΉ λ°μ΄ν° μ ν리μΌμ΄μ , λμμ±μ λ€λ£¨λ λ©ν°μ€λ λ μμ€ν λ±μμ μ£Όλ‘ νμ©λκ³ μλ€.
μλ°λ μλ κ°μ²΄ μ§ν₯ νλ‘κ·Έλλ° μΈμ΄μ΄λ€. κ·Έλ¬λ μλ° 8λΆν° ν¨μν νλ‘κ·Έλλ°μ κ°λ μ λμ νμ¬ μ΄ λ κ°μ§ ν¨λ¬λ€μμ λμμ μ¬μ©ν μ μκ² λμλ€. μλ°μμμ ν¨μν νλ‘κ·Έλλ°μλ μ£Όλ‘ λλ€ ννμ(Lambda expressions), λ©μλ μ°Έμ‘°(Method references), ν¨μν μΈν°νμ΄μ€(Functional interfaces) λ±μ λ¬Έλ²μ μμλ€μ΄ μλ€.
λλ€ ννμ(Lambda Expressions): λλ€ ννμμ μ΄λ¦ μλ ν¨μλ₯Ό λ»νλ©°, ν¨μν νλ‘κ·Έλλ°μμ ν΅μ¬μ μΈ μν μ νλ€. λλ€ ννμμ κ°κ²°νκ² μ½λλ₯Ό μμ±ν μ μκ² ν΄μ£Όκ³ , ν¨μλ₯Ό λ€λ₯Έ ν¨μμ μΈμλ‘ μ λ¬νκ±°λ κ²°κ³Όλ‘ λ°νν μ μκ² νλ€.
// λλ€ ννμ μμ
BinaryOperator<Integer> add = (a, b) -> a + b;
int sum = add.apply(5, 3); // κ²°κ³Ό: 8
μ μ½λμ μ μ©λ λλ€ ννμμ λΆμν΄λ³΄λ©΄ λ€μκ³Ό κ°λ€.
(a, b) : μ
λ ₯ λΆλΆμ΄λ€. μ°λ¦¬κ° νν λ©μλμ μ λ¬νλ λ§€κ°λ³μμ λΉμ·νλ€. μμ μμμμλ aμ bλΌλ λ κ°μ λ§€κ°λ³μλ₯Ό λ°λλ€.β : μ΄ λΆλΆμ λλ€ ννμμμ "μ λ¬λ λ§€κ°λ³μλ₯Ό μ΄μ©νμ¬ λ€μκ³Ό κ°μ λμμ μννλ€"λ₯Ό μλ―Ένλ€.a + b : λ°λ(body)μ
λλ€. μ΄ λΆλΆμ μ€μ λ‘ μνλλ μμ
μ λνλΈλ€. μ¬κΈ°μλ aμ bλ₯Ό λνλ λμμ λνλΈλ€.λ°λΌμ μ 체μ μΌλ‘ (a, b) -> a + b λλ€ ννμμ "aμ bλΌλ λ μ
λ ₯μ λ°μμ μ΄λ€μ λν κ²°κ³Όλ₯Ό λ°ννλ€"λΌλ λμμ νννλ€.
λ©μλ μ°Έμ‘°(Method References): λ©μλ μ°Έμ‘°λ νΉμ λ©μλλ₯Ό μ§μ μ°Έμ‘°νμ¬ λλ€ ννμκ³Ό κ°μ΄ ν¨μλ₯Ό λ€λ£¨λ λ° μ¬μ©νλ€. μ΄λ₯Ό ν΅ν΄ μ½λλ₯Ό λμ± κ°κ²°νκ² λ§λ€ μ μλ€.
// λ©μλ μ°Έμ‘° μμ
List<String> words = Arrays.asList("Java", "Python", "C++");
words.stream().forEach(System.out::println);
ν¨μν μΈν°νμ΄μ€(Functional Interfaces): ν¨μν μΈν°νμ΄μ€λ νλμ μΆμ λ©μλλ₯Ό κ°μ§λ μΈν°νμ΄μ€λ₯Ό λ§νλ€. λλ€ ννμμ μ΄ ν¨μν μΈν°νμ΄μ€μ μΈμ€ν΄μ€λ‘ κ°μ£Όλ μ μλ€. μλ° 8μμλ java.util.function ν¨ν€μ§λ₯Ό ν΅ν΄ λ€μν ν¨μν μΈν°νμ΄μ€λ₯Ό μ 곡νλ€.
// ν¨μν μΈν°νμ΄μ€ μμ
Predicate<Integer> isEven = n -> n % 2 == 0;
boolean result = isEven.test(10); // κ²°κ³Ό: true