IT 개념 정리

[프로그래밍 패러다임] 패러다임 구분과 함수형 프로그래밍

쫑인스 2021. 10. 8. 18:24

포스팅 목적

이 포스팅에서는 프로그래밍 패러다임이 무엇인지 알아봅니다. 주요한 프로그래밍 패러다임을 비교하여 설명하고 그 중 함수형 프로그래밍에 관련된 내용을 알아보겠습니다.

 

프로그래밍 패러다임이란?

프로그래밍 패러다임이란 프로그래밍 관점을 제공해주는 프로그래밍 방식이나 스타일을 말합니다. 프로그래밍 언어별로 특정한 패러다임을 지원하고 여러 가지 패러다임을 지원하기도 합니다. 보통 어떤 기법을 금지하는 제한을 하거나, 어떤 기법을 쓰게하는 하는 지원을 합니다. 패러다임은 프로그래밍 스타일을 말하는 것이기 때문에 종류가 다양합니다. 프로그래밍 언어에 많은 영향을 끼치는 주요한 프로그래밍 패러다임은 아래와 같이 구분할 수 있습니다.

  • 명령형 프로그래밍
     ㄴ 절차적 프로그래밍
     ㄴ 객체지향 프로그래밍

  • 선언형 프로그래밍
     ㄴ함수형 프로그래밍

 

명령형 프로그래밍 VS 선언형 프로그래밍

  • 명령형 프로그래밍은 어떻게 할 것인가에 초점을 둡니다. ( 알고리즘을 명시하고 목표를 명시하지 않음 )
    프로그래밍의 상태와, 상태를 변경시키는 구문의 관점에서 연산을 설명합니다.
function double (arr) { 
    let results = [];
    for (let i = 0; i < arr.length; i++){ 
        results.push(arr[i] * 2);
    } 
    return results;
}
  • 선언형 프로그래밍은 무엇을 할 것인가에 초점을 둡니다. ( 알고리즘을 명시하지 않고 목표를 명시함 )
function double(arr) {
    return arr.map((item) => item * 2);
}

같은 JavaScript 언어를 명령형과 선언형으로 구현한 예제입니다. 선언형으로 구현된 아래에 있는 예제는 map 메서드를 사용하여 무엇을 할 것인가에 초점을 두었습니다. 그런데 map 메서드는 내장되어 있기는 하지만 명령형으로 구현되어 있습니다. 선언형 프로그래밍은 모든 구현을 선언형으로 하는 것은 아닙니다. 추상화된 메서드를 사용하기 때문에 가독성이 높고 재사용성이 높습니다.

 

절차적 프로그래밍 VS 객체지향 프로그래밍

절차적 프로그래밍은 데이터의 순서를 파악하고 필요한 기능을 함수로 만들어 진행시키는 방법입니다. 과거 지금과 같이 큰 규모의 소프트웨어가 필요하지 않을 당시에는 문제가 없었지만 복잡한 알고리즘을 절차적 프로그래밍으로 개발하면 순서가 꼬이고 동작을 이해할 수 없어집니다. 그래서 절차적 프로그래밍 언어들도 객체지향의 특징을 가져오기 시작했습니다. 대표적인 예로 C++ 이 있습니다.

반면에 객체지향 프로그래밍은 기능을 묶어 하나의 객체로 만듭니다. 두 개념은 상반되는 것이 아닙니다. 모든 언어는 절차적이지만 여기에 객체라는 기능을 얼마나 지향 하느냐에 따라 객체지향이라고 할 수 있느냐 없느냐가 나뉩니다.

 

함수형 프로그래밍이란?

함수형 프로그래밍을 이해하기 위해서는 순수함수와 1급 객체가 무엇인지 먼저 알아야 합니다.

순수함수

  • 동일한 인자를 주었을 때 항상 값은 값을 retrun 하고, retrun 값으로만 소통
  • 부수 효과가 없는 함수
     ㄴ 변수의 값이 변경됨
     ㄴ 자료 구조를 제자리에서 수정함
     ㄴ 객체의 필드값을 설정함
     ㄴ 예외나 오류가 발생하며 실행이 중단됨
     ㄴ 콘솔 또는 파일 I/O가 발생함

 

1급 객체

  • 변수나 데이터 구조 안에 담을 수 있다.
  • 파라미터로 전달 할 수 있다.
  • 반환값으로 사용할 수 있다.
  • 할당에 사용된 이름과 무관하게 고유한 구별이 가능하다.

함수형 프로그래밍은 순수 함수를 1급 객체로 간주하여, 참조 투명성을 지키는 패러다임입니다. 데이터 변경이 불가능하기 때문에 기존 데이터의 복사본을 만들어 주는 method가 필요합니다. 명령형 프로그래밍과 함수형 프로그래밍은 함수의 부수 효과 유무에 가장 큰 차이가 있습니다. 순수 함수를 조합하여 소프트웨어를 만드는 방식으로 클로저, 하스켈, 리스프 등의 언어가 함수형 프로그래밍 패러다임을 가지고 있습니다.

 

함수형 프로그래밍의 장점

  • SideEffect를 발생시키지 않아 여러 스레드에서 접근하더라도 동시성 작업을 쉽고 안전하게 구현할 수 있습니다.
  • 순수 함수는 프로그래머가 모든 것을 예측하고 통제할 수 있기 때문에 디버그와 테스트가 쉽습니다.
  • 참조 투명성으로 인해 메모이제이션 최적화가 가능합니다.
     ㄴ 메모이제이션 (memoization) : 함수 결과를 캐싱하는 최적화 방법입니다.

 

참고 자료