[JS] 일급함수 / 고차함수 / 순수함수 / 클로저

손영산·2024년 2월 25일
0

Javascript

목록 보기
3/4
post-thumbnail
post-custom-banner

일급함수란?

1급 함수란 자바스크립트에서 함수가 다음 조건을 충족하는 것을 의미한다.

  • 함수를 변수에 할당할 수 있어야 함
  • 함수를 다른 함수의 매개변수로 전달할 수 있어야 함
  • 함수를 다른 함수에서 반환할 수 있어야 함

이러한 개념을 활용하여 함수형 프로그래밍을 구현할 수 있다.

// 함수를 변수에 할당
const add = function(a, b) {
    return a + b;
};

// 함수를 다른 함수의 매개변수로 전달
function operate(func, x, y) {
    return func(x, y);
}

// 함수를 다른 함수에서 반환
function makeAdder(x) {
    return function(y) {
        return x + y;
    };
}

console.log(operate(add, 3, 4)); // 출력: 7

const addFive = makeAdder(5);
console.log(addFive(3)); // 출력: 8

고차함수

고차함수란 다른 함수를 인자로 받거나, 함수를 반환하거나, 둘 다 할 수 있는 함수를 의미한다.
이를 구현하기 위해서는 위에서 언급한 1급 함수의 세 가지 특성을 활용한다.

// 고차 함수 구현 예제

// 다른 함수를 인자로 받는 고차 함수
function higherOrderFunction(func, x, y) {
    return func(x, y);
}

// 함수를 반환하는 고차 함수
function createMultiplier(multiplier) {
    return function(x) {
        return x * multiplier;
    };
}

const double = createMultiplier(2);
const triple = createMultiplier(3);

console.log(higherOrderFunction(add, 3, 4)); // 출력: 7
console.log(double(5)); // 출력: 10
console.log(triple(5)); // 출력: 15

부수효과

일급함수를 활용한 함수형 프로그래밍에서는 부수 효과를 최소화하는 하는 것이 중요하다.

다음과 항목들을 함수형 프로그래밍에 적용하면 부수 효과를 최소화할 수 있다.

  • 불변성 (Immutability)
    • 데이터를 변경할 수 없는 상태로 유지하여 부수효과 방지한다.
  • 순수 함수 (Pure Functions):
    • 순수 함수는 동일한 입력에 대해 항상 동일한 출력을 반환하며 외부 상태에 의존하지 않고 외부 상태를 변경하지 않는다.
    • 이러한 함수는 부수 효과가 없으므로 예측 가능하고 테스트하기 쉽다.
  • 순수 함수를 조합하는 함수 조합 (Function Composition):
    • 여러 순수 함수를 조합하여 복잡한 동작을 수행할 수 있다.
    • 이때 각 함수는 부수 효과가 없으므로 전체적으로도 부수 효과를 최소화할 수 있다.
  • 모나드 (Monads함수를 안전하게 합성하기 위한 value를 가지고 있는 객체):
    • 모나드는 부수 효과를 추상화하고 순수 함수와 상호작용할 수 있는 방법을 제공한다.
    • 모나드를 사용하면 부수 효과를 포함한 작업을 안전하게 처리할 수 있다.

순수함수

정의

  • 동일한 입력에 대해 항상 동일한 출력을 반환한다. 즉, 함수의 결과는 그 함수를 호출할 때 사용된 인자에만 의존한다.
  • 함수의 실행이 외부 상태에 영향을 주지 않으며, 외부 상태에 의존하지 않으며, 이는 함수가 외부에서 관리되는 상태를 변경하지 않고 동작함을 의미한다.

장점

  • 예측 가능성 (순수 함수는 동일한 입력에 대해 항상 동일한 출력을 반환하기 때문에 프로그램의 동작을 예측하기 쉽게 한다.)

  • 테스트 용이성(부수 효과가 없는 순수 함수는 테스트하기가 매우 쉽다. 함수를 테스트할 때 외부 상태나 환경을 신경 쓸 필요가 없기 때문이다.)

  • 디버깅 용이성(순수 함수는 외부 상태에 의존하지 않으므로 디버깅이 용이하다. 함수의 동작을 이해하기 위해 함수 자체만을 고려하면 되기 때문이다.)

  • 병렬 처리와 안전성(순수 함수는 외부 상태에 의존하지 않으므로 여러 스레드에서 안전하게 병렬 처리될 수 있다. 부수 효과가 없기 때문에 동시에 여러 스레드에서 함수를 호출해도 안전하게 동작한다.)

이러한 이점들은 순수 함수가 함수형 프로그래밍에서 매우 중요한 개념으로 간주되는 이유 중 하나이며, 순수 함수를 사용하면 프로그램의 안정성과 확장성을 높일 수 있다.

클로저

정의

클로저란 다음과 같은 특징을 가지고 있는 함수를 의미한다.

  • 함수와 그 함수가 선언된 렉시컬 환경 사이의 조합
  • 함수가 선언될 당시의 스코프에 대한 참조 유지
  • 외부 스코프에 있는 변수에 접근 가능
function outerFunction() {
    let outerVariable = '외부 변수';

    // 내부 함수 (클로저)
    function innerFunction() {
        console.log(outerVariable); // 외부 변수에 접근
    }

    // 내부 함수 반환
    return innerFunction;
}

// outerFunction을 호출하여 innerFunction을 반환받음
const closureExample = outerFunction();

// closureExample을 호출하여 내부 함수 실행
closureExample(); // 출력: "외부 변수"

이 예제에서는 outerFunction 내부에 선언된 innerFunction이 클로저이다.

outerFunction이 실행되고 그 결과로 innerFunction 함수가 반환된다.

반환된 내부 함수인 closureExample을 호출할 때, 이 함수는 외부 스코프에 있는 outerVariable 변수에 접근할 수 있다.

클로저는 주로 함수 내에서 외부 변수를 기억하고 유지해야 할 때 사용된다.
이를 통해 정보 은닉, 비동기 작업 관리, private 멤버 구현 등 다양한 기능을 구현할 수 있다.

커링과 부분적용

커링

  • 커링은 다중 인자를 가진 함수를 단일 인자를 가진 여러 개의 함수들로 변환하는 기법을 말한다.
  • 즉, 커링된 함수는 하나의 인자를 받은 후에 다음 인자를 받는 새로운 함수를 반환하는 형태를 가진다.
  • 커링은 함수를 더 작고 모듈화된 조각으로 분해하여 코드를 더 간결하고 이해하기 쉽게 만들어준다.
  • 주로 인자의 일부가 미리 정해진 경우에 유용하게 사용된다.
// 커링되지 않은 함수
function add(a, b, c) {
    return a + b + c;
}

// 커링 함수
function curriedAdd(a) {
    return function(b) {
        return function(c) {
            return a + b + c;
        };
    };
}

// 커링된 함수를 사용하여 부분적으로 적용된 함수 생성
const add5 = curriedAdd(5);
const add5And6 = add5(6);

console.log(add5And6(7)); // 출력: 18

부분적용

  • 부분 적용은 함수의 일부 인자를 미리 입력하여 새로운 함수를 생성하는 것을 말한다.
  • 즉, 함수에 필요한 인자 중 일부만을 미리 전달하여 새로운 함수를 생성하는 것이다.
  • 부분 적용은 함수의 특정 부분만을 재사용할 때 유용하며, 동일한 함수를 여러 번 호출하지 않고도 다양한 상황에 적용할 수 있다.
  • 커링과 달리, 부분 적용은 원래 함수의 나머지 인자를 나중에 전달할 수 있는 유연성을 제공한다.
// 부분 적용 함수
function partial(func, ...args) {
    return function(...rest) {
        return func.apply(this, args.concat(rest));
    };
}

// 원래 함수
function multiply(a, b, c) {
    return a * b * c;
}

// 부분 적용된 함수 생성
const partialMultiply = partial(multiply, 2);

console.log(partialMultiply(3, 4)); // 출력: 24

따라서, 커링은 다중 인자 함수를 단일 인자 함수들로 변환하는 기법이며, 부분 적용은 함수의 일부 인자를 미리 입력하여 새로운 함수를 생성하는 기법이다.

커링은 주로 인자를 고정하여 함수를 재사용하는 데 사용되고, 부분 적용은 함수의 유연성을 유지하면서 일부 인자를 미리 결정할 때 사용한다.

post-custom-banner

0개의 댓글