X
함수형 프로그래밍이란?
함수형 프로그래밍
프로그래밍 패러다임
프로그래밍 패러다임 : 프로그래밍을 하는데에 있어 어떤 관점을 갖는지
-
명령형 프로그래밍
-
어떻게 할 것인가를 표현(알고리즘을 명시하고 목표는 명시 안함)
//1~100까지 더하는 것을 명령형 프로그래밍으로 표현하면 int sum=0; for(int i=1;i<=100;i++){ sum+=i; } System.out.println(sum);
-
절차지형 프로그래밍(C), 객체지향 프로그래밍(Java)
-
-
선언형 프로그래밍(알고리즘을 명시하지 않고 목표만 명시)
-
무엇을 할 것인가를 표현
//1~100까지 더하는 것을 선언형 프로그래밍으로 표현하자면 System.out.println(sum(1,100));
-
함수형 프로그래밍(클로저, 하스켈, 리스프)
-
함수형 프로그래밍 핵심 키워드
- Immutable DataStructure
- Pure Function
- First Object
- Function composition
Immutable DataStructure
Number number = new Number(3);
System.out.println(addThree(number).getNum());
System.out.println(number.getNum()); //3
public Number addThree(Number number){
return new Number(number.getNum()+3);
}
- 자료구조에 추가적인 행위를 했을 때 원본은 변환시키지 않는다(불변)
- 데이터 변경이 필요한 경우, 원본 데이터의 복사본을 만든다.
Pure Function
- 언제 어디서든 같은 input에 같은 output을 출력하는 함수.
String name = "Minsoo";
System.out.println(helloMethod(name)); //helloo Minsoo
System.out.println(helloMethod(name)); //hello Minsoo
System.out.println(name); //Minsoo
...
public String helloMethod(String name) {
return "hello " + name;
}
- 순수 함수가 아닌 경우
System.out.println(helloMethod("MinSoo"));
System.out.println(helloMethod("MinSoo"));
hello = "hi";
System.out.println(helloMethod("MinSoo"));
...
String hello = "hello";
public String helloMethod(String name) {
return hello + name;
}
First Object
-
1급 객체
-
변수나 데이터에 할당할 수 있다.
-
파라미터로 전달할 수 있다.
-
반환값으로 사용할 수 있다.
-
자바스크립트의 함수는 1급 함수
var method = function(){...}; $('registerForm').on('submit',function(){...}); function method(){ var a = function(){console.log('hi')}; return a; }
Function Composition
- 합성 함수
- 새로운 함수를 만들거나 계산하기 위해 둘 이상의 함수를 조합하는 과정
- 메서드 체이닝 방식의 합성함수
함수형 프로그래밍의 장점
- 순수 함수는 테스트하기 용이하게 된다. 순수함수는 테스트를 어렵게 만드는 불확실성과 부수 효과를 가지지 않는다.
- 코드의 가독성이 좋아진다.
- 메서드 체이닝으로 인해 불필요한 변수가 필요없다.(보일러플레이트코드 제거)
- 프로그래밍이 어떻게(How)라는 과정보다는 무엇(What)이라는 목표에 따라 코드가 이해하기 쉽다.
- Thread-safe 하다
- 불변의 특징으로 인해서 멀티 스레드 환경에서도 안전하다.
함수형 프로그래밍의 단점
-
상태가 없다
- 사용자와의 상호작용은 대부분 상태 변화로 모델링 되기 때문
-
어렵다
- 공부했다해서 내가 함수형 프로그래밍을 다 아는 건 아니다
결론
상태라는 얘기가 나올때부터 이해가 안간다..
적어도 함수형 프로그래밍을 적절하게 사용하면 테스트가 용이해지고, 자바의 람다를 사용하여 가독성을 증가시킬수 있겠다? 정도만 지금은 그렇게 이해해야겠다.