컴퓨터가 이해할 수 있는 코드는 누구나 작성할 수 있습니다.
하지만 훌륭한 개발자는 사람이 이해할 수 있는 코드를 작성합니다.
— 마틴 파울러, 『리팩터링 2판』(한빛미디어, 2020)
대부분 프로그래밍 언어는 함수형과 명령형 코드 스타일을 모두 지원합니다. 그러나 프로그래밍 언어의 문법과 기능들은 대체로 일반적인 문제에 대해 특정한 접근 방식을 권장합니다. 가령 책 <함수형 프로그래밍 with 자바>에서는 다양한 JDK의 함수형 기능을 소개하지만 자바는 여전히 명령형과 객체 지향 프로그래밍을 선호하며, 대부분의 핵심 라이브러리에서 사용 가능한 타입과 자료 구조는 이러한 경향을 반영하고 있습니다.
하지만 반드시 하나를 선택해야 하는 것은 아닙니다. 완전히 함수형으로 전환하지 않더라도 객체 지향 코드에 함수형 원칙을 적용할 수 있습니다. 두 가지 방식의 장점을 모두 활용할 수 있다면 이 방식을 도입해야 하지 않을까요? 이를 위해선 함수형 사고방식을 갖는 것이 중요한데요. 함수형 사고방식을 살펴보기 전에 객체 지향 프로그래밍과 함수형 프로그래밍을 비교해보고자 합니다.
함수형 원칙이 코드를 어떻게 개선할 수 있는지 더 잘 이해하기 위해서는 객체 지향과 함수형 패러다임의 기본 원칙을 다시 살펴보는 것이 좋습니다. 이 과정을 통해 두 패러다임의 공통점과 차이점을 파악한다면 객체 지향 코드에 함수형 접근 방식을 적용할 기회를 얻을 수 있습니다. 또한 어떤 경우에 두 패러다임을 통합하는 것이 부적합한지도 파악할 수 있습니다.
객체 지향 프로그래밍은 데이터와 동작의 캡슐화, 다형성, 추상화에 집중합니다. 이는 객체와 연결된 코드가 특정 문제 영역을 모방하도록 함으로써 비유를 기반으로 한 문제 해결 방식을 제공합니다.
이 객체들은 인터페이스와 같은 공개 계약을 통해 메시지를 교환하며 상호작용하고, 각각 자신의 역할을 갖고 스스로의 상태를 관리합니다. 이러한 비유 기반 접근 방식metaphor-based approach을 사용하여 컴퓨터가 요구하는 일련의 지시와 개발자가 자신의 의도를 명확하게 표현하는 것 사이의 간극을 좁히는 데 도움을 줍니다.
OOP는 ‘현실 세계’의 끊임없는 변화에 맞춰 명령형 코드를 구조화하고 조직화하는 데 매우 효과적인 접근 방식입니다.
반면, 함수형 프로그래밍은 수학적 원리를 사용하여 문제를 해결하고 선언적 코드 스타일을 채택합니다. ‘현실 세계’와 같은 비유를 사용하여 코드를 모델링하는 대신 그 근간이 되는 람다 계산법은 자료 구조와 고차원 추상화를 사용한 변환에 집중합니다.
함수는 입력을 받고 출력을 생성할 뿐입니다. 그게 전부입니다! 데이터와 동작은 캡슐화되지 않습니다. 함수와 자료 구조는 그 자체로 존재합니다. 함수형 프로그래밍은 변경 가능한 상태를 동시성 환경에서 처리하거나 예상치 못한 사이드 이펙트와 같은 전형적인 객체 지향 프로그래밍과 자바의 문제들을 피하기 위해 노력합니다.
이 두 가지 짧은 요약에서 이미 객체 지향과 함수형 프로그래밍의 핵심 원칙 사이의 차이점을 나타내고 있습니다. 객체 지향 프로그래밍(OOP)은 코드의 움직이는 부분을 친숙한 도메인에 캡슐화하여 복잡성을 다루는 반면, 함수형 프로그래밍(FP)은 수학적 원칙을 따르면서 전체적으로 부품의 수를 줄입니다. FP의 추상적인 사고방식 때문에 자바를 가르치고 배울 때 OOP가 종종 선호되곤 합니다.
우리가 잊지 말아야 할 사실은, 두 패러다임은 서로 다른 방향에서 동일한 문제를 해결하는 다른 접근 방식일 뿐이라는 겁니다. 한 원칙이 다른 원칙보다 객관적으로 우월하다고 이야기하는 것은 현명하지 않습니다. 객체 지향의 비유는 개발자 뿐만 아니라, 개발자가 아닌 사람에게도 코드를 더 자연스럽게 느끼게 하는 강력한 도구입니다. 일부 복잡한 문제들은 아마 더 간결하지만 고도로 추상화된 함수형 접근 방식보다 비유적인 표현 방식에서 더 큰 이점을 얻기도 합니다.
함수형 도구들을 모두 갖추고 있어도, 함수형을 효과적으로 사용하기 위해서는 올바른 사고방식이 필요합니다. 함수형 사고방식을 갖고 있다는 것은 코드를 함수형 접근 방식으로 개선할 수 있는지 식별할 수 있는 지식을 갖고 있다는 것을 의미합니다. 코드를 완전히 함수형으로 전환하든지, 중요하고 적절한 곳에 몇 가지 함수형 기술과 원칙을 적용하든지 말이죠. 이러한 사고방식은 쉽게 얻어지지 않으며, 경험과 직관을 쌓기 위해 지속적인 연습과 노력이 필요합니다.
위 콘텐츠는 『함수형 프로그래밍 with 자바』 에서 내용을 발췌하여 작성하였습니다.
언어를 함수형으로 만드는 다양한 개념과 JDK에서 제공하는 도구 또는 직접 생성한 도구들을 사용해 자바 코드에 결합하는 방법을 익히고, 더 간결하고 합리적이며 미래 지향적인 코드를 작성하고자 한다면 『함수형 프로그래밍 with 자바』 을 확인해 보세요.
이전 글 : 자바도 함수형 언어다: 문제 해결에 대한 새로운 접근 방식
다음 글 : 켄트 벡이 말하는 “코드 정리가 필요한 이유”
최신 콘텐츠