개발자 키우기

함수형 프로그래밍이란 본문

Front-end/JavaScript

함수형 프로그래밍이란

개발자 키우기 2023. 10. 16. 11:06

함수형 프로그래밍은 프로그래밍 패러다임의 하나로, 함수를 기본적인 빌딩 블록으로 사용하여 프로그램을 구성하는

 

방식을 강조하는 스타일이다. 아래에서 함수형 프로그래밍의 특징과 예시를 알아보자.

 

1. 함수의 일급 시민성

 

함수형 프로그래밍에서는 함수가 일급 시민으로 취급된다. 함수를 변수에 할당하고, 다른 함수의 매개변수로

 

전달하거나 함수의 반환 값으로 사용할 수 있는 능력을 의미하며 함수를 데이터처럼 다루기 때문에 코드를 간결하게 만든다.

 

const square = (x) => x * x;
const doubleIt = (x) => x * 2;

const combined = (x) => doubleIt(square(x)); // 다른 함수의 매개변수로 함수를 전달
const result = combined(5); // 인자의 조건이 갖추었을때 계산 수행(지연로딩) 
console.log(result); // 5 * 5 = 25, 25 * 2  = 50

 

 

2. 불변성

 

함수형 프로그래밍에서는 데이터를 변경하지 않고 새로운 데이터를 생성하는 방식을 사용한다.

 

이 방식을 사용하면 예측 가능하고 병렬 처리가 쉬운 코드를 작성할 수 있다.

 

const numbers = [1, 2, 3, 4, 5];
const doubledNumbers = numbers.map((n) => n * 2);
console.log(numbers); // 1, 2, 3, 4, 5 값이 변경되지 않았음
console.log(doubledNumbers); // 2, 4, 6, 8, 10

 

 

3. 순수 함수

 

순수 함수는 동일한 입력에 대해 항상 동일한 출력을 반환하는 함수를 말하며 부작용이 없는 함수로 외부 상태를 변경하지 않는다.

 

테스트하기 쉽고 예측 가능한 동작을 보장한다.

 

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

const result1 = add(3, 5); // 항상 8을 반환
const result2 = add(3, 5); // 항상 8을 반환
const result3 = add(3, 5); // 항상 8을 반환

 

 

4. 불변성 데이터 구조

 

함수형 프로그래밍은 변경 불가능한 데이터 구조를 사용하여 데이터를 관리한다.

 

데이터를 공유하거나 수정하지 않고 새로운 데이터 구조를 생성한다는 뜻이다.

 

const person = {
  name: "Alice",
  age: 30,
};

const updatedPerson = { ...person, age: 31 }; // age만 업데이트해서 새로운 객체 생성

console.log(person); // { name: "Alice", age: 30 }
console.log(updatedPerson); // { name: "Alice", age: 31 }

 

 

5. 고차 함수

 

고차 함수는 다른 함수를 인자로 받거나 함수를 반환하는 함수를 말하며 코드 재사용과 추상화를 촉진시킨다.

 

const curriedAdd = (a) => (b) => a + b;
const add5 = curriedAdd(5);
const result = add5(3); // // 인자의 조건이 갖추었을때 계산 수행(지연로딩) 5 + 3 = 8

 

 

6. 데이터 파이프라인

 

함수형 프로그래밍은 데이터를 다루는 과정을 파이프라인처럼 연결하여 데이터 변환 과정을 명확하게 표현한다.

 

자바에서 Stream 인터페이스와 유사하다.

 

const numbers = [1, 2, 3, 4, 5];
const sum = numbers
  .filter((n) => n % 2 === 0) // 2, 4
  .map((n) => n * 2) // 4, 8
  .reduce((acc, value) => acc + value, 0); // 12

 

 

7. 재귀

 

함수형 프로그래밍에서는 반복문 대신 재귀를 사용하여 문제를 해결한다.

 

function factorial(n) {
if (n <= 1) {
return 1;
}
return n * factorial(n - 1);
}
const result = factorial(5); // 5! = 120

 

 

8. 함수 합성

 

여러 함수를 조합하여 새로운 함수를 만드는 것을 함수 합성이라고 하며 복잡한 문제를 간단한 함수들로

 

분해하여 해결할 수 있다.

 

const square = (x) => x * x;
const doubleIt = (x) => x * 2;

const combined = (x) => doubleIt(square(x)); // 함수를 합성
const result = combined(5); // 인자의 조건이 갖추었을때 계산 수행(지연로딩)
console.log(result); // 5 * 5 = 25, 25 * 2 = 50

 

 

9. 모나드

 

함수형 프로그래밍에서 부작용을 같은 코드와 순수 함수형 코드를 조합할 수 있도록 하는 패턴을 말한다.

 

class Maybe {
  constructor(value) {
    this.value = value;
  }

  static of(value) {
    return new Maybe(value);
  }

  map(fn) {
  // 값이 존재하면 함수를 적용하고 결과를 새로운 Maybe로 반환
  if (this.value !== null && this.value !== undefined) {
    return Maybe.of(fn(this.value));
  } else {
  // 값이 없으면 그대로 반환
    return Maybe.of(null);
  }
}

  // 다른 모나드나 함수와 조합할 때 사용하는 flatMap
  flatMap(fn) {
    return this.map(fn).join();
  }

  // Maybe의 값을 꺼내오는 메서드
  join() {
    return this.value;
  }
}
 
const user = {
  name: "Alice",
  address: {
  city: "New York",
  zipcode: "10001",
  },
};

const maybeUser = Maybe.of(user);

const zipcodeLength = maybeUser
  .map((user) => user.address)
  .map((address) => address.zipcode)
  .map((zipcode) => zipcode.length);

console.log(zipcodeLength.join()); // 5

'Front-end > JavaScript' 카테고리의 다른 글

모던 자바스크립트  (0) 2023.11.23
함수형 프로그래밍 - 기본적인 패턴  (0) 2023.10.16