새로운 블로그로 이전 작업을 진행하고 있어 포스트가 새로 작성되고 있지 않습니다.

빠른 시일 내에 새로운 블로그로 인사드리겠습니다.

새로운 블로그 : https://unho.vercel.app/

본문 바로가기
공부 및 정리/프론트엔드

함수형 프로그래밍

by 언호 2022. 3. 14.

함수형 프로그래밍이란?

함수형 프로그래밍은 프로그래밍 관점을 갖게 해주고, 결정하는 역할을 하는 프로그래밍 패러다임의 한 종류입니다.

 


 

프로그래밍 패러다임 분류

명령형 프로그래밍

무엇을 하는지를 나타내기보다 어떻게 할 것인지를 설명하는 방식

  • 절차지향 프로그래밍 (C언어 등)
    수행할 내용들이 순서대로 처리되는 방식
  • 객체지향 프로그래밍 (C++, C#, Java, Python 등)
    객체들의 모임으로 각각의 객체들이 메시지를 주고받고, 데이터를 처리하는 방식

 

선언형 프로그래밍

어떻게 할 것인지를 나타내기보다 무엇을 할 것인지를 설명하는 방식

  • 함수형 프로그래밍 (클로저, 하스켈 등)
    자료 처리를 수학적 함수의 계산으로 취급하고 상태와 가변 데이터를 멀리하는 방식

 

최근 자바스크립트, 파이썬 등에도 함수형 프로그래밍이 가능하도록 추가 되어 학습하게 되었습니다.

 


 

함수형 프로그래밍의 필요성

명령형 프로그래밍은 참조 투명성이 없고, 동일한 코드라도 실행되는 프로그램의 상태에 따라 다른 결과값이 나타날 수 있습니다.

이와 다르게 함수형 프로그래밍은 순수 함수로 구현한다는 특징으로 인하여 함수의 입력값이 x일때 항상 f(x)의 출력값을 갖게 됩니다.

 

관리해야 할 코드가 많아지고 관계가 점점 복잡해진다면, 명령형 프로그래밍은 코드가 실행될 당시의 상황에 따라 다른 결과값이나 원치 않은 부작용이 나타날 수 있습니다. (이러한 상황을 부수효과(side effect)라고 합니다.)

이러한 부수효과(side effect)를 제거하고 항상 동일한 결과값이 나오게 되는 함수형 프로그래밍의 특징으로 인하여 함수형 프로그래밍으로 개발하려고 합니다.

 


 

함수형 프로그래밍의 특징

1. 순수 함수 (Pure Function)

함수형 프로그래밍은 순수함수로 이루어져 있습니다.

 

순수함수는 아래의 특징을 갖고 있습니다.

  • 동일한 입력에 항상 같은 값을 반환하는 함수
  • 함수의 실행으로 인해서 프로그램 실행에 영향을 미치지 않아야 함
  • 함수 실행으로 부수효과(side effect)가 발생하지 않아야 함

부수 효과 (side effect)란, 아래의 상황들이 발생하는 작업을 의미합니다.

  • 외부의 변수가 변경됨
  • 콘솔 로그
  • 화면에 작성
  • 파일에 작성
  • 네트워크에 작성
  • 예외나 오류가 발생하며 실행이 중단됨
  • 자료 구조를 제자리에서 수정

이러한 부수 효과들을 제거한 함수를 순수 함수라고 합니다.

 

아래의 내용은 함수가 전역의 변수들을 참조하고, 전역 변수의 값을 변경시키기 때문에 순수함수가 아닙니다.

let num1 = 10;
let count = 0;

function add(num) {
  count += 1;
  return num + num1;
}

 

그러나 아래의 코드는 전역 변수의 값을 참조하지도 변경시키지도 않기 때문에 순수함수라고 볼 수 있습니다.

function add(num1, num2) {
  return num1 + num2;
}

const result = add(num1, num2);

 

2. 불변성 (Immutability)

함수형 프로그래밍에서는 데이터의 불변성을 유지해야 합니다.

데이터의 변경이 있을 경우, 원본 데이터의 복사본을 만들어 수정하고 복사본을 반환하여 사용합니다.

 

아래의 코드는 데이터를 직접 변경하게 되어 데이터의 불변성을 지키지 못한 경우입니다.

let wallet = { cash: 30000, card: 50000 };

function buyItem(wallet, price) {
  wallet.cash = wallet.cash - price;
  return wallet;
}

 

아래의 코드는 데이터 변경에 복사본을 사용하여 데이터의 불변성을 잘 지킨 경우입니다.

const wallet = { cash: 30000, card: 50000 };

function buyItem(wallet, price) {
  return { ...wallet, cash: wallet.cash - price };
}

const nextWallet = buyItem(wallet, 10000);

 

3. 1급 객체 (First-Class Object)

1급 객체는 아래의 특징을 가집니다.

  • 변수에 할당 할 수 있다
  • 다른 함수를 인자로 전달 받을 수 있다
  • 함수의 결과로 객체를 반환할 수 있다

함수형 프로그래밍에서의 함수들은 1급 객체이기 때문에 함수의 파라미터로 함수를 받거나 반환할 수 있고, 변수에 할당 할 수 있습니다.

 

그리고 1급 객체이기 때문에 아래의 사항들이 가능합니다.

  • 고차함수(Higher order function)을 만들 수 있다
  • 콜백(callback)을 사용할 수 있다

 

4. 합성 함수

합성 함수는 새로운 함수를 생성하거나 다른 로직을 수행하기 위해서 두개 이상의 합수를 결합하여 사용하는것을 말합니다.

이처럼 함수형 프로그래밍에서는 순수 함수들을 서로 결합하여 프로세스를 진행시킵니다.

 


 

함수형 프로그래밍의 장단점

장점

  • 순수 함수를 이용하여 부수효과(side effect)를 줄여 예상하지 못한 오류를 줄일 수 있습니다.
  • 함수 단위의 코드 재사용이 수월합니다.

 

단점

  • 프로그래밍 구현에 다소 시간이 오래걸립니다.
  • 여러 순수함수들을 결합하여 사용하는데 어려움이 존재합니다.

 


 

마치며

함수형 프로그래밍을 접한 이후 학습을 진행하여 자바스크립트를 이용하여 함수형 프로그래밍으로 구현하려 하였지만, 기존에 사용하던 명령형 프로그래밍 방식보다 다소 어려움이 있었습니다.

차츰 이해를 하면서 자바스크립트로 함수형 프로그래밍을 하였을때, React와 비슷한 방식으로 구현이 가능하여 React에 대해 조금 더 이해할 수 있는 시간이였습니다.

 

많은 블로그 글을 참고하면서 느낀것은 함수형 프로그래밍은 분명하게 장점이 있지만, 그렇다고 명령형 프로그래밍 보다 무조건 우월하고 좋다는 것은 아니라는걸 느꼈습니다.

두개의 방식에 모두 장단점이 존재하니, 상황과 프로젝트에 맞게 적절히 선택하는게 좋다고 생각했습니다.

 

 

🗂 참고

 

 

댓글