---
# System prepended metadata

title: '2023-10-15'

---

2023-10-15

- 함수형 프로그래밍 관련 코드 적용해보기
    - scope closure curry
    - lazy evaluation
    - function composition


--- 

# scope closure

### scope(스코프, 유효 범위)
- 변수에 접근할 수 있는 범위 
- 함수 안에 함수가 있을 때 내부 함수에서 외부 함수에 있는 변수에 접근이 가능하다(lexical scope) -> 반대(외부 함수에서 내부 함수로의 접근)는 불가능
    - 이 때 외부 함수의 변수는 선언 당시 값에서 바뀔 수 없기 때문에 final로 선언되어 있지 않더라도 암묵적으로 final 취급 -> 내부 함수에서 바꾸려고 하면 compile error 


### curry
- 여러 개의 매개변수를 받는 함수를 중첩된 여러 개의 함수로 쪼개서 한번에 받지 않고 여러 단계로 결쳐 나눠 받게 하는 기술 


```java 
        BiFunction<Integer, Integer, Integer> add = (x, y) -> x + y;

        Function<Integer, Function<Integer, Integer>> curried = x -> y -> x + y;
        Function<Integer, Integer> addThree = curried.apply(3);
        int result = addThree.apply(10);
        System.out.println("result = " + result); // 13
```


# lazy evaluation
- Lambda의 계산은 그 결과값이 필요할 때가 되어서야 한다. 

### 장점
- 불필요한 계산을 줄이거나,
- 해당 코드의 실행 순서를 의도적으로 미룰 수 있다.


# Function Composition
- 여러 개의 함수를 합쳐 하나의 새로운 함수를 만드는 것

```java  
Predicate<String> startsWithA = (text) -> text.startsWith("A");
Predicate<String> endsWithX   = (text) -> text.endsWith("x");

Predicate<String> startsWithAAndEndsWithX =
                (text) -> startsWithA.test(text) && endsWithX.test(text);

String  input  = "A hardworking person must relax";
boolean result = startsWithAAndEndsWithX.test(input);
System.out.println(result); // true
```