함수형 프로그래밍

Minji Lee·2024년 1월 8일
0

CS공부

목록 보기
4/6


1958년, 첫 번째 함수형 프로그래밍 언어인 LISP 등장

  • 함수형 프로그래밍 언어는 수학의 원리와 밀접하게 연관되어 있어 배우는데 시간이 걸림
  • 사람의 사고 방식과 비슷한 절차지향, 객체지향 프로그래밍이 더 보편적으로 사용됨
  • 최근, AI, IoT, 비트코인 등장으로 방대한 데이터를 빠르게 계산해서 병렬적으로 안정적으로 처리하는 것이 중요하게 되어 함수형 프로그래밍이 주목을 받게 됨
  • 객체지향 프로그래밍을 함수형 프로그래밍으로 대체할 수는 없음
    • 많은 프로그래밍 언어에 최신 버전의 함수형 프로그래밍 특징이 더해져 있음

특징

1. 순수 함수

함수에서 외부의 상태값 참조하거나 외부의 상태를 변경하면 X

  • 동일한 인자를 넣었을 때, 항상 동일한 결과값 반환
  • 언제 선언이 되었는지 외부에 전혀 영향을 받지 않아야 함
  • 아래 코드는 함수형 프로그래밍 X외부 값 참조함
    let num = 1;
    
    function add(a) {
      return a + num;
    }
  • 아래가 함수형 프로그래밍 O
    function add(a, b) {
      return a + b;
    }
    
    const result = add(2, 3);

2. 비상태 불변성 유지

전달된 데이터를 변경하는 것이 아닌, 새로운 버전의 새로운 오브젝트를 만들어서 결과값으로 전달해야 함 ⇒ 원본 건들면 안됨!

  • 함수에 인자로 전달된 데이터를 변경하면 X
  • 외부의 상태나 함수에 인자로 전달된 데이터 상태를 변경하지 않음으로써 side effect를 만들지 않음 → 멀티쓰레딩 환경에서 안정적으로 동작

    side effect: 함수를 호출하면 외부의 상태가 변경되어 예상치 못한 에러가 발생하는 상황

  • 함수형 프로그래밍 X →인자로 전달된 데이터 변경함
    let person = { name: "minji", age: 25 };
    
    function incearseAge(person) {
      person.age = person.age + 1;
      return person;
    }
  • 함수형 프로그래밍 O → 원본 객체 복사 후 데이터 사용
    let person = { name: "minji", age: 25 };
    
    function incearseAge(person) {
      return { ...person, age: person.age + 1 };
    }

3. 표현식(Expression) 사용

if나 switch, for과 같은 여러가지 문장 사용하면 X

  • 함수형 프로그래밍 X → for loop 사용
    let numbers = [1, 2, 3];
    
    function multiply(numbers, multiplier) {
      for (let i = 0; i < numbers.length; i++) {
        numbers[i] = numbers[i] * multiplier;
      }
    }
  • 함수형 프로그래밍 O
    function multiply(numbers, multiplier) {
      return numbers.map((num) => num * multiplier);
    }

4. 일급함수, 고차함수 속성을 지니고 있어야 함

  • 일급 함수: 함수를 변수에 할당하거나 함수에 인자로 전달하거나 리턴 → 값으로 취급할 수 있는 함수
    const addTwo = (a) => a + 2;
    const multiplyTwo = (a) => a * 2;
    const transform = (numbers) => numbers.map(addTwo).map(multiplyTwo);
    
    console.log(transform([1, 2, 3, 4]));
    • 할당에 사용된 이름과 관계없이 고유한 구별 가능
    • 동적으로 프로퍼티 할당 가능
    • 런타임에도 생성
    • 데이터처럼 구성 가능
  • 고차 함수: 함수 자체를 인자에 전달하거나 함수에서 또 다른 함수 리턴
    const addToppings = (topping) => (food) => food + topping;
    const egg = addToppings("🥚");
    const bacon = addToppings("🥓");
    
    console.log(egg("🍳"));
    console.log(bacon("🍞"));
    • 배열의 고차함수: forEach(), map(), find(), findIndex() 등등

장점

  • side effect를 사전에 방지할 수 있음
  • 객체지향보다 코드가 간결
  • 비절차형이라 연산 시점이 중요하지 않음
  • 테스트가 쉬움
  • 가독성과 유지 관리가 쉬움
  • 함수 사용하기 때문에 반복되는 개발이 쉬워짐

단점

  • 외부 데이터 혹은 내부 데이터 상태 조작 X

절차지향 vs 객체지향 vs 함수형

함수형 프로그래밍이 뭔가요?

0개의 댓글