ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [TIL] 함수형 프로그래밍
    Develope/Javascript 2020. 8. 8. 18:30

    javascript logo

    ◎ 지금까지는 객체지향 프로그래밍이었다면 이제 함수를 기반하는 함수형 프로그래밍으로 많이 작성한다.

    함수형 프로그래밍에 대해서 간략하게 알아보자!

     

    1. 함수형 프로그래밍이란?

    함수형 프로그래밍순수한 함수를 작성하고, 공유된 상태와 변경 가능한 데이터 및 부작용을 피하여 소프트웨어를 작성하는 프로세스이다.

    함수형 프로그래밍은 선언형이며, 애플리케이션의 상태는 순수한 함수를 통해 전달된다.

    애플리케이션의 상태가 공유되고, 객체의 메서드와 사용되는 객체 지향 프로그래밍과는 대조된다.

     

    2. 순수 함수 (pure function)

    순수 함수란 하나 이상의 인자를 받고, 받은 인자를 처리하여 반드시 결과물을 돌려주어야 한다는 것이다.

    인자를 제외한 다른 변수는 사용하면 안 되고 받은 인자만으로 결과물을 내야 한다.

    그리고 순수 함수는 부작용(Side Effect)이 없다. 이 말은 바꾸고자 하는 변수 외에는 바뀌어서는 안 된다는 뜻이다.

    function notPure(array) {
     array.push("순수X");
    }
    
    function notPure2(array) {
     return [ ...globalArray, "순수X"];
    }
    
    function pureFunction(array) {
     return [ ...array, "순수"];
    }

     - notPure( )는 반환 값이 없기 때문에 순수하지 않다.

     - notPure2( )는 인자 대신 공유 변수(globalArray)를 이용하고 있어 순수하지 않다.

     - pureFunction( )은 인자를 받고, 받은 인자를 처리하기 때문에 순수 함수입니다.

     

    순수 함수는 예측이 가능하고, 디버그가 쉬우며 테스트하는 것은 더욱 쉽다.

    하지만 모든 함수가 순수할 수는 없다. I/O 작업, 난수 처리, 데이터베이스 등을 처리할 때는 본질적으로 순수할 수가 없다.

    하지만, 함수가 다룰 수 있는 영역을 더 넓게 하고, 핵심을 간단하게 유지하기 위해 소프트웨어의 전반에 걸쳐 적용되어야 한다.

    ※ 무조건 순수 함수를 사용해야 하나?

    ◎ 순수 함수를 쓰지 않고 개발을 잘하면 상관이 없지만 어디서 어떻게 값이 변할지 모르는 코드에 대해서는 확실성을 갖기 힘들다.

    순수 함수의 몇 가지 장점에 대해 알아보자

    첫 번째, 테스트가 아주 쉽다. 이유는 같은 입력에 대해서 같은 출력을 내기 때문에 기대하는 값이 명확하기 때문이다.

    두 번째, 병렬 처리에 유리하다. 순수 함수는 외부 함수에 대한 참조가 없고, 사이드 이펙트를 만들지 않기 때문에 병렬 처리가 가능하다. 

     

    2. 불변성 (immutability)

    ◎ Javascript에서 모든 원시 자료형은 불변하다. 

    불변한 객체나 배열은 만들어진 후에는 더 이상 수정할 수 없다.

    수정하고 싶다면 복제해서 새로운 변수에 할당해야 한다.

    // mutable
    const mutables = ["Hello" , "JinDevT"];
    mutables.push("Mutable");
    
    // immutable
    const immutables = ["Hello", "JinDevT"];
    const newImmutables = [ ...immutables, "Immutable"]; // spread 연산자를 사용
    

    이것은 오직 단 하나의 상태만을 가지고 있기 때문에, 불변한 객체나 배열은 그 내용을 변경해서 무효화시킬 수가 없고 이로 인해 부작용을 막을 수 있다.

    ※ Jasvascript에서는 Immutable.js 라이브러리를 사용할 수 있다.

     

    3. 선언적 패턴 (declarative patterns)

    ◎ 선언적 프로그래밍은 우리가 이루고자 하는 것을 설명한다. 

    즉, 명령형 프로그래밍단계 별 할 일을 명시적으로 지시하는 반면, 선언적 프로그래밍일련의 선언들로 구성된다.

    const language = ["Javascript", "Java", "Python"];
    
    // 명령형 패턴
    const shortNames = [];
    for (let i = 0; i < language.length; i ++) {
     if(language[i].length < 5) {
      shortNames.push(language[i]);
     }
    };
    
    // 선언적 패턴
    const shortNames = language.fillter(el => el.length < 5 );

    선언적 패턴은 세부적인 구현 방법이 아니라 다루는 문제의 도메인에 초점을 맞춘다.

    선언적 패턴은 더 간결하고, 더 에러가 적은 코드를 생성한다.

     

    4. Higher Order Functions

    HOC(Higher Order Functions)는 다른 함수를 인자로 사용하거나 함수를 반환하는 함수, 또는 두 가지 특징을 모두 가진 함수이다.

    고차 함수는 다음과 같은 경우 사용된다.

     

     - 콜백 함수, 프로미스 등을 사용하여 동작과 효과 또는 비동기 흐름 제어를 추상화하거나 격리한다.

     - 다양한 데이터 유형에 대해 작동할 수 있는 유틸리티를 생성한다.

     - 함수를 부분적으로 인수에 적용하거나 재사용 또는 함수 조합을 위한 커리 함수를 작성한다.

     - 함수 목록을 가져오고, 해당 입력 함수의 조합을 반환한다.

     

    HOC를 사용한 코드를 봐보자.

    const inEven = x => !(x % 2);
    
    const numbers = [1, 2, 3, 4, 5, 6, 7, 8];
    const evenNumbers = numbers.filter(isEven);
    
    console.log(evenNumbers); // 2, 4, 6, 8

     

    4. 느낀 점

    ◎ 함수형 프로그래밍에 대해 알아보려고 구글링은 했지만, 아직 내가 이해하기 힘든 설명들이 많았다.

    그러던 중 두개의 블로그를 찾아서 글을 읽으면서 함수형 프로그래밍에 대해 간략히 이해를 하였다.

    좀 더 깊게 배우기 위해 함수형 프로그래밍이란 무엇이고 , 내가 아는 기준에서 어떻게 작성하는지를 알고 난 뒤 배우면 좋을 거 같아서 블로깅 하였다. 

     

    ※ 참조

    https://medium.com/korbit-engineering/%ED%95%A8%EC%88%98%ED%98%95-%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%B0%8D%EC%9D%B4%EB%9E%80-e7f7b052411f

     

    함수형 프로그래밍이란?

    함수형 프로그래밍은 순수한 함수를 작성하고, 공유된 상태와 변경 가능한 데이터 및 부작용을 피하여 소프트웨어를 작성하는 프로세스이다. 함수형 프로그래밍은 명령형이 선언형이며, 애플��

    medium.com

    https://blog.ull.im/engineering/2019/04/07/functional-programming-with-javascript-in-3-steps.html

     

    ull.im

    울려 퍼지다.
    반향하다.
    공명하다.

    blog.ull.im

     

Designed by Tistory.