Notice
Recent Posts
Recent Comments
«   2024/09   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30
Archives
Today
Total
관리 메뉴

충분히 쌓여가는

함수형 프로그래밍 본문

IT/Computer Science

함수형 프로그래밍

빌드이너프 2023. 2. 7. 10:25

함수형 프로그래밍: 하나의 프로그래밍 패러다임으로 정의되는 일련의 코딩 접근 방식

자료처리를 수학적 함수의 계산으로 취급하고 상태와 가변 데이터를 멀리하는 프로그래밍 패러다임을 의미함

함수형 프로그래밍을 배우는 것은 다른 방식으로 사고하는 법을 배우는 것

 

함수형 언어로 설계된 언어

  • 클로저, 스칼라, 하스켈
  • 자바스크립트, 코틀린, 파이썬 => 최근 버전에 함수형 프로그래밍 문법 추가

 


함수형 프로그래밍 특징

1. pure function 순수 함수

  • 동일한 입력에는 항상 같은 값을 반환해야 하는 함수
  • 함수의 실행이 프로그램의 실행에 영향을 미치지 않아야 하는 함수
  • 함수 내부에서 인자의 값을 변경하거나 프로그램 상태를 변경하는 Side Effect가 없는 것
순수 함수는 프로그램의 변화 없이 입력 값에 대한 결과를 예상 할 수 있어 테스트 용이함

 

순수함수 아닌 것

let num = 1;

function add(a) {
    return a + num;
}
  •  add라는 함수 안에서 전역으로 선언된 변수인 num을 참조하기 때문에 순수함수라고 볼 수 없다.

 

순수함수인 것

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

const result = add(2, 3);
  • add의 함수가 프로그램 실행에 영향을 미치지 않고 입력 값에 대해서만 값의 변환이 있으므로 순수함수

2. Stateless, Immutability 비상태, 불변성

  • 함수형 프로그래밍에서의 데이터는 변하지 않는 불변성을 유지해야 함
  • 데이터의 변경이 필요한 경우, 원본 데이터 구조를 변경하지 않고 그 데이터의 복사본을 만들어서 그 일부를 변경하고, 변경한 복사본을 사용해 작업을 진행

 

 

불변성 불만족

let person = { name: "jongmin", age: "26" };

function increaseAge(person) {
    person.age = person.age + 1;
    return person;
}
  • increaseAge 함수에서 전역으로 선언된 person의 age 속성을 변경하므로 불변성 유지를 만족하지 못함
let: 중복선언 불가. 재할당 가능

 

불변성 만족

// 비상태, 불변성 만족
const person = { name: "jongmin", age: "26" };

function increaseAge(person) {
    return { ...person, age: person.age + 1 };
}
  • 객체의 값을 바꾸기 위해 데이터의 복사본을 만들어, 그 복사본을 사용해 작업을 진행하고 반환
const: 중복선언 불가. 재할당 불가

3. Expressions 선언형 함수

  • 명령형 프로그래밍: 어떻게 할 것인가, 그 결과값에 어떻게 도달하느냐에 관한 것
  • 선언형 프로그래밍: 무엇을 할 것인가, 원하는 결과값을 선언하는 것

for문을 사용해 배열의 각 요소에 multiplier을 곱해주는 명령형 프로그래밍

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);
}
  • 함수형 프로그래밍에서 if,switch, for 등 명령문을 사용하지 않고 함수형 코드로 작성
  • for문을 map으로 대치함

4. Fist-class. Higher-order functions 1급 객체와 고차함수

1급 객체 특징

  • 변수나 데이터 구조안에 담을 수 있음
  • 파라미터로 전달 할 수 있음
  • 반환값(return value)으로 사용할 수 있음
  • 할당에 사용된 이름과 관계없이 고유한 구별이 가능
  • 동적으로 프로퍼티 할당이 가능
프로퍼티(property): 객체 안에 선언된 이름과 값으로 이루어진 한 쌍을 의미

 

1급 객체

const addTwo = (num) => num + 2;
const multiplyTwo = (num) => num * 2;
const transform = (numbers) => numbers.map(addTwo).map(multiplyTwo);

console.log(transform([1, 2, 3, 4])); // [6, 8, 10, 12]
  • 함수를 변수에 할당하거나 반환하는 예시

 

고차함수

  • 함수를 인자로써 전달 할 수 있어야 함
  • 함수의 반환 값으로 또 다른 함수를 사용 할 수 있음
const addInform = (name) => (age) => age + name;
const jongmin = addInform("부산");

console.log(jongmin("051")); // 051부산
  • 함수의 반환 값으로 다른 함수를 사용하거나, 함수의 반환 값으로 또 다른 함수를 사용 할 수 있어야 함

함수형 프로그래밍 장점

  • 높은 수준의 추상화를 제공
  • 함수 단위의 코드 재사용이 수월함
  • 불변성을 지향하기 때문에 프로그램의 동작을 예측하기 쉬워짐

 

함수형 프로그래밍 단점

  • 순수함수를 구현하기 위해서는 코드의 가독성이 좋지 않을 수 있음
  • 함수형 프로그래밍에서는 반복이 for문이 아닌 재귀를 통해 이루어지는데 (deep copy), 재귀적 코드 스타일은 무한 루프에 빠질 수 있음
  • 순수함수를 사용하는 것은 쉬울 수 있지만 조합하는 것은 쉽지 않음

 

 


참고 자료

얄팍한 코딩사전, 함수형 프로그래밍이 뭔가요?

노마드 코더, 연봉이 떡상한다고? 함수형 프로그래밍! 10분만에 이해하기.

jongminfire.dev, 함수형 프로그래밍이란?

 

'IT > Computer Science' 카테고리의 다른 글

cookie / session / token / cache / CDN  (1) 2023.02.08
IPC(Inter Process Communication)  (1) 2023.02.06
GET방식 / POST 방식  (0) 2023.02.03
Normalization 정규화  (0) 2023.02.02
Agile 애자일  (0) 2023.02.01