함수형 프로그래밍?

Date
2021/04/07
Tags
Dev
Created by
그래서 그게 뭔데!
Table of Contents

함수형 프로그래밍은 매우 실용적이다

객체지향 프로그래밍에서는 개체가 기준이라면 함수형 프로그래밍에서는 함수가 기준이다.
객체가 기준이라는 말은 데이터 형이 기준이 된다는 의미이고, 함수가 기준이라는 말은 로직이 기준이 된다는 의미다.
객체지향 프로그래밍이 데이터 형을 설계한 후 데이터 형에 맞는 메서드를 붙여 가는 식이라면, 함수형 프로그래밍은 함수로 로직을 설계한 후 로직에 맞는 데이터를 인자로 사용한다.
함수형 프로그래밍은 각기 다르게 생긴 데이터 형을 더 많이 지원하기 위해 함수 내부를 함수로 추상화한다. 덕분에 함수 하나가 처리할 수 있는 데이터 형은 끝이 없다. 함수형 프로그래밍에서는 데이터가 user인지 post인지 posts인지 comments인지는 별로 중요하지 않으며, 모두 처리할 수 있는 아주 높은 다형성(polymorphism)을 가진 하나의 함수를 만드는 방식으로 프로그래밍을 한다.
함수형 프로그래밍은 코드가 짧다. 메서드가 계층 구조의 상속이나 인스턴스 생성으로 기능을 공유해야 한다면, 함수는 혼자 존재하기에 아무렇게나 조합하면 된다. 데이터 형에서 자유롭고 조합이 자유로워 재사용성과 조합성이 매우 높다. 함수형 프로그래밍으로 작성된 코드를 보면 데이터의 생김새가 잘 보이지 않는다. 추상화의 정도가 높아 데이터 형이 코드에 잘 등장하지 않고 변수 명이나 데이터의 구조가 표현되는 일이 적다. 이런 점들 때문에 코드가 매우 짧아진다.
함수형 프로그래밍은 읽기 쉽다. 일단 분기가 적고 for i j while 같은 구조가 잘 등장하지 않아서 코드의 모양이 단순하다. 다양한 형을 지원함에도 보조 함수의 조합을 통해 분기를 대신하기에 if문도 적다. 위에서 아래로, 왼쪽에서 오른쪽으로 읽히는 코드는 읽기 쉽다. 분기 없이 앞으로만 가는 코드는 오류가 발생할 확률도 적고 고치기도 쉽다.
짧고 읽기 좋은 코드도 중요한 가치이지만 좀 더 고상한 이점이 있다. 인자 선언이나 변수 선언이 적어진다는 점이다. 코드에 인자와 변수가 등장하지 않고 함수의 내부 ({statement})가 보이지 않는다는 것은 새로운 상황도 생기지 않는다는 말이다. 새로운 상황이 생기지 않는다는 것은 개발자가 예측하지 못할 상황이 없다는 말이다. 에러 없는 함수들이 인자와 결과에 맞게 잘 조합되어 있다면 전체의 결과 역시 에러가 날 수 없다. 상태를 공유하지 않는 작은 단위의 함수들은 테스트하기도 쉽고 테스트 케이스를 작성하기도 쉽다.
함수형 프로그래밍은 생명주기가 단순하다. 선언실행이라는 단순한 생명주기를 갖기 때문에 언제든지 어디서든지 사용하기 쉽다. 함수는 언제 선언되었는가, 어느 스코프에서 선언되었는가, 언제 실행되었는가, 언제 실행될 것인가만 중요하다. 또한 대부분의 함수들은 만든 이가 담은 설계, 철학과 같은 추가적인 개념들이 적어서, 빨리 이해할 수 있고 쉽게 사용할 수 있다. 누가 만든 함수이든 인자와 결과만으로 가볍게 소통할 수 있다.

누가 함수형 프로그래밍을 정의할 수 있겠는가?

최근 들어 함수형 프로그래밍은 빠르게 발전하고 있으며 실전에서의 의미를 찾아가는 과정에 있다.
함수형 패러다임 등의 용어들은 '최종적인 의미를 획득하기 위한 여정을 끝마치지 않은 상태'
함수형 프로그래밍은 '오래된 뿌리를 갖고 있는 오래된 미래'
함수형 프로그래밍의 정의: '우리도 정답을 모른다. 함수형 프로그래밍은 명확한 정의가 없는 컴퓨팅 용어 중 하나', '컴퓨터 과학 전문가의 정의들끼리도 종종 서로 모순되기도 한다'
'어떤 사람이, 어떤 책이, 또는 어떤 언어가 함수형 프로그래밍에 대한 권위를 주장할 수 있겠는가?'
'함수형 프로그래밍은 애플리케이션, 함수의 구성 요소, 더 나아가 언어 자체를 함수처럼 여기도록 만들고, 이러한 함수 개념을 가장 우선순위에 놓는다. 함수는 (값으로 다룰 수 있어서) 다른 데이터들과 마찬가지로 저장이 가능하고, 전달하거나, 리턴 받을 수도 있다. 이것이 함수형 프로그래밍의 가장 중요한 개념이다.'
'함수형 사고방식은 문제의 해결 방법을 동사(함수)들의 구성으로 접근한다.'

모든 프로그래밍 패러다임은 성공적인 프로그래밍을 위해 존재한다

성공적인 프로그래밍은 좋은 프로그램을 만드는 일이다. 좋은 프로그램의 척도에는 사용성, 성능, 확장성, 기획 변경에 대한 대응력 등이 있으며, 이것들을 효율적이고 생산적으로 이루는 일이 성공적인 프로그래밍이다.
함수형 프로그래밍은 성공적인 프로그래밍을 위해 부수 효과를 최대한 멀리하고 조합성을 강조하는 프로그래밍 패러다임이다. 함수형 프로그래밍이 부수 효과를 최대한 멀리하는 이유는 다음 두 가지를 위해서다.
하나는 오류를 줄이기 위해서고, 또 하나는 조합성 혹은 모듈화 수준을 높이기 위해서다.
오류가 없는 것은 좋은 프로그램의 가장 중요한 척도이고, 높은 모듈화 수준은 성공적인 프로그래밍의 핵심 요소다. 높은 모듈화 수준은 생산성을 높이고, 오류 없는 함수들의 조합은 프로그램 전체의 안정성을 높여 준다.

작게 쪼개기

작게 쪼개다 보면 정말 쓸모 없어 보이는 함수가 많이 나오기도 한다. 그래도 더 작은 단위로 쪼개 보라. 재사용성이 높고 재밌는 코드들이 나올 것이다. 제어문 대신 함수를, 값 대신 함수를, 연산자 대신 함수를 사용해 보자. 프로그래밍에 대한 새롭고 재밌는 아이디어들을 만나게 될 것이다.

References

함수형 자바스크립트 프로그래밍 | 유인동 저 | 인사이트