함수형 프로그래밍이란?

y30n9ju1v·2021년 8월 15일
0

프로그래밍

목록 보기
1/18

이 글은 아래 두 페이지 글을 번역한 것입니다.

함수형 프로그래밍이란

함수형 프로그래밍은 모든 것을 순수한 수학 함수 스타일로 묶는 프로그래밍 패러다임입니다.
이것은 선언적 프로그래밍 스타일입니다. 그 주요 초점은 '어떻게 해결할 것인가 "이며, 주요 초점이"어떻게 해결할 것인가 "인 명령형과는 대조적입니다.
명령문 대신 표현식을 사용합니다. 표현식은 값을 생성하기 위해 평가되는 반면 명령문은 변수를 할당하기 위해 실행됩니다.
이러한 기능에는 아래에 설명된 몇 가지 특별한 기능이 있습니다.

함수형 프로그래밍은 람다 계산법에 근거하고 있습니다.

람다 계산법은 함수를 사용하여 계산을 연구하기 위해 알론조 처치에 의해 개발된 프레임 워크입니다.
세계에서 가장 작은 프로그래밍 언어로 계산 가능한 것에 대한 정의를 제공합니다.
람다 계산법으로 계산할 수 있는 것은 모두 계산 가능합니다. 계산 능력은 튜링 머신과 동일합니다.
람다 계산법은 함수와 그 평가를 설명하기 위한 이론적 프레임 워크를 제공합니다.
이것은 현재 거의 모든 함수형 프로그래밍 언어의 기초를 형성하고 있습니다.
Fact: Alan Turing은 명령형 프로그래밍 스타일의 토대를 마련 튜링 기계를 만든 Alonzo Church 학생이었습니다.

함수형 프로그래밍을 지원하는 프로그래밍 언어

Haskell, JavaScript, Python, Scala, Erlang, Lisp, ML, Clojure, OCaml, Common Lisp, Racket.

함수형 프로그래밍 개념

  • 순수 함수
  • 재귀
  • 참조 투명성
  • 함수는 일급이며 고차일 수 있습니다
  • 변수는 불변입니다

순수 함수

이 함수는 2 개의 주요 특성이 있습니다.
먼저 다른 것들에 관계없이 동일한 인수에 대해 항상 같은 출력을 생성합니다.
둘째, 그들에는 부작용이 없습니다. 즉, 인수 및 글로벌 변수를 변경하거나 뭔가를 출력하거나 합니다.
두 번째 속성을 불변성이라고 합니다. 순수 함수의 유일한 결과는 반환 값입니다. 그들은 결정적입니다.
함수형 프로그래밍을 사용하여 실행된 프로그램은 순수 함수에는 부작용이나 숨겨진 I/O가 없기 때문에 디버깅이 용이합니다.
순수 함수는 또한 병렬/동시 프로그램을 더 쉽게 작성할 수 있도록 합니다.
코드가 이 스타일로 작성된 경우 스마트 컴파일러는 많은 것을 할 수 있습니다.
명령을 병렬화하고, 필요할 때 결과를 평가하고, 입력이 변경되지 않는 한 결과가 변경되지 않기 때문에 결과를 기억할 수 있습니다.

예 :

sum(x, y)        // sum은 x와 y를 인수로 취하는 함수 
    return x + y // sum은 x와 y를 변경하지 않고 합을 반환합니다.

재귀

함수형 언어에는 "for" 또는 "while"가 없습니다.
함수형 언어의 반복 재귀에 의해 구현됩니다. 재귀 함수는 기본 케이스에 도달할 때까지 반복 자신을 호출합니다.

예 :

fib(n) 
    if (n <= 1) 
        return 1; 
    else 
        return fib(n - 1) + fib(n - 2)

참조 투명성

함수형 프로그램은 한 번 정의된 변수는 프로그램 전체에서 그 값을 변경하지 않습니다.
함수형 프로그램은 할당 문은 없습니다. 값을 저장해야 하는 경우에는 대신 새 변수를 정의합니다.
이렇게 하면 실행 어떤 시점에서 어떤 변수를 실제 값으로 대체할 수 있기 때문에 부작용의 가능성이 배제됩니다. 모든 변수의 상태는 어느 순간에나 일정합니다.

예 :

x = x + 1  // 이렇게 하면 변수 x에 할당된 값이 변경됩니다.
           // 따라서 수식은 참조 투명성이 없습니다.
           // x의 값을 10이라하면, 이 표현식의 두 번의 수행은 결과를 11과 12로 냅니다.
           // x = x + 1을 11 혹은 12로 대체하는 것은 프로그램에 다른 의미를 부여합니다
           // 하지만, int plusone(int x) {return x + 1;}과 같은 함수를 호출하는 것은
           // 투명합니다. 암시적으로 입력 x를 변경하지 않으며 부작용이 없기 때문입니다.

함수는 일급이며 고차일 수 있습니다.

일급 함수는 일급 변수로 처리됩니다. 일급 변수는 매개 변수로 함수에 전달하거나 함수에서 반환하는 데이터 구조에 저장될 수 있습니다. 고차 함수는 다른 함수를 인수로 사용하고 함수를 반환할 수도 있는 함수입니다.

예 :

show_output(f)            // 함수 show_output은 인수 f를 취하여 선언됩니다. 
                          // 이는 다른 함수 
    f();                  // 전달된 함수 호출 

print_gfg()               // 다른 함수 선언 
    print("hello gfg"); 

show_output(print_gfg)    // 다른 함수에 함수 전달

변수는 불변입니다

함수형 프로그래밍에서 초기화된 후 변수를 변경할 수 없습니다.
새로운 변수를 만들 수 있지만 기존 변수를 변경할 수 없으며 이것은 프로그램의 실행 시 상태를 유지하는 데 매우 유용합니다. 변수를 만들고 해당 값을 설정하면 해당 변수의 값이 절대 변경되지 않는 것을 완전히 확신할 수 있습니다.

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

장점

  1. 순수 함수는 상태를 변경하지 않고 주어진 입력에만 의존하기 때문에 쉽게 이해할 수 있습니다. 그들이 만들어내는 어떤 출력도 그들이 주는 반환 값입니다. 그 함수 시그니처는 그들에 대한 모든 정보, 즉 그 반환형과 그 인수를 제공합니다.
  2. 함수형 프로그래밍 언어가 함수를 값으로 처리하고 그들을 매개 변수로 함수에 전달 기능은 코드가 더 읽기 쉽고 이해하기 쉬워집니다.
  3. 테스트 및 디버깅이 쉬워집니다. 순수 함수는 인수만을 가지고 출력을 생성하기 위해 변경을 생성하지 않고, 입력을 받지 않고 숨겨진 출력을 생성하지 않습니다. 그들은 불변의 값을 사용하기 때문에 순수 함수를 사용하여 작성된 프로그램의 몇 가지 문제를 확인하는 것이 쉬워집니다.
  4. 순수 함수는 변수나 다른 데이터를 변경하지 않기 때문에 동시성/병렬 처리를 구현하는 데 사용됩니다.
  5. 필요한 경우에만 값을 평가 · 보존하기 위해 반복 평가를 회피하는 지연 평가를 채용하고 있습니다.

단점

  1. 순수 함수를 작성하면 코드의 가독성이 떨어질 수 있습니다.
  2. 루프를 사용하는 대신 재귀적인 스타일로 프로그램을 작성하는 것은 조금 위협이 될 가능성이 있습니다.
  3. 순수 함수를 쓰는 것은 쉽지만 이를 응용 프로그램의 다른 부분 및 I/O 작업과 결합하는 것은 어려운 작업입니다.
  4. 불변의 값과 재귀 성능이 저하될 수 있습니다.

응용 프로그램

  • 수학적 계산에 사용됩니다.
  • 동시성 또는 동시성이 필요한 경우에 필요합니다.

Pact: Whatsapp 은 동시성 요구 사항을 구현하는 데 Erlang이 사용되기 때문에 9 억 명의 사용자를 위해 50명의 엔지니어만 필요합니다. Facebook은 스팸 방지 시스템에 Haskell을 사용합니다.

함수형 프로그래밍과 객체지향 프로그래밍의 차이점

함수형 프로그래밍객체지향 프로그래밍
특정 작업을 수행하는 함수의 사용에 중점을 둠이 프로그래밍 패러다임은 객체 지향 개념을 기반으로 함
클래스는 객체의 인스턴스가 생성되는 장소에서 사용됨
사용되는 기본적인 요소는 변수와 함수임
함수의 데이터는 불변임 (생성 후에 변경할 수 없음)
사용되는 기본적인 요소는 개체와 메서드임
여기에서 사용되는 데이터는 가변 데이터임
중요한 것은 데이터가 아닌 기능임절차보다 데이터가 중요함
선언적 프로그래밍 모델을 따름명령형 프로그래밍 모델을 따름
반복을 위해 재귀를 사용함반복을 위해 루프를 사용함
병렬 프로그래밍이 지원됨병렬 프로그래밍을 지원하지 않음
이 프로그래밍 패러다임의 명령문은 실행하는 동안 특정 순서를 따를 필요가 없음이 프로그래밍 패러다임의 명령문은 순서를 따라야 함
즉, 실행하는 동안 상향식 접근 방식을 따라야 함
액세스 지정자가 없음Public, Private 및 Protected의 세 가지 액세스 지정자가 있음
새로운 데이터와 기능을 추가하는 것은 그리 쉽지 않음로운 데이터와 기능을 추가하는 쉬운 방법을 제공함
데이터 숨김이 불가능함. 따라서 보안이 불가능함데이터 은닉을 제공함. 그래서 보안 프로그램이 가능함

0개의 댓글