IT_Programming/Functional Programming

[펌] 함수형 프로그래밍이란?

JJun ™ 2016. 7. 26. 16:48



 출처

 : https://medium.com/@lazysoul/함수형-프로그래밍이란-d881230f2a5e




잠시 당신이 나무꾼이라고 가정해보자. 당신은 숲에서 가장 좋은 도끼를 가지고 있고, 그래서 가장 일 잘하는 나무꾼이다. 그런데 어느 날 누가 나타나서 나무를 자르는 새로운 패러다임인 전기톱을 알리고 다닌다. 이 사람이 무척 설득력이 있어서 당신은 사용하는 방법도 모르면서 전기톱을 사게 된다. 당신은 여태껏 했던 방식대로 시동을 걸지도 않고 전기톱으로 나무를 마구 두들겨댄다. 곧 당신은 이 새로운 전기톱은 일시적인 유행일 뿐이라고 단정하고 다시 도끼를 쓰기 시작한다. 그때 누군가 나타나서 전기톱의 시동 거는 법을 가르쳐 준다. — “함수형 사고” 에서

‘함수형 사고' 라는 책에서 참조 했습니다. 함수형 프로그래밍에 관심을 갖고 있는 사람들 대부분은 이미 ‘숲' 이 있고 손에 익은 ‘도끼' 하나 정도는 가지고 있을 것 입니다. 아직 ‘도끼'가 손에 익지 않은 사람도 있고, 이미 없어서는 안될 ‘도끼'를 가진 사람들도 있을 것입니다. 주변에서 아무리 전기톱이 좋다고 하지만, 남들이 좋다고 해서, 있어 보여서 쓴다면, 지금 사용하고 있는 ‘도끼' 를 쓰는 것만 못하다고 생각합니다.

함수형 프로그래밍의 컨셉


  1. 변경 가능한 상태를 불변상태(Immutab)로 만들어 SideEffect를 없애자.
  2. 모든 것은 객체이다.
  3. 코드를 간결하게 하고 가독성을 높여 구현할 로직에 집중 시키자.
  4. 동시성 작업을 보다 쉽게 안전하게 구현 하자.


변경 가능한 상태를 불변상태(Immutable)로 만들어 SideEffect를 없애자.


함수의 기본은 f(x) = y, 한 번쯤은 봤을 법한 공식입니다. 쉽게 말해서 함수f()에 x 를 입력하면 항상 y라는 결과값이 나오는 것을 말합니다. 여기서 중요한 점은 함수 안에서 상태를 관리하고 상태에 따라서 결과값이 달라지면 안된 다는 말 입니다. 상태를 사용하지 않음으로 SideEffect를 사전에 차단 할수 있습니다. 또 변수 보다는 상수를 사용해 SideEffect를 차단합니다.



 def f1(x : Int, y : Int) : Int{

x + y } def f2(x : Int, y : Int) : Int{ if(state == 1) x + y else x - y }



모든 것은 객체이다.


함수형 언어에서는 모든것이 객체입니다. 클래스 외에 함수 또한 객체 이기 때문에 함수를 값으로 할당 할수 있고, 파라미터로 전달 및 결과 값으로 반환이 가능합니다. 위 3가지를 만족하는 객체를 1급 객체 라고 합니다. 자바 8 이전에 함수는 위 3가지를 만족시키지 못해 함수가 1급 객체가 아니였지만 함수형 프로그래밍 언어에서는 3가지 조건을 만족시켜 함수가 1급 객체 입니다. 이전에 정리한 글에 보다 자세한 설명과 예제가 있습니다.


코드를 간결하게 하고 가독성을 높여 로직에 집중 시키자.


Lambda 및 Collection, Stream 과 같은 API를 통해 보일러 플레이트를 제거하고, 내부에 직접적인 함수 호출을 통해 가독성을 높일수 있습니다. 일을 위한 일들이 줄어들어 실제 구현할 로직에만 집중 할 수있게 됩니다.


 // Java
 view.setOnClickListener(new View.OnClickListener() {
    public void onClick(View v) {
        List listA = new ArrayList<Integer>();
            for(int i = 0; i<list.size(); i++) {
                if(list.get(i) > 0)
                    listA.add(list.get(i)*2);
            }
        view.show(listA);
    }
 } 
 // Kotlin
 view.setOnClickListener{
    view -> {
    view.show(list.filter( it > 0 ).map( it * 2 ))
    }
 }



동시성 작업을 보다 쉽고 안전하게 구현하자.


위에 설명한 immutable 값을 사용 해, 여러 쓰레드에서 접근을 하더라도 SideEffect를 발생시키지 않습니다. 또한 Lock, UnLock 같은 보호 장치도 필요 없습니다.


함수형 프로그래밍은 만병 통치약인가?


처음 인용한 글에서 처럼 ‘전기톱'은 ‘도끼' 보다 빠르고 강력합니다. 물론 시동 거는 법 및 사용법을 숙지한 후를 말합니다. 함수형 프로그래밍도 마찬가지 입니다. 기존에 사용하던 언어에 대한 이해와 함수형 프로그래밍이 무엇인지 이해할 필요가 있습니다. 현재 함수형 프로그래밍이 필요한지? 필요 없는지? 를 알아야 효과적으로 사용 할 수 있습니다. 저 역시 현재 시동법을 배우고 있는 단계 입니다.

공부를 하다보면 신기하고 놀라운 경우가 한둘이 아닙니다. 하지만 결국 ‘그런데 이걸 언제, 어떻게 쓰지?’ 로 마무리 됩니다. 이 점이 가장 큰 어려운 점이라고 생각합니다. 함수형 프로그래밍을 해본 경험이 없고, 이미 객체지향이나 절차지향에 익숙해졌기 때문입니다. 이점을 극복 하기 위해서는 많이 보고 많이 사용하는 법 밖엔 없다고 생각합니다 ㅠㅠ 혼자 하기 어렵다면 주변 지인들과 스터디를 해보는 것도 좋은 방법이라고 생각합니다.

항상 ‘전기톱'이 효율적 이지는 않습니다. 상황에 맞게 ‘전기톱'도 쓰고 ‘도끼' 도 사용하는게 옳다고 생각합니다. 앞으로 ‘전기톱' 을 뛰어넘는 더 좋은 장비가 나올 수도 있습니다. 그때 마다 무작정 기존 장비를 사용하던 대로 사용하지 않고, 새로운 장비가 어떤 점이 좋은지? 왜 좋은지? 를 생각하면서 ‘시동거는 법'을 배웠으면 합니다.

현재 함수형 프로그래밍 스터디 그룹을 운영 하고 있습니다.
혹시라도 관심 있으시다면 아래 링크보시고 연락주시면 답변 드리겠습니다. 감사합니다.