메뉴 바로가기 검색 및 카테고리 바로가기 본문 바로가기

한빛출판네트워크

한빛랩스 - 지식에 가능성을 머지하다 / 강의 콘텐츠 무료로 수강하시고 피드백을 남겨주세요. ▶︎

IT/모바일

자바도 함수형 언어다: 문제 해결에 대한 새로운 접근 방식

한빛미디어

|

2024-03-29

|

by 벤 바이디히

6,072

새로운 경험에 의해 확장된 사고는 결코 이전으로 돌아갈 수 없다.

— 올리버 웬들 홈스 주니어Oliver Wendell Holmes, Jr

 

소프트웨어 개발은 매우 복잡한 작업이라서 많은 자바 개발자가 복잡성을 극복하기 위해 객체 지향 프로그래밍 object-oriented programming (OOP)을 이용합니다. 객체 지향 프로그래밍에서는 개발하고자 하는 대상을 자료 구조로 표현하며, 주로 명령형 코딩 스타일을 통해 프로그램의 상태를 관리합니다. 객체 지향 프로그래밍은 가장 유명하고 검증된 프로그래밍 패러다임 중 하나이지만 항상 최적의 해결책이 되지는 않습니다. 오히려 모든 문제에 이 원칙을 적용하다 보면 프로그램이 더 복잡해질 수도 있습니다. 따라서 상황에 적합한 도구와 패러다임을 선택해야 합니다. 이러한 맥락에서 함수형 프로그래밍 functional programming (FP) 패러다임은 문제 해결에 대한 새로운 접근 방식을 제안합니다.

 

함수형 프로그래밍은 새로 나온 개념이 아닙니다. 실제로 객체 지향 프로그래밍보다 훨씬 오래된 개념으로 1950년대 리스프 Lisp라는 프로그래밍 언어에서 처음 소개되었습니다. 함수형 프로그래밍은 과거에 학계와 특정 분야에서만 사용되었지만 최근 들어 관심이 증가하고 있죠.

 

다양한 함수형 언어가 지금도 계속 등장하고 있으며, 비함수형 언어non-functional language들도 각자 나름의 함수형 기능들을 제공하고 있습니다. 함수형 프로그래밍의 아이디어와 개념들은 이미 대부분의 다중 패러다임과 범용 언어에서 채택되어, 상황이나 프로그래밍 언어에 관계없이 함수형 프로그래밍을 사용할 수 있게 되었습니다. 

 

새로운 하드웨어에는 새로운 사고방식이 필요하다

 

하드웨어는 새로운 패러다임으로 변화하고 있습니다. 이전 프로세서 세대와 비교했을 때, 오랜 시간 동안 단일 코어의 성능 향상은 크게 눈에 띄지 않았습니다. 무어의 법칙이 한계에 부딪힌 것처럼 보이지만, 하드웨어의 기술 발전이 멈췄다는 의미는 아닙니다.

 

업계에서는 단일 코어의 성능과 처리량 향상에 주력하기보다는 코어의 수를 증가시키는 데 더 큰 관심을 두고 있기 때문입니다. 따라서 더 빠른 처리 속도가 아닌, 더 많은 코어를 가진 새로운 하드웨어의 장점을 최대한 살리기 위해 현대의 프로그램에서 작업 방식을 고민해 볼 필요가 있습니다. 즉, 생산성을 저해하거나 복잡성을 증가시키지 않으면서 더 많은 코어를 효율적으로 활용할 수 있는 방법에 대해 기술적으로 고민해야 하죠.

 

 

객체 지향 프로그래밍에서는 병렬 처리를 통한 소프트웨어의 수평 확장이 쉽지 않습니다. 또한 병렬 처리는 많은 문제를 해결하는 데 도움을 주지만, 모든 문제의 해답이 되지는 않습니다. 

 

예를 들어 방을 빠르게 페인트 칠하기 위해서는 더 많은 인부를 고용하면 도움이 되지만, 임신 기간을 단축시키기 위해 더 많은 의사와 협력한다고 해서 임신 기간을 단축시킬 수는 없습니다. 문제가 순차적이거나 상호 의존적인 작업으로 구성되는 경우엔 병렬성parallelism보다 동시성concurrency이 더 적절할 수 있습니다. 

 

그러나 문제가 간단하고 서로 관련이 없는 하위 문제로 분할할 수 있는 경우에는 병렬 처리가 훨씬 효과적입니다. 이러한 경우에 함수형 프로그래밍이 유용하게 사용될 수 있습니다. 함수형 프로그래밍의 고유한 특징에는 비상태성과 불변성이 있는데, 병렬성 및 동시성 처리 환경에서 작고 안정적이고 재사용 가능하며 고품질 작업을 하는 데 필요한 모든 도구를 제공합니다

 

여러분이 이러한 ‘함수형 사고방식’을 염두에 둔다면 일상적으로 직면하게 되는 문제들을 이전과는 다른 방식으로 해결하고, 프로그램을 보다 쉽고 안전하게 확장할 수 있습니다. 다음으로, 자바가 함수형 프로그래밍에 더 좋은 선택이 될 수 있는 이유에 대해 살펴보겠습니다.

 

자바도 역시 함수형 언어다

많은 언어가 함수형 프로그래밍에 적합합니다. 여러분이 명령형 코딩 스타일을 거의 사용하지 않는 순수 함수형 언어를 선호한다면 하스켈Haskell 이 마음에 들 것입니다. 그리고 얼랭 가상 머신을 활용하기 위한 엘릭서Elixir 라는 선택지도 있습니다. 

 

함수형 프로그래밍이 가능한 언어를 찾기 위해 광활한 JVM 생태계를 떠날 필요가 없습니다. 스칼라 Scala 는 객체 지향 프로그래밍(OOP)과 함수형 프로그래밍(FP) 패러다임을 효과적으로 결합한 고급 프로그래밍 언어입니다. 또 다른 인기 있는 선택지 중 하나인 클로저 Clojure 는 처음부터 동적 타입 시스템을 염두에 두고 함수형 언어로 설계되었습니다.

 

이상적인 세계라면 다음 프로젝트에 사용할 함수형 언어를 선택할 수 있는 행운이 있겠지만, 인생은 실전입니다. 여러분이 사용할 언어에 대한 선택권이 전혀 없는 제한된 상황에서 프로젝트를 수행해야 하는 경우가 더 많습니다.

 

자바 개발자로서 여러분은 역사적으로 함수형 프로그래밍에 적합하지 않다고 여겨지던 자바를 사용하고 있을 것입니다. 이야기를 계속 진행하기에 앞서 강조하고 싶은 점은, 프로그래밍 언어의 수준과는 관계없이 대부분의 함수형 원칙을 구현할 수 있다는 것입니다. 여러분의 코드는 애초에 함수형 언어로 설계된 다른 프로그래밍 언어들처럼 간결하고 이해하기 쉽지 않을 수 있습니다. 이러한 문제점은 자바가 더 생산적인 접근 방식과 더 나은 문제 해결법을 제시했음에도 불구하고, 많은 개발자가 자바에 함수형 원칙을 적용하려고 시도하는 것을 망설이게 합니다.

 

과거에는 많은 사람이 자바를 ‘사라지기에는 너무 커진’ 엔터프라이즈 언어이며, 코볼 COmmon Business-Oriented Language (COBOL)이나 포트란Fortran의 현대 버전으로 여겼습니다. 릴리스 주기가 빠르지 않아 자바 6에서 자바 7로 업그레이드되기까지 무려 5년이라는 시간이 걸렸죠. 또한 try-with-resource와 같이 새로운 기능이 있었지만, 그중 어느 것도 획기적이지 못했죠. 과거의 느린 업데이트로 인해 프로젝트와 개발자들은 ‘최신이자 최고’인 자바 개발 키트Java Development Kit (JDK)를 채택하지 않게 되었고, 언어를 개선할 수 있는 수많은 기회를 놓치게 되었습니다. 

 

그로부터 3년 후, 2014년에 그다음 버전인 자바 8이 출시되었습니다. 이번에는 자바 역사상 가장 중요한 변화 중 하나인 람다 표현식을 발표했습니다. 세계에서 가장 유명한 객체 지향 프로그래밍 언어인 자바에 함수형 프로그래밍을 효과적으로 도입할 수 있는 기반이 마련되었으며, 이로 인해 언어와 관용구에 큰 변화가 찾아왔습니다.

람다 표현식의 도입
자바8부터 도입된 람다 표현식과 자바의 함수형 기능 도입 덕분에 JDK의 새로운 기능들은 간결하고 직관적인 방식으로 구현할 수 있게 되었습니다.
Runnable runnable = () -> System.out.println("hello, functional world!");

 

람다 표현식의 도입은 자바에서 함수형 프로그래밍을 보다 더 완성도 있는 언어로 만들고, 런타임 기능으로 사용할 수 있게 하는 데 큰 의미가 있었습니다. 게다가 이를 통해 자바 개발자들은 새로운 아이디어와 개념에 접근할 수 있게 되었습니다. 스트림stream, Optional, CompletableFuture와 같은 JDK의 새로운 기능들은 람다 표현식과 자바의 함수형 기능 도입 덕분에 간결하고 직관적인 방식으로 구현할 수 있게 되었습니다.

 

자바에서 함수형 프로그래밍을 통해 소개되는 새로운 관용구와 방식은 기존의 객체 지향 프로그래밍에 익숙한 경우에는 낯설게 느껴질 수 있습니다. 함수형 사고방식을 익힌다면, 완전하게 함수형으로 전환하지 않고도 코드를 개선하는 방법을 익힐 수 있습니다.


위 콘텐츠는 『함수형 프로그래밍 with 자바』 서문에서 내용을 발췌하여 작성하였습니다. 

 

자바 8 이후에 도입된 람다 표현식과 다른 기능들 덕분에 많은 도구를 쉽게 사용할 수 있게 되었습니다. 하지만 람다, 스트림, 자바에서 제공하는 많은 함수형 기능은 쉽게 이해할 수 있지만 왜 그리고 언제 사용해야 하는지, 언제 사용하면 안 되는지에 대한 깊은 이해 없이는 이 기능들을 충분히 활용할 수 없습니다.

 

언어를 함수형으로 만드는 다양한 개념과 JDK에서 제공하는 도구 또는 직접 생성한 도구들을 사용해 자바 코드에 결합하는 방법을 익히고, 더 간결하고 합리적이며 미래 지향적인 코드를 작성하고자 한다면 『함수형 프로그래밍 with 자바』 을 확인해 보세요.

 

함수형 프로그래밍 with 자바
댓글 입력
자료실

최근 본 상품0