함수형 프로그래밍에 대해 논하기 전에 프로그래밍 패러다임이 뭔지 알아 봅시다
💡 패러다임
어떤 한 시대 사람들의 견해나 사고를 근본적으로 규정하고 있는 테두리로써의 인식의 체계, 또는 사물에 대한 이론적인 틀이나 체계를 의미하는 개념이다
패러다임 - 위키백과
💡 프로그래밍 패러다임
프로그래머에게 프로그래밍의 관점을 갖게 해 주고, 결정하는 역할
프로그래밍 패러다임 - 위키백과
우리는 흔히 코드를 작성할 때 일관성 있는 코드를 짜야 가독성과 유지보수를 챙길 수 있다고 말하죠
이 일관성을 어떻게 지킬 수 있는 걸까요? 🤔
우리가 코드 전반에 걸쳐 일관적인 원칙과 규칙을 작성할 때, 원칙과 방법이 되는 관점을 패러다임이라고 부릅니다 😵💫
새로운 프로그래밍 패러다임을 통해서는 새로운 방식으로 생각하는 법을 배우게 되고, 이를 바탕으로 코드를 작성하게 됩니다
그 중에서도 가장 유명한 절차지향과 객체지향에 대한 이야기는 많이 들어 보셨을 거라고 생각합니다 🤔
대표적으로 절차지향 프로그래밍 언어에는 C언어, 객체 지향 프로그래밍 언어에는 java가 있죠 !
오늘은 함수형 프로그래밍이란 뭔지 알아 봅시다 🤔

💡 선언형 프로그래밍
어떤 방법으로 해야 하는지를 나타내기보다 무엇을 할 건지 설명하는 방식
선언형 프로그래밍 - 위키백과
명령형 프로그래밍은 프로그래밍의 상태와 상태를 변경시키는 구문의 관점에서 연산을 설명하는 프로그래밍 패러다임의 일종입니다
반면, 선언형 프로그래밍은 선언으로만 프로그램을 동작시키는 것을 의미합니다
프로그램을 실행하기 위해 구체적인 작동 순서를 나열하지 않아도 되고, 어떻게(how) 할 건지보단 무엇(what)을 할 건지 설명하는 방식입니다
fun getPoint(customer: Customer): Int {
for (i in 0..customers.size) {
val c = customers[i]
if (customer == c) {
return c.point
}
}
return NO_DATA
}
fun getPoint(customer: Customer): Int {
if (isRegisteredCustomer(customer)) {
return findCustomer(customer).point
}
return NO_DATA
}
명령형 프로그램에서는 반복문을 돌며 고객의 포인트를 반환하는 반면,
선언형 프로그램에서는 내부가 어떻게 구현되어 있는지는 중요하지 않습니다 🤔
고객의 포인트를 반환한다는 목적이 중요한 거죠 ! 💪
💡 함수형 프로그래밍
자료 처리를 수학적 함수의 계산으로 취급하고 상태와 가변 데이터를 멀리하는 프로그래밍 패러다임
함수형 프로그래밍 - 위키백과
함수형 프로그래밍은 선언형 프로그래밍의 한 종류입니다
구체적인 작업 방식은 라이브러리가 결정하며, 무엇을 수행할 것인지에 집중하죠
거의 모든 것을 순수 함수로 나누어 문제를 해결하며, 작은 문제를 해결하기 위한 함수를 작성하여 가독성을 높이고 유지보수를 용이하게 해 줍니다 💪
따라서 함수형 프로그래밍은 순수 함수를 조합하여 소프트웨어를 만드는 방식이라고도 정의해 볼 수 있겠네요 🤔
그럼 순수 함수가 뭘까요?
순수 함수는 부수 효과(side effect)들을 제거한 함수를 말합니다
함수의 실행이 외부에 영향을 끼치지 않고, 동일한 입력에 대해 항상 동일한 출력을 반환합니다
이러한 특성을 참조 투명성이라고 부릅니다 💪
💡 부수 효과엔 어떤 것들이 있나요?
- 변수의 값이 변경된다
- 자료 구조를 제자리에서 수정한다
- 객체의 필드값을 설정한다
- 예외나 오류가 발생하며 실행이 중단된다
- 콘솔 또는 파일 I/O가 발생한다
함수형 프로그래밍은 순수 함수를 사용해 불변성을 보장하고, 상태 변경으로 인한 버그 발생 가능성을 줄여 줍니다 🔥
(값이 변경되는 것을 허용한다면, 멀티 스레드 환경에서 값의 정확성을 보장하기 힘들겠죠?)
💡 불변성
데이터의 상태를 변경하는 대신, 변경된 새로운 데이터를 생성한다
함수형 프로그래밍의 또 다른 특징으로는 일급 함수가 있습니다
일급 함수란 함수를 일급 객체로 취급하는 것을 말하는데요 ! 🤔
💡 일급 객체
아래 네 가지 조건을 만족하는 객체를 일급 객체라고 부른다
1. 변수나 데이터 구조 안에 담을 수 있다
2. 파라미터로 전달할 수 있다
3. 반환값으로 사용할 수 있다
4. 할당에 사용된 이름과 무관하게 고유한 구별이 가능하다
함수형 프로그래밍에서 함수는 일급 객체로 취급 받기 때문에 함수를 파라미터로 넘기거나, 변수에 저장하는 작업이 가능합니다 ! 🔥
함수를 인자로 받거나 반환할 수 있는 함수를 고차 함수라고 부르며, 함수형 프로그래밍의 중요한 특징입니다 😎
함수형 프로그래밍의 또 다른 특징으로는 지연 실행, 커링, 재귀 등이 있으니 궁금하시면 더 찾아 보시는 걸 추천드립니다 🙃
함수형 프로그래밍을 위한 구현체들이 많이 존재하고, 다양한 API를 제공한다고 합니다
하지만 현재 대부분의 언어가 객체 지향으로 되어 있고, 순수 함수형 언어는 인지도가 낮죠 🤔
함수형 프로그래밍이 객체 지향 프로그래밍보다 좋은 건 아닙니다 😂
높은 수준의 추상화를 제공합니다.
코드가 간결하고 모듈화되긴 하지만, 이해하기 어렵고 복잡해질 수도 있습니다 😵💫
상태 변경을 최소화 하기 때문에 메모리 사용량이 증가하거나, 가비지 컬렉션 비용이 높아질 수 있습니다
( 상태 변경을 하지 않고 매번 새로운 객체를 만드니 메모리 사용량이 증가하겠죠? )
몇몇 최적화 기법들이 함수형 프로그래밍에는 적용하기 힘들다고 합니다
상태 변경이 없다는 가정으로 최적화를 수행하는 것은 제한적 일 수 있습니다
명령형 프로그래밍이 더 직관적이고 표현력이 높을 수 있습니다
상태 변경이 빈번하게 발생하는 경우, 함수형 프로그래밍으로 표현하기 어려운 경우가 많습니다 😵💫
좋은 글 잘 보고 갑니다~~ 😘