기록

함수형 프로그래밍

해은 2020. 10. 18. 23:51

프로그래밍 패러다임

프로그래밍 패러다임은 프로그래머에게 프로그래밍의 관점을 갖게하고 결정하는 역할을 한다.

  • 명령형 프로그래밍: 프로그래밍의 상태와 상태를 변경시키는 구문의 관점에서 연산을 설명하는 방식
    • 절차지향 프로그래밍: 수행되어야 할 연속적인 계산 과정을 포함하는 방식 (C, C++)
    • 객체지향 프로그래밍: 객체들의 집합으로 프로그램의 상호작용을 표현 (C++, Java, C#)
  • 선언형 프로그래밍: 어떤 방법으로 해야 하는지(How)를 나타내기보다 무엇(What)과 같은지를 설명하는 방식
    • 함수형 프로그래밍: 순수 함수를 조합하고 소프트웨어를 만드는 방식 (클로저, 하스켈, 리스프)

"명령형 프로그래밍은 어떻게 할 것인가(How)를 표현하고, 선언형 프로그래밍은 무엇을 할 것인가(What) 표현한다."

 

함수형 프로그래밍(Function Programming)

: 순수함수와 보조 함수의 조합을 통해 로직내에 존재하는 조건문과 반복문을 제거하여 복잡성을 해결하고 변수의 사용을 억제하여 상태 변경을 피하려는 프로그래밍 패러다임이다.

 

순수함수란? 

순수함수는 같은 입력이 주어지면, 같은 출력을 반환해야하고, side effect(부작용) 이 없어야한다.
결국, 함수형 프로그래밍은 순수함수를 통해 sideeffect를 최대한 억제하여 오류를 피하고 프로그램의 안정성을 높이려는 노력의 한 방법이다.


객체지향 프로그래밍과 함수형 프로그래밍의 가장 큰 차이점은 무엇인가

객체지향은 객체 안에 상태를 저장하고, 이 상태를 이용해서 메소드를 추가하고 상태변화를 설정하고 조정하기위해 다양한 기능을 사용한다. 이에 반해 함수형 프로그래밍은 상태를 제어하는것보다 상태를 저장하지 않고 없애는데 주력한다.
예를들면, 객체 지향은 상태를 저장하는 필드와 그 필드들을 이용해 기능을 제공하는 메소드를 만들고 클래스를 만듭니다. 반면 함수형은 몇몇 자료구조(list, map, set) 등을 이용해 최적화된 동작을 만들어낸다.

함수형 프로그래밍의 장점

1. 동시성 프로그래밍

"반도체 회로의 성능은 18개월마다 2배씩 빨라진다"는 무어의 법칙에 대해 한번쯤은 들어봤을 것이다. 그리고, 이 법칙이 2000년대 중반쯤 깨졌다는 것도 알고 있을 것이다.
반도체 성능 향상의 한계에 다다르자, 최근 CPU 회사들은 하나의 칩 속도를 높이는 방식 대신, 여러 개의 칩이 병렬적으로 동작하도록 하여 성능을 높이는 방식을 선택하고 있으며, 이로 인해 어플리케이션 코드는 멀티스레드를 이용하여, CPU 의 코어를 최대한 활용해야만 하는 환경이 되었다.

 

명령형 프로그래밍(Imperative programming) 에서 멀티스레드를 활용한 동시성 프로그래밍은 개발자들을 아주 힘들게 하는 것 중 하나다. 그 유명한 "식사하는 철학자들"의 문제에서 보듯이 동시성 프로그래밍은 교착상태(deadlock)에 빠질 위험이 존재하며, 물론 해결책은 있지만 복잡하기도 하고 고려해야할 요소들이 많다.

 

명령형 프로그래밍에서 이러한 문제가 발생하는 주 원인은 스레드 간에 공유되는 데이터나 상태 값이 변경 가능(mutable)하기 때문이다.
하지만, 함수형 프로그래밍에서는 사용하는 모든 데이터가 변경 불가능(immutable)하고 함수는 부수 효과를 가지고 있지 않다. 때문에, 여러 스레드가 동시에 공유 데이터에 접근하더라도 해당 데이터가 변경될 수 없기 때문에 동시성과 관련된 문제를 원천적으로 봉쇄한다.

 

2. 함수는 입력과 그에 따른 출력이 있을 뿐이다

함수는 내부적으로 어떠한 상태값도 가지지 않으며, 단지 입력에 대한 출력만을 책임질 뿐이다. 이러한 특징 덕분에 코드를 테스트하기 쉽고, 함수가 하는 일이 명확하기 때문에 함수의 시그니처(signature)를 좀 더 의미있게 정할 수 있고, 이는 코드를 읽기 좋게 하는 장점을 가지게 한다.

 

3. 함수는 값(value)처럼 쓰일 수 있다

함수가 값처럼 쓰일 수 있기에 어떤 함수는 입력 또는 출력이 함수가 될 수 있다. 이러한 함수를 고차함수(higher-order function)라 하는데, 이 덕분에 함수들의 결합, 조합이 쉬워질 뿐만 아니라, 좀 더 간결한 코드를 만들 수 있다. 익명함수를 사용할 수 있다는 점도 이런 장점을 배가시킨다.

 

출처

ruaa.me/why-functional-matters/

velog.io/@kyusung/%ED%95%A8%EC%88%98%ED%98%95-%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%B0%8D-%EC%9A%94%EC%95%BD

 

왜 함수형 프로그래밍이 좋을까?

함수형 프로그래밍이란? 일반적인 정의를 내리자면, 프로그래밍의 여러 패러다임 중 하나이며, 함수를 이용하여 프로그래밍 하는 것을 의미한다. John Hughes 는 1990년에 쓴 "Why Functional Programming Mat

ruaa.me

 

'기록' 카테고리의 다른 글

JS Prototype  (0) 2020.10.26
크롬 input 태그에 자동생성 백그라운드 색 제거하기  (0) 2020.10.21
PWA (Progressive Web App)  (0) 2020.10.03
크롬에서 프린트시 배경색이 나오도록 하기  (0) 2020.09.16
mark tag  (0) 2020.09.15