본문 바로가기
웹개발 · IT 지식

[웹개발] 엘리의 드림코딩: 함수형 프로그래밍 노트 정리

by 메이플 🍁 2022. 11. 30.

1. 프로그래밍 패러다임(Programming Paradigm)

프로그래밍 패러다임이란?

건축을 할때 짓고자하는 건축물에 따라, 건축가의 선호도에 따라 건축의 방법이 달라지는것처럼 프로그램을 만들때도 원하는 목표에 따라 적절한 방법과 기법을 사용해 프로그램을 만들어나가게 된다. 프로그래밍 패러다임은 프로그래머에게 프로그래밍의 관점을 갖게 하고 코드를 어떻게 작성할 지 결정하는 역할을 한다. 즉 프로그래밍 패러다임은 프로그램을 만드는 방법론이다.

 

프로그래밍 패러다임의 종류

  1. 절차지향 프로그래밍
  2. 객체지향 프로그래밍
  3. 함수형 프로그래밍
  4. 함수형 반응형 프로그래밍

함수형 프로그래밍 언어들: Haskell, F3, OCaml, Erlang

함수형 프로그래밍을 지원하는 언어들: JavaScript, Kotlin, Python, Java (객체 지향 프로그래밍도 지원함)

 

2. 함수형 프로그래밍 (Functional Programming)

함수형 프로그래밍이란?

수학에서 함수는 주어진 데이터(input)를 처리해서 결과값(output)을 도출한다. 함수형 프로그래밍도 이와 같이 인풋을 넣으면 어떤 처리과정을 거쳐서 아웃풋이 나오게 된다. 함수형 프로그래밍에서 사용 되는 함수는 외부에서 함수 안에 접근이 불가하고 함수에서도 외부로 접근 불가하다는 특징을 가지고 있다. 함수형 프로그래밍을 통해서 프로그래밍을 만든다는것은 이런 함수들을 적용하고 묶어서 프로그램을 구성해 나가는 것을 말한다. 함수형 프로그래밍만으로 개발하기는 어렵다 하지만 프로젝트를 하면서 필요한 부분에 함수형 프로그래밍 패러다임을 사용해 안정적인 프로그래밍 개발을 할 수 있다.

 

함수형 프로그래밍이 갑자기 주목받는 이유

함수형 프로그래밍은 수학의 원리와 밀접하게 연관이 있기 때문에 배우는데 시간이 걸리고 난해해 오랫동안 사람의 사고 방식과 가장 가까운 절차지향 프로그래밍, 객체지향 프로그래밍이 대세였다. 하지만 AI, 빅데이터, 비트코인 등 방대한 데이터를 빠르게 계산해서 병렬적으로 안정적으로 처리하는 것의 중요성이 부각되면서 함수형 프로그래밍 언어가 다시 주목을 받게 되었다.

 

3. 함수형 프로그래밍의 특징

1) 순수함수 (Pure Functions)

함수형 프로그램 (x)

함수에서 외부의 상태값을 참조하거나 외부의 상태를 변경할 수 없다.

let num = 1
function add(a) {
  return a + num
}

함수형 프로그램 (o)

동일한 인자를 넣었을때 항상 동일한 결과값을 반환해야 하므로 외부에 영향을 받지 않도록 함수를 작성해야한다.

function add(a,b) {
  return a + b
}
const result = add(2, 3)

2) 비상태 & 불변성 유지 (Stateless, Immutability)

함수형 프로그램에서는 외부의 상태나 함수에 인자로 전달된 데이터의 상태를 변경하지 않음으로서 *부작용을 만들지 않으므로 불변성을 유지하기 때문에 멀티쓰레딩 환경에서도 안정적으로 동작한다

*부작용: 함수를 호출하면 외부의 상태가 변경되거나 예상치 못한 에러가 발생하는 것

함수형 프로그램 (x)

함수의 인자에 전달된 데이터를 변경하는 함수는 함수형 프로그래밍이 아니다.

let person = { name: ‘ellie’, age: 20 }
function increaseAge(person) {
  person.age = person.age + 1
  return person
}

함수형 프로그램 (o)

전달된 데이터를 변경하는 것이 아닌 새로운 데이터를 만들어서 결과값으로 전달해야한다.

const person = { name: ‘ellie’, age: 20 }
function increaseAge(person) {
  return { …person, age: person.age + 1 }
}

3) statement가 아닌 expression을 사용

statement: if, switch , for

함수형 프로그램 (x)

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) 일급함수(first class)의 특징을 가짐

일급함수의 특징

  • 함수를 변수에 할당
  • 함수를 다른 함수의 인자로 전달 또는 리턴

함수형 프로그램 (o)

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

 

5) 고차함수(higher order function)의 특징을 가짐

고차함수의 특징

  • 함수 자체를 인자로 전달
  • 함수에서 또 다른 함수를 리턴

함수형 프로그램 (o)

const addToppings = topping => food = food + topping

const egg = addToppings(‘🍳’);
const bacon = addToppings(‘🥓’);

console.log(egg(‘🍚’))
console.log(bacon(‘🥑’))

댓글