함수형 프로그래밍?(Functional Programming)

Functional Programming(함수형 프로그래밍)

지난 토요일에 T 회사 인턴 면접을 보고 왔다. 해당 회사 모바일 개발 직군에 인턴으로 지원하기도 했고, 전 회사에서 하던 것이 Android라서 최근에 구글이 선택한 Kotlin을 공부하기 시작했다. 면접에서 요즘에 공부하는 것이 무엇이냐는 질문에, Kotlin을 막 공부하기 시작했다고 대답했다. 그러자 면접관께서 Kotlin, Swift 등 최근 함수형 언어(Functional Language)가 뜨고 있는데 그 이유를 알고 있느냐고 질문하셨다. Kotlin 공부를 하게 된 이유는 함수형 언어이기 때문이 아니라, 단순히 구글이 Android 언어로 Kotlin을 선택했기 때문이다.

그래서 질문에 대답하지 못했다. 하지만 아는 것이 힘이니 오늘 그 이유에 대해 알아보고자 한다.

함수형 프로그래밍이란(About Functional Programming)

함수형 프로그래밍 은 자료 처리를 수학적 함수의 계산으로 취급하고 상태와 가변 데이터를 멀리하는 프로그래밍 패러다임의 하나이다. 명령형 프로그래밍(Java 등)에서는 상태를 바꾸는 것을 강조하는 것과 달리, 함수형 프로그래밍은 함수의 응용을 강조한다. 대부분 람다 대수에 근간을 두고 있으며, 다수의 함수형 언어는 람다 연산을 발전시킨 것으로 볼 수 있다.

Pure Function(순수 함수)

순수 함수 란, Side Effect가 없는 함수를 뜻한다. 즉, 함수 실행이 외부에 영향을 끼치지 않는 함수를 뜻한다. 이러한 성질 덕분에 함수형 언어는 Thread-Safe하고 Concurrency를 지원한다.

Anonymous Function(익명 함수)

익명 함수 란, 이름이 없는 함수를 뜻한다. 전통적인 명령형 언어에서는 모든 함수에 이름이 부여되어야만 했다. 하지만 람다식을 통해 이름없는 함수를 수행할 수 있다.

유의할 점은 익명 함수의 경우 최신 명령형 언어에서도 지원한다. Java의 경우 Java8부터, C++의 경우 C++11 부터, .NET Framework의 경우 LINQ가 추가된 3.5부터 가능하게 되었다.

Higher-Order Function(고계 함수)

고계 함수 란, 함수를 다루는 함수를 뜻한다. 함수형 언어에서는 함수 자체도 ‘값(value)’ 으로 취급한다. 정수를 함수의 인자로 전달할 수 있듯이 어떤 함수도 다른 함수의 인자로 전달할 수 있다. 마찬가지로 함수의 결과 값으로 정수를 반환할 수 있듯이 함수를 반환할 수 있다.

참고 링크


함수형 프로그래밍이 뜨는 이유(The Reason Why Functional Programming is On The Rise)

그렇다면 함수형 프로그래밍이 뜨는 이유는 뭘까? 또 왜 여태까지 뜨지 않았던 것일까?

뜨는 이유

함수형 프로그래밍이 뜨는 이유는 세 가지로 볼 수 있다고 한다.

  • Multi-Core & Concurrency
    • Multi-Core CPU를 장착한 컴퓨터가 대세가 되면서 Multi-Threading을 지원하는 소프트웨어가 필요하게 되었다.
    • 무어의 법칙을 따라 발전하던 CPU가 현실적인 한계에 봉착하자, 수직적 전략을 포기하고 여러 개의 칩이 병렬적으로 동작하도록 만드는 수평적 전략을 선택함.
    • Concurrency를 지원하게 되면서 변경 가능한 데이터(Mutable Data)는 개발자에게 어려움을 가져다 주었다.
    • 함수형 언어의 특징은 데이터가 변경 불가능(Immutable Data)이다. 때문에 Concurrency를 지원하기에 적합하다.
  • 코드의 간결함
    • 객체지향(OOP)를 오랜 시간 사용해온 프로그래머라면 각종 디자인 패턴에 친숙할 것이지만, 함수형 프로그래밍의 관점에서는 디자인 패턴은 우격다짐이다.
    • 필요한 논리 부분과 추상 부분을 구별해내고 패턴에 맞게 구성하는 것은 부수적이고 장식적인 코드가 많아지게 한다.
    • 함수형 프로그래밍의 중요 개념인 Curry, Partial Application, Monad와 같은 기법이 간결하고 우아한 함수의 구성(Composition)을 가능하게 해준다.
  • C#과 Java 같은 기존 언어의 관리모드
    • 기존 언어들이 발전모드에서 관리모드로 접어듦에 따라 프로그래밍 언어와 관련한 새로운 패러다임이 요구되는 현실과 관련이 있다.
    • JVM이나 .NET 플랫폼을 대상으로 여러 언어들이 실험되고 있으며, 실제로 많은 지원이 이루어지고 있다. 때문에 함수형 패러다임은 객체지향 패러다임의 뒤를 이을 새로운 패러다임을 발견하기 위한 전반적인 실험과 암중모색의 와중에 하나의 강력한 대안으로 주목받고 있다.

참고 링크

뜨지 못한 이유

뜨지 못한 이유는 함수형 프로그래밍이 가지는 장점 자체가 단점이기 떄문이라고 한다.

  • Multi-Core & Concurrency
    • Immutable Data Structure는 Thread-Safe를 쉽게 보장하는 대신 ‘오래된’ 데이터를 사용하게 될 수도 있다.
    • Mutable Data Structure는 항상 최신 데이터를 다룬다는 장점이 있지만, Data Consistency를 보장하기 위해 복잡함을 수반한다.
    • 둘 중 어느 것이 낫다고 볼 수 없다.
  • Non-State, No-Side Effect
    • 함수형 프로그래밍은 상태(State)를 배제하여 Side Effect가 없게 동작한다.
    • 하지만 사용자(User)와의 상호작용(Interaction)은 대부분 상태 변화로 모델링된다.
    • 즉, 상태가 없는 함수형 프로그래밍의 한계다.
  • 코드의 간결함
    • 코드가 간결해질 수 있지만, 간결한 코드를 읽기 위해서 학습이 필요하다.
  • 생산성이 올라간다.
    • 함수형 프로그래밍 스타일로 작성할 수 있는 프로그래머를 채용하는데 드는 비용을 상쇄시킬만큼 생산성이 올라야만 한다.
  • 해결할 문제들
    • 세상에는 함수형 프로그래밍 스타일에 적합한 문제도 많지만, 적합하지 않은 문제들도 충분히 많다.

참고 링크


How About Kotlin

Kotlin은 JVM 호환 언어라고 한다. 즉, Kotlin으로 작성된 소스 코드를 컴파일하면 Java Bytecode(.class file)가 생성된다. 아마 Java를 활용하는 모든 곳에 Kotlin을 사용할 수 있을 것이라고 생각된다.

아마 이런 이유 때문에 구글이 Kotlin을 Android 공식 언어로 선택하지 않았나 싶다.

다만 Java의 경우 명령형 언어를 대표하고 Kotlin은 함수형 언어인 만큼, 프로그래밍 패러다임적인 문제가 없을지 궁금하다. 단순히 JVM 위에서 동작한다고 Kotlin을 선택했을까? JVM을 지원하는 언어는 무수히 많은데…