본문 바로가기

개발 관련

함수형 프로그래밍


함수형 프로그래밍

 

C언어를 통해서 절차적인 프로그래밍 방법을 뼛속 깊이 각인하고 있던 당시의 프로그래머들은 클래스와 객체의 차이, 상위클래스와 하위클래스의 관계, 메서드와 같이 지극히 기본적인 개념조차 쉽게 받아들이지 못하고 막막해 했다. 이런 생각으로..

객체지향이라는 방법이 좋은 거라는 점은 대충 알겠는데, 그걸 내가 왜 익혀야 하지?’

 

시간이 지나면서 자타가 공인하는 순정한 객체지향 언어인 자바가 등장했고, 자바의 등장과 더불어 많은 프로그래머가 더 이상 객체를 피할 수 없게 되었다. 리팩토링과 패턴으로 이어지는 객체지향의 여정에 들어서면서, 객체지향의 심오한 철학과 개념을 자기 것으로 만드는 과정 자체가 객체지향이 아닌 절차적인 패러다임을 사용하는 프로그래밍에도 도움이 된다는 오묘한 사실을 알게 되었다. 객체지향이라는 것이 어느 특정한 언어의 속성이 아니라 더 크고 깊은 방법론이라는 사실을 깨닫게 된 것이다. 그렇게 객체지향은 당연한 상식이 되어갔다.

 

그리고 현재.. (10년 후)

CPU 계속 속도가 18개월마다 2배씩 빨라진다는 무어의 법칙에 한계가 찾아왔다. CPU 제작사들은 우회하는 전략을 수립했는데, CPU 코어가 동시에 계산을 수행함으로써 결과적으로 더 빠른 계산이 가능하도록 만든 것이다. 이러한 멀티코어 전략은 필연적으로 소프트웨어 프로그램이 동시성이나 병렬 처리를 지원하도록 강제했다.

싱글코어가 멀티코어로 탈바꿈하는 과정은 소프트웨어가 객체지향 패러다임과 다른 새로운 패러다임을 요구하게 만들었으니, 그것이 바로 함수형 프로그래밍이다.

여기에 등장하는 개념들이 커리(currying), 추상 데이터 타입(abstract data type), 변경불가능성(immutability), 클로저(closure), 모나드(monad) 등이다.

마찬가지로 이런 생각을 한다.

함수형 프로그래밍이라는 방법이 좋은 거라는 점은 대충 알겠는데, 그걸 내가 왜 익혀야 하지?’

 

자바 개발자를 위한 함수형 프로그래밍이라는 책에서 장점을 다음과 같이 얘기한다.

동시성과 관련된 문제에 접근하기 위한 새로운 방법을 알게 되었다.

타입이나 함수를 설계할 때 전에는 미처 몰랐던 명확한 개념도 익힐 수 있었다.

모듈의 경계를 어디쯤으로 정해야 하며, 모듈의 재사용성을 어떻게 향상시킬 수 있는지 등에 대해 다른 방식으로 생각하게 되었다.’

등등..

그러나 가장 핵심은

전보다 더 간결한 코드를 작성하게 된 것이다.’

 

- 함수형 프로그래밍이라는 유령, (임백준, 대살개문, 143p)

 

 

예를 들면, 자바의 아래와 같은 코드를

public class Squint {

    public static void main(String args[]) {

        for (int i=1; i<=25; i++)

            System.out.println(i*i);

    }

}

 

동일한 내용을 함수형 언어인 Clojure(클로저)를 사용하면 한 줄짜리 코드가 된다.

(take 25 (squares-of (integers)))

 

자세한 내용은 여기를 참조

[번역] 함수형 프로그래밍(Functional Programming) 기초