Web

함수형 프로그래밍

bas96 2021. 6. 19. 18:03

프로그래밍 패러다임

프로그래밍 패러다임은 프로그래밍을 할 때 원하는 목표에 따라 적절한 방법과 기법을 활용하도록 합니다.

잘 알려진 최신의 패러다임은 아래의 것들이 있습니다.

  • 명령형 프로그래밍 - 무엇을 할 것인지 보다, 어떻게 할 것인지 설명하는 방식 (How), 알고리즘을 명시하고 목표는 명시 안함
    • 절차 지향 프로그래밍
    • 객체 지향 프로그래밍
  • 선언형 프로그래밍 - 어떻게 할건지 보다 무엇을 할건지를 설명하는 방식 (What), 알고리즘 명시하지 않고 목표만 명시
    • 함수형 프로그래밍

위 3가지 패러다임만 놓고 본다면 절차지향 프로그래밍 -> 객체 지향 프로그래밍 -> 함수형 프로그래밍 순으로 발전하고 있습니다.

 

객체지향 프로그래밍

객체지향 프로그래밍은 프로그래밍에서 필요한 데이트를 추상화시켜 상태와 행위를 가진 객체를 만들고, 그 객체들 간의 유기적인 상호작용을 통해 로직을 구성하는 프로그래밍 방법입니다.

 

객체지향 프로그래밍의 장/단점

 

장점

- 코드 재사용

class를 가져와서 이용할 수 있고 상속을 통해 확장하여 이용할 수 있다.

- 유지보수가 쉬움

수정해야 할 부분이 Class 내부에 맴버 변수 혹은 메서드로 있기 때문에 해당 부분만 수정하면 된다.

 

단점

- 객체가 많으면 용량이 커질 수 있다.

- 설계시 많은 시간과 노력이 필요

- 처리 속도가 상대적으로 느림

 

 

그런데 사실 역사를 놓고 보면 객체지향 프로그래밍보다 함수형 프로그래밍이 더 빨리 나온 사실을 알고계시나요? 

그런데 왜 객체지향 프로그래밍이 먼저 대두되었을까요?

 

절차지향 프로그래밍과 객체지향 프로그래밍은 사람의 사고방식과 가장 비슷한 형식으로 생겼습니다. 또한 Java, Javascript, Python, C++ 등 객체 지향의 언어들이 많이 쓰입니다.(그러나 함수형 프로그래밍으로 사용 가능). 반면 함수형 프로그래밍은 수학적입니다. 

함수형 프로그래밍이 주목받는 이유?

그런데 최근 AI, IoT, 빅데이터, 비트코인 처럼 방대한 데이터를 빠르게 계산하고, 병렬적으로 안정적으로 처리하는 것이 중요해지기 시작했고 함수형 프로그래밍이 주목받기 시작하였습니다.

함수형 프로그래밍의 특징

1. 순수 함수 (Pure Functions)이다.

순수함수란, 동일한 인자를 넣었을 때, 항상 동일한 결과 값을 반환하고 언제 서언되었던지와 상관 없이 외부에 영향을 받지 않도록 작성하는 함수입니다.

함수 안에서 외부의 상태값을 변경한다면, 절차지향적 프로그래밍일 확률이 높습니다. 즉, 함수에서 외부의 상태 값을 참조하거나 외부의 상태를 변경하는 것은 순수함수라고 볼 수 없습니다.

2. 비상태, 불변성을 유지한다. (Stateless, Immutability)

함수에 인자로 전달 된 데이터를 변경하는 것이 아니라, 새로운 버전의 새로운 Object를 만들어서 결과값으로 전달해야합니다.

뢰부의 상태나 함수에 인자로 전달 된 data의 상태를 변경하지 않음으로써, Side Effect를 만들지 않기 때문에 불변성을 유지할 수 있습니다.

 

3. Expressions Only (ex map)

if, switch, for과 같은 여러가지 문장을 쓰는 것은 함수형 프로그래밍이 아닙니다. 

 

4. 일급 함수와 고차 함수의 속성을 가진다. (First -class & Higher-order functions )

함수를 변수에 할당하거나, 함수에 인자로 전달하거나 Return하는 일급함수의 특징과

함수에서 또 다른 함수를 return하는 고차함수, 이 두 가지 속성을 가져야 합니다.

 

함수형 프로그래밍을 사용하는 것이 좋은 것인가? 

그렇다면 프로그래밍 패러다임에 따라 함수형 프로그래밍을 사용하는 것이 좋은것일까요? 

제일 앞에서 프로그래밍 패러다임은 '원하는 목표에 따라 적절한 방법과 기법을 활용'하도록 돕는다고 했습니다. 

 

즉, 내가 하고자 하는 목표에 따라 적절한 것을 사용하는 것이 좋습니다.

또한 React 등의 UI 어플리케이션 특성 상 많은 상태변화가 일어나고 사용하기 때문에 순수 함수 프로그래밍을 구현하는 데에는 한계가 있을 것입니다.