함수형 프로그래밍

프로그래밍 패러다임

프로그래밍 패러다임 : 프로그래밍을 하는데에 있어 어떤 관점을 갖는지

  • 명령형 프로그래밍

    • 어떻게 할 것인가를 표현(알고리즘을 명시하고 목표는 명시 안함)

      //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 하다
    • 불변의 특징으로 인해서 멀티 스레드 환경에서도 안전하다.

함수형 프로그래밍의 단점

  • 상태가 없다

    • 사용자와의 상호작용은 대부분 상태 변화로 모델링 되기 때문
  • 어렵다

    • 공부했다해서 내가 함수형 프로그래밍을 다 아는 건 아니다

결론

상태라는 얘기가 나올때부터 이해가 안간다..

적어도 함수형 프로그래밍을 적절하게 사용하면 테스트가 용이해지고, 자바의 람다를 사용하여 가독성을 증가시킬수 있겠다? 정도만 지금은 그렇게 이해해야겠다.

Reference