함수형 프로그래밍에 대한 공부
함수형 프로그램에는 인풋과 아웃풋이 존재하고, 외부 환경으로부터 독립적이다.
외부환경에 독립적이므로 인풋이 같다면, 아웃풋 또한 달라지지않는다.(순수함수)
순수 함수:
- 부수효과(주어진 값 이외의 변수 및 프로그램 실행에 영향을 끼치지 않는 것)가 없는 함수를 순수 함수라고 한다.
- 멀티쓰레드에서도 안전하고, 병렬처리 및 계산이 가능하다.
- 특징: 아래의 조건을 만족해야한다.
- 동일한 입력에 대해 항상 같은 값을 반환
- 부작용(다른 요인에 따른 결과변경)이 없는 결과 생성
-> 함수에서 인자를 변경하거나 프로그램 상태를 변경하지 않음.
함수형 프로그래밍 사용 시, 일정 단위의 작업에 있어서 안전성이 보장되고,
예측 가능한 프로그램을 제작할 수 있다.
객체 지향 프로그래밍은, 데이터를 어떻게 처리 할지에 대해 명령을 통해 풀어나갔다면,
함수형 프로그래밍은 선언적 함수를 통해, 무엇을 풀어나갈지 결정하는 것이다.
함수형 프로그래밍에서 사용되는 함수는 1급객체(first-class citizens) 이어야 한다.
1급 객체:
일반적으로 다른 객체들에 적용 가능한 연산을 모두 지원하는 객체.
다음 조건을 만족하는 객체이다.
- 변수나 데이터 구조 안에 담을 수 있다.
- 객체의 인자로 넘길 수 있다.
- 반환 값(return value)으로 사용 가능하다.
- 동적으로 프로퍼티 할당 가능
자바 8에서 함수는 1급 시민이 되어, 함수형 프로그래밍의 핵심이 되었다.
코드를 간결하게 만들어주고, 가독성을 높이는 장점이 있다.
참고 영상: https://youtu.be/jVG5jvOzu9Y
람다식과 스트림에 대한 공부
람다(Lamda)
함수의 구조로 되어있으며, 자바 내에서 -> 와 같은 화살표 형태의 기호를 이용해 매개변수를 전달하는 형태를 취한다.
( parameters ) -> expression body // 인자가 여러개 이고 하나의 문장으로 구성
( parameters ) -> { expression body } // 인자가 여러개 이고 여러 문장으로 구성
() -> { expression body } // 인자가 없고 여러 문장으로 구성
() -> expression body // 인자가 없고 하나의 문장으로 구성
장점:
단점:
스트림
데이터 소스를 추상화 하여, 데이터를 다루는 데 자주 사용되는 메서드들을 정의 해 놓은 것.
데이터 소스가 무엇이든 같은 방식으로 다룰 수 있게 되었다.
특징:
데이터 소스를 변경하지 않는다.
일회용이다.
3. 작업을 내부 작업으로 처리한다.
* `forEach()` 의 경우, 반복문을 메서드 안에 숨겨, 내부 반복 작업을 진행한다.
```java
void forEach(Consumer<? super T> action) {
Objects.requireNonNull(action); // 매개변수의 null 체크
for(T t: src){ // 내부 반복
action.accept(T);
}
}
```
* 연산의 파이프 라인
`스트림 생성(Create)` -> `중간연산(Intermediate operating)` -> `최종연산(Final operation)` 의 형태를 가진다.
```java
Arrays.stream(strArr)
.distinct() // 중복 데이터 제거
.limit(5) // 데이터를 5개로 제한
.sorted() // 데이터 정렬
.forEach(System.out::print); // 내부의 데이터를 순차적으로 돌면서 출력
```
참고 사이트: https://dinfree.com/lecture/language/112_java_9.html#m1
부수효과(주어진 값 이외의 변수 및 프로그램 실행에 영향을 끼침)가 없는 함수를 순수함수라고 한다.