JavaScript의 함수형 프로그래밍

함수형 프로그래밍은 함수(일급 객체)를 중심으로 소프트웨어를 구성하는 프로그래밍 패러다임입니다. JavaScript는 함수형 프로그래밍의 여러 개념을 지원하며, 이를 통해 코드의 가독성, 재사용성, 유지보수성을 높일 수 있습니다. 이 글에서는 함수형 프로그래밍의 개념과 JavaScript에서의 구현 방법을 소개합니다.

1. 함수형 프로그래밍의 기본 개념

1.1. 일급 객체로서의 함수

JavaScript에서 함수는 일급 객체(first-class citizen)입니다. 이는 함수가 변수에 할당될 수 있고, 다른 함수의 인자로 전달되거나 반환값으로 사용될 수 있음을 의미합니다.

1.2. 순수 함수

순수 함수(pure function)는 동일한 입력에 대해 항상 동일한 출력을 반환하며, 함수 외부의 상태를 변경하지 않습니다.

1.3. 불변성

불변성(immutability)은 데이터를 변경하지 않고 새로운 데이터를 생성하는 것을 말합니다. 함수형 프로그래밍에서는 불변성을 유지하는 것이 중요합니다.

1.4. 고차 함수

고차 함수(higher-order function)는 함수를 인자로 받거나 함수를 반환하는 함수입니다.

2. JavaScript에서의 함수형 프로그래밍 구현

2.1. 일급 객체로서의 함수

const sayHello = function(name) {
    return `Hello, ${name}!`;
};

const greet = sayHello;
console.log(greet('John')); // Hello, John!

2.2. 순수 함수

순수 함수는 동일한 입력에 대해 항상 동일한 출력을 반환하고, 외부 상태를 변경하지 않습니다.

function add(a, b) {
    return a + b;
}

console.log(add(2, 3)); // 5
console.log(add(2, 3)); // 5 (항상 동일한 출력)

2.3. 불변성

불변성을 유지하려면 객체나 배열을 변경하지 않고 복사하여 사용해야 합니다.

const originalArray = [1, 2, 3];

// 불변성을 유지하면서 배열에 요소 추가
const newArray = [...originalArray, 4];
console.log(originalArray); // [1, 2, 3]
console.log(newArray); // [1, 2, 3, 4]

// 객체의 불변성 유지
const originalObject = { a: 1, b: 2 };
const newObject = { ...originalObject, c: 3 };
console.log(originalObject); // { a: 1, b: 2 }
console.log(newObject); // { a: 1, b: 2, c: 3 }

2.4. 고차 함수

고차 함수는 함수를 인자로 받거나 함수를 반환하는 함수입니다.

2.4.1. 함수를 인자로 받는 고차 함수

function map(arr, fn) {
    const result = [];
    for (let i = 0; i < arr.length; i++) {
        result.push(fn(arr[i]));
    }
    return result;
}

const numbers = [1, 2, 3];
const doubled = map(numbers, x => x * 2);
console.log(doubled); // [2, 4, 6]

2.4.2. 함수를 반환하는 고차 함수

function createGreeting(greeting) {
    return function(name) {
        return `${greeting}, ${name}!`;
    };
}

const sayHello = createGreeting('Hello');
console.log(sayHello('John')); // Hello, John!

const sayHi = createGreeting('Hi');
console.log(sayHi('Jane')); // Hi, Jane!

2.5. 함수형 프로그래밍의 주요 메서드

JavaScript는 배열과 관련된 몇 가지 유용한 함수형 프로그래밍 메서드를 제공합니다: map, filter, reduce 등.

2.5.1. map

map 메서드는 배열의 각 요소에 대해 주어진 함수를 호출한 결과를 모아 새로운 배열을 반환합니다.

const numbers = [1, 2, 3];
const squared = numbers.map(x => x * x);
console.log(squared); // [1, 4, 9]

2.5.2. filter

filter 메서드는 주어진 함수의 테스트를 통과하는 모든 요소를 모아 새로운 배열을 생성합니다.

const numbers = [1, 2, 3, 4];
const evenNumbers = numbers.filter(x => x % 2 === 0);
console.log(evenNumbers); // [2, 4]

2.5.3. reduce

reduce 메서드는 배열의 각 요소에 대해 주어진 리듀서 함수를 실행하고, 하나의 결과값을 반환합니다.

const numbers = [1, 2, 3, 4];
const sum = numbers.reduce((acc, curr) => acc + curr, 0);
console.log(sum); // 10

2.6. 함수 합성

함수 합성(function composition)은 여러 개의 함수를 조합하여 새로운 함수를 생성하는 것입니다.

const add = x => x + 1;
const multiply = x => x * 2;

const addAndMultiply = x => multiply(add(x));
console.log(addAndMultiply(5)); // 12

결론

함수형 프로그래밍은 JavaScript에서 매우 강력한 패러다임으로, 코드를 더욱 간결하고, 재사용 가능하며, 유지보수하기 쉽게 만듭니다. 일급 객체로서의 함수, 순수 함수, 불변성, 고차 함수, 함수형 메서드, 함수 합성 등의 개념을 이해하고 활용하여 함수형 프로그래밍을 적용해 보세요. 이를 통해 더 나은 JavaScript 코드를 작성할 수 있습니다.

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다