ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 함수형 프로그래밍(FP) - FP 프롤로그
    CS지식/함수형 프로그래밍 2024. 3. 25. 18:28

    FP 프롤로그

    함수형 프로그래밍(functional programming, FP)

    1. 수학 함수를 사용하고 부수 효과(side effect)를 피하는 것이 특징인 프로그래밍 패러다임
    2. 부수 효과 없이 순수 함수 pure function만 사용하는 프로그래밍 스타일

     

     

    부수 효과

    함수가 리터값 이외에 하는 모든 일을 말한다. 예를 들어 메일보내기나 전역 상태 수정하기 같은 일이 부수 효과이다. 부수 효과는 함수를 부를 때마다 발생하기 때문에 문제가 될 수 있다. 어떤 경우에는 리턴값이 필요해서 불렀지만 의도하지 않게 부수 효과가 발생할 수 있다. 불필요한 부수 효과를 가능한 사용하지 않으려고 합니다.

     

    추가
    (하지만, 이런 것이 소프트웨어를 사용하는 근본적인 이유이다.)

    부수 효과에는 다음과 같은 것이 있다.
    - 이메일 보내기
    -  파일 읽기
    - 불빛을 깜빡이기
    - 웹 요청을 하기
    - 자동차에 브레이크 밟기

     

     

    순수 함수

    인자에만 의존하고 부수 효과가 없는 함수이다. 인자에만 의존한다는 말은 같은 인자를 넣으면 항상 같은 결과를 돌려준다는 말이다. 수학에서 함수도 그렇게 동작하기 때문에 순수 함수를 수학 함수라고 볼 수도 있다. 

     

    정의에 따르면 함수형 프로그래머는 항상 부수 효과를 피하고 순수 함수만 사용해야 할 것 같지만, 실제 코드에서는 부수 효과와 순수하지 않은 함수를 사용한다.

     

    실용적인 측면에서 함수형 프로그래밍 정의의 문제점 

    문제 1: 부수 효과는 필요하다

    정의에 따르면 함수형 프로그래밍은 부수 효과를 피해야 하지만, 부수 효과는 소프트웨어의 실행하는 이유이다. 이메일을 전송하지 않는등 여타 기능을 수행하지 못하는 소프트웨어에 무슨 의미가 있을까? 정의에는 부수효과를 완전히 쓰지 말라는 것처럼 되어 있지만 필요할 때는 써야 합니다. 

     

    문제 2: 함수형 프로그래밍은 부수 효과를 잘 다룰 수 있다.

    함수형 프로그래머는 부수 효과가 실제로 필요하지만 문제가 될 수 있다는 것을 알기 때문에 부수 효과를 잘 다루기 위한 도구를 많이 알고있어야 한다. 정의에는 순수 함수만 쓰라는 것처럼 되어 있지만 함수형 프로그래밍을 하렬면 순수하지 않은 함수도 사용해야한다. 그리고 순수하지 않음 함수를 잘 다룰 수 있는 기술도 많이 존재한다.

     

    FP를 학문적 지식이 아닌 기술과 개념으로 보기

    액션과 계산, 데이터 구분하기 

    1. 액션
    2. 계산
    3. 데이터

    아래는 어떤 코드에서 가져온 내용이다. 별(*) 표시가 있는 코드를 살펴보자

     

    별 표시가 있는 함수는 언제, 얼마큼 호출하는지를 중점적으로 살펴보자. 왜냐하면 중요한 이메일을 중복으로 보내거나 전송이 되지 않는 것을 바라지는 않을 것이다. 별 표시가 있는 코드를 액션이라고 부른다. 이제 액션을 나머지 코드와 구분해 보자.


    부를때 조심해야 하는 코드 구분

    선을 하나 긋고 호출한느 횟수나 호출하는 시점이 중요한 함수는 위로 올려보낸다.

     

    방금의 분류는 매우 중요하다. 액션(선 위쪽에 있는 코드)은 호출하는 시점횟수에 의존한다. 그래서 호출할 때 조심해야한다.

     

    반면 선 아래쪽에 있는 코드는 사용하기 부담이 없다. 예를 들어 sum함수는 호출하는 시점이 중요하지 않다. 언제 호출해도 항상 같은 값을 주기 때문이다. 호출하는 횟수 역시 중요하지 않다. 나머지 코드나 소프트웨어에 영향을 주지 않기 때문에 여러 번 호출해도 상관없다. 다음으로 호출 가능 여부를 기준으로 코드를 나눌수 있다.

     

     

    실행하는 코드와 그렇지 않은 코드를 구분한다.

    계산과 데이터를 나눌 새로운 선을 그어 보자. 계산이나 데이터는 둘 다 부르는 시점이나 횟수가 중요하지 않다. 계산과 데이터의 차이는 실행 여부에 있는데, 계산은 실행 가능하나 데이터는 그렇지 않다. 하지만 계산은 실행하기 전까지 어떻게 동작할지 알 수 없다.

     

     

    많은 함수형 프로그래밍 기술과 개념은 코드를 액션계산, 데이터로 구분하는 것으로 부터 시작한다. 일반적으로 액션 보다는 계산이 쓰기 쉽고 계산 보다는 데이터가 사용하기 쉽다고 생각한다. 결과적으로 사용하기 가장 좋은 것은 데이터이다.


    예제: 실제 서비스에서 코드 구분

     

    프로젝트 관리를 위해 클라우드 서비스를 만든다고 생각해보자. 서비스에서 구현할 핵심 기능은 클라이언트가 작업 완료 표시를 하면 서버에서 이메일을 통해 알려주는 것이다. 

    1단계: 사용자가 작업 완료를 표시한다.

    → 이것은 UI 이벤트인데 실행 횟수에 의존하기 때문에 액션이다.

     

    2단계: 클라이언트가 서버로 메시지를 보낸다.

    메시지를 보내는 것도 액션이다. 그리고 메시지 자체는 나중에 서버에서 해석해야 하는 값이기 때문에 데이터이다.

     

    3단계: 서버가 메시지를 받는다.

    →  메시지를 반든 것은 횟수에 의존하므로 액션이다.

     

    4단계 : 서버가 작업완료로 데이터베이스를 변경한다.

    → 내부 상태를 바꾸는 것은 액션이다.

     

    5단계: 서버가 누구에게 알림을 보낼지 결정

    → 결정한는 것은 계산이다. 입력값이 같다면 서버는 항상 같은 결정을 내리기 때문이다. 

     

    6단계: 서버가 이메일로 알림을 보낸다.

    → 이메일 보내기는 액션이다. 같은 메일을 한 번 보내는 것과 두 번 보내는 것은 다르다.

     


    함수형 프로그래밍에 세가지 분류

    액션

    • 시간에 변화에 따라 안전하게 상태를 바꿀 수 있는 방법
    • 순서를 보장하는 방법
    • 액션이 정확히 한번만 실행되게 보장하는 방법

    액션은 실행 시점이나 횟수 또는 둘 다에 의존한다. 긴급한 메일을 오늘 보내는 것과 다음주에 보내는 것은 완전히 다르다.  같은 메일을 10번 보내는 것과 한번 보내는 것 또는 보내지 않는 것은 다르다.

     

    계산

    • 정확성을 위한 정적 분석
    • 소프트웨어서 사용 할 수 있는 수학적 지식
    • 테스트 전략

    계산은 입력값으로 출력값을 만드는 것이다. 같은 입력같을 가지고 계산하면 항상 같은 결과값이 나온다. 언제, 어디서 어디서 계산해도 결과는 같고 외부에 영향을 주지 않는다. 계산은 테스트하기 쉽고 언제든지 몇 번을 불러도 안전하다.

     

    데이터

    • 효율적으로 접근하기 위해 데이터를 구성하는 방법
    • 데이터를 보관하기 위한 기술
    • 데이터를 이용해 중요한 것을 발견하는 원칙

    데이터는 이벤트에 대해 기록한 사실이다. 데이터는 실행하는 코드만큼 복잡하지 않기 때문에 다른것과 구분된다. 알아보기 쉬운 속성으로 되어있고 실행하지 않아도 데이터 자체로 의미가 있다. 또 같은 데이터를 여러 형태로 해석할 수 있다. 예를 들어 레스토랑에서 발행한 영수증 데이터가 있다고 하자. 관리자는 이 데이터를 인기 있는 메뉴를 찾기 위해 사용할 수 있고, 고객은 외식비 지출 내역을 알아보기 위해 사용할 수 있다.

     


     

    액션, 계산, 데이터를 구분하는 것의 장점

    → 분산 시스템에 적합하다.

    분산 시스템의 3가지 불확실성
    1. 메시지 순서가 바뀔 수 있다.
    2. 메시지는 한 번 이상 도착할 수도 있고 도착하지 않을 수도 있다.
    3. 응답을 받지 못하면 무슨일이 생겼는지 알수 없다.

     

    여러 컴퓨터가 네트워크를 통해 통신하기 시자가면 소프트웨어가 복잡해진다. 처리해야 할 메시지 순서가 섞일 수 있고 중복되기도 하고 유실되기도 한다. 시간에 따라 바뀌는 값을 모델링할 때 동작 방법을 이해하는 것은 중요하지만 쉽지 않다. 실행 시점이나 횟수에 의존하는 코드를 없애면, 코드를 더 쉽게 이해할 수 있고 심각한 버그를 막을 수 있다.

     

    데이터와 계산은 실행 시점이나 횟수에 의존하지 않는다. 그래서 코드를 데이터와 계산으로 바꿀 수록 분산 시스템에서 생기는 여러가지 문제를 해결할 수 있다.

     

    액션은 실행 시점과 횟수에 의존하기 때문에 여전히 문제가 되지만, 코드 전체에 영향을 주지 않도록 격리시키면 된다. 또 분산 시스템이 아무리 불확실성을 내포할 수 있다고 해도 액션은 안전하게 다룰 수 있다면 이를 줄일 수 있다. 그리고 코드의 많은 부분을 액션에서 계산으로 바꾸면 결과적으로 액션도 다루기 쉬워진다.

     

    [출처- 쏙쏙 들어오는 함수형 코딩, 저 에릭 노먼드]

    https://jpub.tistory.com/1265

     

    쏙쏙 들어오는 함수형 코딩

    심플한 코드로 복잡한 소프트웨어 길들이기 도서구매 사이트(가나다순) [교보문고] [도서11번가] [알라딘] [예스이십사] [인터파크] [쿠팡]전자책 구매 사이트(가나다순)[교보문고] [구글북스] [리

    jpub.tistory.com

     

    댓글

Designed by Tistory.