νλ‘κ·Έλλ° ν¨λ¬λ€μ(Programming Paradigm)
- λͺ
λ Ήν νλ‘κ·Έλλ°: 무μ(What)μ ν κ²μΈμ§ λνλ΄κΈ°λ³΄λ€ μ΄λ»κ²(How) ν 건μ§λ₯Ό μ€λͺ
νλ λ°©μ
- μ μ°¨ μ§ν₯ νλ‘κ·Έλλ°(C): μνλμ΄μΌ ν μμ°¨μ μΈ μ²λ¦¬ κ³Όμ μ ν¬ν¨νλ λ°©μ
- κ°μ²΄ μ§ν₯ νλ‘κ·Έλλ°(C++, Java, C#): κ°μ²΄λ€μ μ§ν©μΌλ‘ νλ‘κ·Έλ¨μ μνΈμμ©μ νν
- μ μΈν νλ‘κ·Έλλ°: μ΄λ»κ² ν 건μ§(How)λ₯Ό λνλ΄κΈ°λ³΄λ€ 무μ(What)μ ν 건μ§λ₯Ό μ€λͺ
νλ λ°©μ
- ν¨μν νλ‘κ·Έλλ°(ν΄λ‘μ , νμ€μΌ, 리μ€ν): μμ ν¨μλ₯Ό μ‘°ν©νκ³ μννΈμ¨μ΄λ₯Ό λ§λλ λ°©μ
κ°μ²΄ μ§ν₯ νλ‘κ·Έλλ°μ μΉλͺ μ μΈ λ¨μ μ κ°μ²΄κ° μνλ₯Ό κ°λλ€λ κ²μ΄λ€.
λ³μκ° μ‘΄μ¬νκ³ μ΄ λ³μλ₯Ό ν΅ν΄ κ°μ²΄κ° μμΈ‘ν μ μλ μνλ₯Ό κ°κ² λμ΄ μ ν리μΌμ΄μ λ΄λΆμ λ²κ·Έλ₯Ό λ°μμν¨λ€.
ν¨μν νλ‘κ·Έλλ°(Functional Programming)
λͺ λ Ήν νλ‘κ·Έλλ°μ κΈ°λ°μΌλ‘ κ°λ°νλ κ°λ°μλ€μ μννΈμ¨μ΄μ ν¬κΈ°κ° 컀μ§μ λ°λΌ, 볡μ‘νκ² μμΌμλ μ€νκ²ν° μ½λλ₯Ό μ μ§ λ³΄μνλ κ²μ΄ λ§€μ° νλ€λ€λ κ²μ κΉ¨λ«κ² λμλ€. κ·Έλ¦¬κ³ μ΄λ₯Ό ν΄κ²°νκΈ° μν΄ ν¨μν νλ‘κ·Έλλ°μ΄λΌλ νλ‘κ·Έλλ° ν¨λ¬λ€μμ κ΄μ¬μ κ°κ² λμλ€.
ν¨μν νλ‘κ·Έλλ°μ κ±°μ λͺ¨λ κ²μ μμ ν¨μλ‘ λλμ΄ λ¬Έμ λ₯Ό ν΄κ²°νλ κΈ°λ²μΌλ‘ μμ λ¬Έμ λ₯Ό ν΄κ²°νκΈ° μν ν¨μλ₯Ό μμ±νμ¬ κ°λ μ±μ λμ΄κ³ μ μ§λ³΄μλ₯Ό μ©μ΄νκ² ν΄ μ€λ€.
1. ν¨μν νλ‘κ·Έλλ°μ λν μ΄ν΄
μ λͺ ν μ± μΈ ν΄λ¦° μ½λ(Clean Code)μ μ μ Robert C.Martinμ ν¨μν νλ‘κ·Έλλ°μ λμ λ¬Έμ΄ μλ νλ‘κ·Έλλ°μ΄λΌκ³ μ μνμλ€.
Functional Programming is programming without assignment satements
- Rober C.Martin -
κ·Έλμ λͺ λ Ήν νλ‘κ·Έλλ°μΌλ‘ κ°λ°μ ν΄μλ μ¬λλ€μκ² λμ λ¬Έμ΄ μλ νλ‘κ·Έλλ°μ μλΉν μμν μλ°μ μλ€. μλνλ©΄ λ€μκ³Ό κ°μ΄ κ°λ¨ν μ½λμμλ λ³μκ° ν λΉλκ³ , κ°μ΄ λμ λκΈ° λλ¬Έμ΄λ€.
for(int i = 1 ; i < 10; i++){
System.out.println(i);
}
ν¨μν νλ‘κ·Έλλ°μμλ μμ κ°μ μ½λλ₯Ό λ€μκ³Ό κ°μ΄ ν΄κ²°ν μ μλ€.
- process ν¨μλ 첫 λ²μ§Έ μΈμλ‘ λͺκΉμ§ iterationμ λ κ²μΈκ°λ₯Ό 맀κ°λ³μλ‘ λ°κ³ μκ³ , λ λ²μ§Έ μΈμλ‘ μ λ¬λ°μ κ°μ μΆλ ₯νλΌλ ν¨μλ₯Ό 맀κ°λ³μλ‘ λ°κ³ μλ€.
process(10, print(num));
무μμ(What)μ ν¬μ»€μ€λ₯Ό λλ νλ‘κ·Έλλ°μ΄κΈ° λλ¬Έμ 'μΆλ ₯μ νλ ν¨μ'λ₯Ό νλΌλ―Έν°λ‘ λκΈΈ μ μμΌλ©°, μ΄λ ν¨μν νλ‘κ·Έλλ°μ κΈ°λ³Έ μ리 μ€ ν¨μλ₯Ό 1κΈ μλ―Ό(First-Class Citizen) λλ 1κΈ κ°μ²΄(First-Class Object)λ‘ κ΄λ¦¬νλ νΉμ§ λλ¬Έμ΄λ€.
2. νΉμ§
ν¨μν νλ‘κ·Έλλ°μ νΉμ§μ ν μ€λ‘ μμ½νλ©΄ λ€μκ³Ό κ°λ€.
λΆμ ν¨κ³Όκ° μλ μμ ν¨μλ₯Ό 1κΈ κ°μ²΄λ‘ κ°μ£Όνμ¬ νλΌλ―Έν°λ λ°ν κ°μΌλ‘ μ¬μ©ν μ μμΌλ©° μ°Έμ‘° ν¬λͺ μ±μ μ§ν¬ μ μλ€.
1) λΆμ ν¨κ³Ό(Side Effect)
λ€μκ³Ό κ°μ λ³ν λλ λ³νκ° λ°μνλ μμ μ μλ―Ένλ€.
- λ³μμ κ°μ΄ λ³κ²½λ¨
- μλ£ κ΅¬μ‘°λ₯Ό μ μ리μμ μμ ν¨
- κ°μ²΄μ νλ κ°μ μ€μ ν¨
- μμΈλ μ€λ₯κ° λ°μνλ©° μ€νμ΄ μ€λ¨λ¨
- μ½μ λλ νμΌ I/Oκ° λ°μν¨
2) μμ ν¨μ(Pure Function)
λΆμ ν¨κ³Ό(Side Effect)λ€μ μ κ±°ν ν¨μλ€μ μμ ν¨μ(Pure Function)μ΄λΌκ³ λΆλ₯΄λ©° ν¨μν νλ‘κ·Έλλ°μμ μ¬μ©νλ ν¨μλ μ΄λ¬ν μμ ν¨μλ€μ΄λ€.
- Memory or I/Oμ κ΄μ μμ Side Effectκ° μλ ν¨μ
- ν¨μμ μ€νμ΄ μΈλΆμ μν₯μ λΌμΉμ§ μλ ν¨μ
μμ ν¨μλ₯Ό μ¬μ©νλ©΄ λ€μκ³Ό κ°μ μ₯μ λ€μ΄ μλ€.
- ν¨μ μμ²΄κ° λ 립μ μ΄λ©° Side Effectκ° μκΈ° λλ¬Έμ μ€λ λμ μμ μ±μ 보μ₯λ°μ μ μλ€.
- μ€λ λμ μμ μ±μ 보μ₯λ°μ λ³λ ¬ μ²λ¦¬λ₯Ό λκΈ°ν μμ΄ μ§νν μ μλ€.
3) 1κΈ κ°μ²΄(First-Class Object)
- λ³μλ λ°μ΄ν° ꡬ쑰 μμ λ΄μ μ μλ€.
- νλΌλ―Έν°λ‘ μ λ¬ν μ μλ€.
- λ°ν κ°μΌλ‘ μ¬μ©ν μ μλ€.
- ν λΉμ μ¬μ©λ μ΄λ¦κ³Ό 무κ΄νκ² κ³ μ ν ꡬλ³μ΄ κ°λ₯νλ€.
ν¨μν νλ‘κ·Έλλ°μμ ν¨μλ 1κΈ κ°μ²΄λ‘ μ·¨κΈλ°κΈ° λλ¬Έμ μμ μμ μμ λ³Έ κ²μ²λΌ ν¨μλ₯Ό νλΌλ―Έν°λ‘ λκΈ°λ λ±μ μμ
μ΄ κ°λ₯ν κ²μ΄λ€. λν μ°λ¦¬κ° μΌλ°μ μΌλ‘ μκ³ κ°λ°νλ ν¨μλ€μ ν¨μν νλ‘κ·Έλλ°μμ μ μνλ μμ ν¨μλ€κ³Όλ λ€λ₯΄λ€λ κ²μ μΈμ§ν΄μΌ νλ€.
4) μ°Έμ‘° ν¬λͺ μ±(Referential Transparency)
- λμΌν μΈμμ λν΄ νμ λμΌν κ²°κ³Όλ₯Ό λ°νν΄μΌ νλ€.
- μ°Έμ‘° ν¬λͺ μ±μ ν΅ν΄ κΈ°μ‘΄μ κ°μ λ³κ²½λμ§ μκ³ μ μ§λλ€.
λͺ λ Ήν νλ‘κ·Έλλ°κ³Ό ν¨μν νλ‘κ·Έλλ°μμ μ¬μ©νλ ν¨μλ λΆμν¨κ³Όμ μ /무μ λ°λΌ μ°¨μ΄κ° μλ€. κ·Έμ λ°λΌ ν¨μκ° μ°Έμ‘°μ ν¬λͺ νμ§ μ ν μ§ λλμ΄μ§λλ°, μ°Έμ‘°μ ν¬λͺ νλ€λ κ²μ λ§ κ·Έλλ‘ ν¨μλ₯Ό μ€ννμ¬λ μ΄λ ν μνμ λ³ν μμ΄ νμ λμΌν κ²°κ³Όλ₯Ό λ°ννμ¬ νμ λμΌνκ²(ν¬λͺ νκ²) μ€ν κ²°κ³Όλ₯Ό μ°Έμ‘°(μμΈ‘)ν μ μλ€λ κ²μ μλ―Ένλ€. μ¦, μ΄λ€ ν¨μ fμ μ΄λ ν μΈμ xλ₯Ό λ£κ³ fλ₯Ό μ€ννκ² λλ©΄, fλ μ λ ₯λ μΈμμλ§ μμ‘΄νλ―λ‘ νμ f(x)λΌλ λμΌν κ²°κ³Όλ₯Ό μ»λλ€λ κ²μ μλ―Ένλ€.
λΆμμ©μ μ κ±°νμ¬ νλ‘κ·Έλ¨μ λμμ μ΄ν΄νκ³ μμΈ‘μ μ©μ΄νκ² νλ κ²μ ν¨μν νλ‘κ·Έλλ°μΌλ‘ κ°λ°νλ €λ ν΅μ¬ λκΈ° μ€ νλμ΄λ€. κ·Έλ¦¬κ³ μ΄λ¬ν λΆλΆμΈ λ³λ ¬ μ²λ¦¬ νκ²½μμ κ°λ°ν λ κ²½μ μνμ λν λΉμ©μ μ€μ¬μ€λ€. μλνλ©΄ ν¨μν νλ‘κ·Έλλ°μμλ κ°μ λμ μ΄ μμ΄ νμ λμΌν μ€νμ λν΄ λμΌν κ²°κ³Όλ₯Ό λ°ννκΈ° λλ¬Έμ΄λ€.
3. Javaλ₯Ό μ΄μ©ν μμ
- λ¨μ΄μ ν¬κΈ°κ° 2 μ΄μμΈ κ²½μ°λ₯Ό νν°λ§νλ€.
- λͺ¨λ λ¨μ΄λ₯Ό λλ¬Έμλ‘ λ³ννλ€.
- λͺ¨λ λ¨μ΄λ₯Ό μκΈμλ§ μλΌλ΄μ΄ λ³ννλ€.
- λͺ¨λ λ¨μ΄λ₯Ό μ€νμ΄μ€λ‘ ꡬλΆν νλμ λ¬Έμμ΄λ‘ ν©μΉλ€.
public class WordProcessTest {
private final List<String> words = Arrays.asList("TONY", "a", "hULK", "B", "america", "X", "nebula", "Korea");
@Test
void wordProcessTest() {
String result = words.stream()
.filter(w -> w.length() > 1)
.map(String::toUpperCase)
.map(w -> w.substring(0, 1))
.collect(Collectors.joining(" "));
assertThat(result).isEqualTo("T H A N K");
}
}
κΈ°μ‘΄μ for λ¬Έμ μ¬μ©νλ©΄ μ§μ λ³μκ° νμνμ κ²μ΄μ§λ§ ν¨μν κΈ°λ°μ Stream APIμμλ νμκ° μλ€. μ΄λ₯Ό ν΅ν΄ μνλ₯Ό λ°κΎΈλ μ§μ λ³μ μ체λ₯Ό μμ°μΌλ‘μ¨ λΆμ ν¨κ³Όλ₯Ό μ κ±°νμ¬ μλνμ§ μμ λ¬Έμ λ₯Ό ν΄κ²°ν μ μλ€. μ°λ¦¬κ° μ£Όλͺ©ν΄μΌ νλ λΆλΆμ μμ wordProcess λ©μλ λ΄λΆμμ filterλ map, collect λ±κ³Ό κ°μ ν¨μμ νλΌλ―Έν°λ‘ ν¨μκ° μ λ¬λλ€λ μ μ΄λ€.