순수 함수를 조합하고 공유 상태, 변경 가능한 데이터 및 부작용을 피해 소프트웨어를 만드는 프로세스
(기존의 사고방식을 전환하여 프로그래밍을 더 유연하게 문제해결 하도록 접근하는 것)
상태와 상태를 변경시키는 관점에서 연산을 설명하는 방식
알고리즘을 명시하고, 목표는 명시하지 않음
How보다는 What을 설명하는 방식(어떻게보단 무엇을)
알고리즘을 명시하지 않고 목표만 명시함
➡️ 명령형 프로그래밍은 어떻게 할지 표현하고 선언형 프로그래밍을 무엇을 할건지 표현한다.
순수 함수(Pure functions)
: 부수 효과들을 제거한 함수(Memory or I/O의 관점에서 Side Effect가 없는 함수, 함수의 실행이 외부에 영향을 끼치지 않는 함수)
➕ 부수 효과(Side Effect)
합성 함수 (Function composition)
공유상태 피하기(Avoid shared state)
상태변화 피하기(Avoid mutating state)
부작용 피하기(Avoid side effects)
프로그래머가 바꾸고자 하는 변수 외에는 변경되면 안됨(원본 데이터는 불변)
순수함수
// arr 넣어서 map 얻기
var arr = [1, 2, 3, 4, 5];
var map = arr.map(function(x) {
return x * 2;
}); // [2, 4, 6, 8, 10]
➡️ arr를 사용했지만 값은 변하지 않았고 map이라는 결과를 내고 부작용을 낳지 않음
순수함수X
var arr = [1, 2, 3, 4, 5];
var condition = function(x) { return x % 2 === 0; }
var ex = function(array) {
return array.filter(condition);
};
ex(arr); // [2, 4]
➡️ ex 메소드에서 인자가 아닌 condition을 사용했기 때문
var ex = function(array, cond) {
return array.filter(cond);
};
ex(arr, condition);
➡️ 순수함수로 만들면 에러를 추적하는 것이 쉬워짐(인자 혹은 함수 내부의 문제 둘 중 하나)
import java.util.Arrays;
import java.util.List;
public class stream {
public static void main(String[] args) {
List<String> myList = Arrays.asList("a", "b", "c", "d", "e");
// 기존방식
for(int i=0; i<myList.size(); i++){
String s = myList.get(i);
if(s.startsWith("c")){
System.out.println(s.toUpperCase());
}
}
// stream API를 이용한 방식
myList.stream()
.filter(s -> s.startsWith("c"))
.map(String::toUpperCase)
.forEach(System.out::println);
}
}
[참고 자료]