함수형 프로그래밍

Park Jae Hong·2022년 7월 28일
0

함수형 프로그래밍이란 ?

: 함수형 프로그래밍은 하나의 프로그래밍 패러다임으로 정의되는 일련의 코딩 접근 방식이며, 자료처리를 수학적 함수의 계산으로 취급하고 상태와 가변 데이터를 멀리하는 프로그래밍 패러다임을 의미한다.

함수형 프로그램이 필요한 이유

: 함수형 프로그래밍은 기존 절차적 프로그래밍과 객체 지향형 프로그래밍과는 다른 새로운 방식이다. 함수형 프로그래밍을 배우는 것은 스칼라나 클로저에 관심이 없고 앞으로 쓰지 않을 것 같다고 해도 다른 방식으로 사고하는 법을 배우는 것이다. 새로운 계산방법을 배우는 것 처럼 사고의 전환을 필요로 하며 다양한 사고방식으로 프로그래밍을 바라보면 유연한 문제해결이 가능하다.

1. 순수함수 (Pure function)

  • 동일한 입력에는 항상 같은 값을 반환해야 하는 함수
  • 함수의 실행이 프로그램의 실행에 영향을 미치지 않아야 하는 함수
  • 함수 내부에서 인자의 값을 변경하거나 프로그램 상태를 변경하는 Side Effect가 없는 것

2. 비상태, 불변성 (Stateless, Immutability)

  • 함수형 프로그래밍에서의 데이터는 변하지 않는 불변성을 유지해야 한다.
  • 데이터의 변경이 필요한 경우, 원본 데이터 구조를 변경하지 않고 그 데이터의 복사본을 만들어서 그 일부를 변경하고, 변경한 복사본을 사용해 작업을 진행한다.

3. 선언형 함수 (Expressions)

  • 명령형 프로그래밍은 무엇을 어떻게 할 것인가에 주목하고, 선언헌 프로그래밍은 무엇을 할 것인가에 주목한다.

4. 1급 객체와 고차함수 (Fist-class, Higher-order functions)

  • 변수나 데이터 구조안에 담을 수 있다.
  • 파라미터로 전달 할 수 있다.
  • 반환값(return value)으로 사용할 수 있다.
  • 할당에 사용된 이름과 관계없이 고유한 구별이 가능하다.
  • 동적으로 프로퍼티 할당이 가능하다.

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

장점

  • 높은 수준의 추상화를 제공한다
  • 함수 단위의 코드 재사용이 수월하다
  • 불변성을 지향하기 때문에 프로그램의 동작을 예측하기 쉬워진다

단점

  • 순수함수를 구현하기 위해서는 코드의 가독성이 좋지 않을 수 있다
    함수형 프로그래밍에서는 반복이 for문이 아닌 재귀를 통해 이루어지는데 (deep copy), 재귀적 코드 스타일은 무한 루프에 빠질 수 있다
    순수함수를 사용하는 것은 쉬울 수 있지만 조합하는 것은 쉽지 않다

고차 함수(Higher-Order Function)

: 고차 함수는 함수를 인자로 전달받거나, 함수를 결과로 반환하는 함수를 말한

고차 함수의 종류

  • .forEach()

    :for문을 대체하는 고차 함수, 반복문을 추상화하여 구현된 메서드이고 내부에서 주어진 배열을 순회하면서 연산을 수행
    ( 처음에 forEach 문이 고차함수 인지 모르고 재구만을 통해서 함수형 프로그래밍을 구현하려니 고생을 많이 했다..)

  • .map()

    : forEach 같이 순회하면서, 콜백함수에서의 실행결과를 리턴한 값으로 이루어진 배열을 만들어 반환

  • .find()

    : 주어진 배열을 순회하면서 콜백 함수 실행의 반환값이 true에 해당하는 첫번째 요소를 반환

  • .findIndex()

    : 열 메소드 indexOf() 의 콜백함수 버젼. 고차함수 find()의 리턴값이 인덱스인 버젼.

  • .filter()

    : 주어진 배열을 순회하면서 콜백 함수의 반환값이 true에 해당하는 요소로만 구성된 새로운 배열을 생성하여 반환. (즉, find()의 찾아서 값을 반환하는 기능과 map()의 배열 생성 기능의 융합 버젼.)

  • .reduce()

    : 콜백 함수의 실행된 반환값(initialValue)을 전달 받아 연산의 결과값이 반환. 사실상 forEach, map, filter기능을 reduce로 모두 구현해서 쓸순 있어 고차함수의 부모라고 불림

  • .sort()

    : 배열 정렬.(단, 복사본이 만들어지는게 아니라 원 배열이 정렬됨.)

  • .some()

    : 배열 메소드인 include()의 콜백함수 버전. include는 값이 있냐에 따른 bool이면, some은 함수의 로직에 따른 bool.
    배열의 요소들을 주어진 함수(조건)을 통과하는데 한개라도 통과되면 true, 아닐때에는 false를 출력.(단, 빈 배열로 함수(조건)을 통과하면 무조건 false를 출력.)

  • every()

    : some() 의 반대 버전 배열안의 모든 요소가 주어진 함수(조건)을 모두 통과하면 true, 한 요소라도 통과하지 못하면 false를 출력. (빈 배열을 함수에 적용시키면 무조건 true를 반환.)

모나드 (Monad)

: 모나드는 하스켈에서 입출력을 수행하기 위해 도입되었습니다. (함수 합성식)

모나드는 함수 내부에서 발생할 수 있는 Side Effect 를 결과 집합과 함께 포함하는 타입입니다. 함수 실행 결과를 항상 모나드로 반환하여 순수함수 성질을 잃지 않게 하는 것입니다. 더 정확하게 얘기하자면 원시타입(boolean, int, string, float, double)과 커스텀 타입(class, struct)을 구체타입이라고 할 때 우리는 구체타입을 사용하여 함수의 인자와 결과값을 표현했습니다. 이 구체타입을 한 번 더 추상화한 것이 모나드

참고 : https://jongminfire.dev/%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

profile
The people who are crazy enough to think they can change the world are the ones who do. -Steve Jobs-

0개의 댓글