[TIL] 함수형 프로그래밍

krkorklo·2022년 8월 21일
0

TIL

목록 보기
7/29
post-thumbnail

함수형 프로그래밍

  • 부수 효과를 없애고 순수 함수를 만들어 모듈화 수준을 높이는 프로그래밍 패러다임
  • 동일한 입력값을 넣었을때 항상 동일한 리턴값을 반환해 외부에 영향을 받지 않는다!
  • 반복문을 사용하지 않고 재귀호출을 사용

    부수 효과
    외부 상태를 변경하거나 함수로 들어온 인자 상태를 변경하는 것

  • 순수함수가 오로지 출력(return)만 하기 때문에 입력된 값이 변경되지 않는다
  • 대입문을 사용하지 않는 프로그래밍!
  • 예상치 못한 output이 나오면 input만 점검하면 된다는 장점

일급 객체

  • 다른 요소와 아무런 차별이 없는 객체
  • 함수의 인자로도 넘겨질 수 있고, 변수에 대입도 가능한 객체
  • 객체지향 프로그래밍에서는 클래스(객체)가 일급 객체, 함수형 프로그래밍에서는 함수 자체가 일급 객체!

순수 함수

  • 동일한 입력에 대해 항상 동일한 출력을 반환하는 함수
  • 외부의 상태를 변경하거나 영향을 받지 않는 함수
  • 프로그램의 변화 없이 입력값에 대한 결과를 예상할 수 있어 테스트에 용이
  • 부수효과를 없애서 혼잡함을 줄이고 예측가능한 아웃풋을 활용해 다른 순수함수와 조합을 쉽게 하고자 함!

클로저

  • 반환된 내부함수가 자신이 선언됐을 때의 환경(Lexical environment)인 스코프를 기억하여 자신이 선언됐을 때의 환경(스코프) 밖에서 호출되어도 그 환경(스코프)에 접근할 수 있는 함수
  • 스코프(유효 범위)를 이용해 변수의 접근 범위를 닫음
  • 외부 함수 스코프에서 내부 함수 스코프로 접근 불가
  • 데이터(어휘적 환경)와 그 데이터를 조작하는 함수를 연관
function outerFn() {
  let x = 10;
  return function innerFn(y) { // 클로저
    return x = x + y;
  }
}
let a = outerFn(); // 외부함수 호출은 한번만. 이제 a 변수는 innerFn 함수를 참조
a(5); // 15
a(5); // 20
a(5); // 25

불변성

  • 객체가 생성된 이후 그 상태를 변경할 수 없는 것을 의미한다
  • Boolean, Number, String, null, undefined, Symbol과 같은 타입은 불변성을 유지!
  • Object 타입은 변경 가능한 값
  • 객체의 불변성을 지키기 위해서는?
    • 스프레드 문법 사용
    • immer 라이브러리 사용

참조 투명성

  • 함수 입력 표현식을 그 결과로 치환해도 함수 작동에 문제가 없는 성질
  • 같은 파라미터에 한해 언제나 같은 리턴값을 보장하는 순수 함수의 특징과 같음
function add(int a, int b) {
    return a + b
}

function mult(int a, int b) {
    return a * b;
}

const x = add(2, mult(3, 4));
function add(int a, int b) {
    const result = a + b;
		console.log(result);
		return result;
}

const result = add(3, 4);

고차함수

  • 함수를 인자로 받거나 함수를 리턴하는 함수
  • 다른 함수의 인자로 전달되는 함수를 콜백함수라고 한다
  • filter, map, reduce

커링

  • 다중 인수를 가지는 함수를 단일 인수를 가지는 함수들의 함수열로 바꾸는 것
  • 인자가 여러개인 함수의 일부 인자를 고정시키는 새로운 함수
  • 부수효과를 최대한 줄이고 동일한 입력에 동일한 결과를 내기 위함
const hello = (word) => (name) => {
    console.log(`${word}, ${name}`);
};

hello("hi")("jhj");

절차적 프로그래밍

  • Procedure(루틴, 서브루틴, 메소드, 함수)를 이용해 작성하는 프로그래밍 스타일
  • 일이 진행되는 순서대로 프로그래밍
  • 코드의 가독성이 좋고 컴퓨터의 처리구조와 비슷해 실행 속도가 빠르다
  • 하지만 각 코드가 순서에 민감해 유지보수 및 분석이 어려울 수 있다

객체 지향 프로그래밍

  • 프로그래밍에 필요한 속성과 메소드를 가진 클래스를 정의하고 정의된 클래스를 통해 객체를 생성하고 객체 간의 유기적인 상호작용을 통해 로직을 구성하는 프로그래밍 방식
  • 코드의 재사용이 가능해 확장이나 유지보수에 용이하다
  • 하지만 처리 속도가 상대적으로 느리고 설계에 많은 시간이 소요된다

함수형 vs 객체지향

객체지향(명령형)

  • 무엇을 할 것인지보다 어떻게 할 것인지 설명 (상태 변화를 통해 원하는 값을 얻음! → 부수효과 존재)
  • 알고리즘을 명시하지만 목표는 명시하지 않는다

함수형(선언형)

  • 어떻게 할 것인지보다 무엇을 할 것인지 설명
  • 의도에 집중한다
let numbers = [1, 2, 3];

function multiply(numbers, multiplier) {
    for (let i = 0; i < numbers.length; i++) {
        numbers[i] = numbes[i] * multiplier;
    }
}

// 어떻게
function multiply(number, multiplier) {
    return number.map((num) => num * multiplier);
}

// 무엇을

참고자료
https://jongminfire.dev/함수형-프로그래밍이란
https://hanamon.kr/javascript-클로저/
https://developer.mozilla.org/ko/docs/Web/JavaScript/Closures

0개의 댓글