함수형 프로그래밍 알아보기
휴먼스케이프 Frontend Software Engineer 남현욱입니다.
함수형 프로그래밍이란 말을 들어보신 적이 있나요? 꽤 오래 전(1930년대)에 나온 개념이지만, 최근들어 개발자 진영에서 높은 관심을 보이고 있습니다. 점점 더 복잡해지는 프로그램 속에서, “어떻게 하면 더 간결하면서도 안전한 프로그램을 만들 수 있을까?” 에 대한 질문 속에서 비롯되었습니다.
사실 한국에서는, 여기저기서 정말 좋다는 이야기만 들어보는 데에서 그치고 배우거나 사용하는 곳을 많이 보지 못했습니다. 아티클도 많이 안 보이고, 혹은 개인이 정말 열심히 배우더라도 실제 프로덕트에 적용하거나 하는 곳도 많이 보이지 않습니다.
그래서 휴먼스케이프 개발팀에서는 함수형 프로그래밍이 공통 교양 과목으로 선정되어 열심히 배울 준비를 하고 있습니다. 과연 어떤 장점이 있길래, 그 장점이 어떤 식으로 드러나길래, 왜 배워야 하길래 공통 교양 과목으로 지정하면서까지 배우려고 할까요?
이번 포스트에서는 순수 함수의 정의, 함수형 프로그래밍의 특징을 알아보면서 그 이유를 설명해드리겠습니다.
순수 함수
수학에서의 함수 y = f(x)는, 어떤 입력값 x에 대해 항상 동일한 출력값 y를 가집니다. 이 개념을 프로그래밍으로 옮긴 것이 순수 함수입니다.
순수 함수의 예시
순수 함수는 동일 입력 시 동일 출력을 보장하며, 부수 효과가 없습니다. 순수 함수가 아닌 것을 예로 들어서 설명하겠습니다.
순수 함수라면 동일 입력 시 동일 출력을 보장해야 합니다. 하지만 globalVariable이라는 변수의 변화에 영향을 받고 있습니다.
순수 함수는 부수 효과를 가지지 않습니다. 하지만 전역 변수 globalVariable의 값이 변경되었습니다.
따라서, 이처럼 함수의 반환값이 아닌 외부 상태에 영향을 주거나 받는 위의 함수들은 순수 함수가 아닙니다. 이런 상황은 전역 변수 뿐만 아니라 파일 불러오기, 네트워크 fetching, 예외 처리 등의 경우에도 생길 수 있습니다.
함수형 프로그래밍의 특징
함수형 프로그래밍은 아래와 같은 특징이 있습니다.
불변성 (Immutable)
참조 투명성 (Referential Transparency)
일급 함수 (First-class Function)
게으른 평가 (Lazy Evaluation)
불변성 Immutable
불변성은 어떤 값의 상태를(메모리에 이미 담긴 상태를) 변경하지 않는다는 뜻입니다. 상태의 변경은 부수 효과를 일으키기 때문에, 함수형 프로그래밍에서는 이를 제한합니다.
위의 코드는 상태가 변경되어 불변성을 지키지 않고 있습니다.
위의 코드는 값을 변경하는 대신 새로운 객체를 만들어 반환하여 불변성을 유지하고 있습니다. 덕분에 부수 효과가 사라졌군요.
불변성에 대해 더 알고 싶으시다면 여기를 참고해주세요.
참조 투명성 Referential Transparency
참조 투명성은 프로그램의 변경 없이도 어떤 표현식을 값으로 대체할 수 있다는 뜻입니다. 즉 함수 f(x)가 y를 반환할 때, f(x)는 y로 대체할 수 있습니다.
위 hello() 함수는 console.log() 및 someName이라는 외부의 값들을 참조하고 있어서 참조에 투명하지 않습니다. someName 이 바뀌면 hello() 의 값도 자연스레 변경되기 때문입니다.
이제 hello() 함수가 항상 일관적으로 반환해서, 참조에 투명한 함수가 되었습니다.
일급 함수 First-class Function
일급 함수를 알아보기 전에, 일급 시민을 알아보겠습니다. 우선 프로그래밍 언어에서 어떠한 대상이 일급 시민이 되려면, 다음 세 가지 조건을 만족해야 합니다.
대상을 함수의 매개변수로 넘길 수 있다.
대상을 함수의 반환값으로 돌려줄 수 있다.
대상을 변수나 자료구조에 담을 수 있다.
여기에서 대상을 객체로 바꾸면 일급 객체의 조건, 대상을 함수로 바꾸면 일급 함수의 조건이 됩니다.
함수를 함수의 매개변수로 넘길 수 있다.
함수를 함수의 반환값으로 돌려줄 수 있다.
함수를 변수나 자료구조에 담을 수 있다.
함수가 일급 함수인 TypeScript
게으른 평가 Lazy Evaluation
일반적인 언어는 코드의 실행 즉시 값을 평가(Eager Evaluation)하지만 함수형 언어에서는 값이 필요한 시점에 평가(Lazy Evaluation)됩니다. 값이 실제로 필요한 시점까지 실행하지 않기 때문에 시간이 오래 걸리는 작업도 손쉽게 동작시킬 수 있습니다.
JS/TS의 Generator
값이 필요한 시점에 평가되기 때문에, 이렇게 무한대의 값도 간단히 표현할 수 있습니다.
함수형 프로그래밍을 했을 때의 장점
함수형 프로그래밍에서는 부수 효과들을 순수한 영역들과 최대한 분리합니다. 이렇게 부수 효과가 생기는 영역과 순수한 영역을 최대한 분리하고 참조에 투명하도록 구성하면, 예측 가능한 코드가 되어 버그가 생길 확률이 줄고 더 안전한 프로그램을 만들 수 있습니다.
또 일급 함수 덕분에, 기능 추가/수정 시 관련이 없는 모듈을 수정할 필요가 없고, 인터페이스를 통해 쉽게 확장할 수 있습니다. 또 클래스나 함수들이 하나의 일만 하기 때문에 재사용성이 높아지며, 의존성 주입을 통해 테스트도 수월하게 할 수 있습니다.
이처럼 간결하고, 안정성 있으며, 효율적인 코드를 작성할 수 있기 때문에 함수형 프로그래밍을 권장합니다.
다음 포스트부터는 함수형 프로그래밍의 세부적인 부분에 관해 하나씩 짚어볼 예정입니다. 감사합니다.
Get to know us better! Join our official channels below.
Telegram(EN) : t.me/Humanscape KakaoTalk(KR) : open.kakao.com/o/gqbUQEM Website : humanscape.io Medium : medium.com/humanscape-ico Facebook : www.facebook.com/humanscape Twitter : twitter.com/Humanscape_io Reddit : https://www.reddit.com/r/Humanscape_official Bitcointalk announcement : https://bit.ly/2rVsP4T Email : support@humanscape.io