[회고] 신입 iOS 개발자가 되기까지 feat. 카카오 자세히보기

🛠 기타/개발상식

함수형 프로그래밍이란?

inu 2021. 5. 2. 15:38
반응형

함수형 프로그래밍?

  • 절차지향 프로그래밍,객체지향 프로그래밍, 함수형 프로그래밍 등을 '프로그래밍 패러다임'이라고 한다.
  • 그 중 수학과 밀접하게 연관되어 함수의 사용을 메인컨셉으로 하는 것이 함수형 프로그래밍이다.
  • 수학에서 주어진 데이터를 처리해 결과값을 도출하듯, 내외부 소통이 한정된 파이프라인(=함수)들을 묶어가며 프로그램을 구성해 나간다.
  • Haskell, OCaml 등 함수형에 특화된 프로그래밍 언어도 있고
  • 자바스크립트, 자바, 코틀린, Go, C++ 등 최근 객체지향과 더불어 함수형 프로그래밍 특징을 접목한 언어들도 많다.

프로그래밍 언어 역사와 함수형 프로그래밍

  • 1958년 첫번째 함수형 프로그래밍 언어라고 할 수 있는 LISP가 등장했다.
  • 우리가 보통 제일 처음으로 많이 배우는 프로그래밍 언어인 C보다도 일찍 등장한 것이다. (1972)
  • 심지어 첫번째 객체지향형 프로그래밍 언어라고 할 수 있는 Simula(1962), Smalltalk(1972)보다도 더 먼저 등장했다.
  • 기존에 함수형 프로그래밍이 주목받지 못했던 이유는 배우는데 시간이 좀 걸리고 난해하게 느껴질 수 있기 때문이었다. 따라서 사람의 사고방식과 가까운 절차지향, 객체지향 프로그래밍이 많이 사용되었다.
  • 하지만 요즘 AI, IoT, 빅데이터, 블록체인 등이 떠오르면서 많은 데이터를 빠르게 병렬적으로 안정적으로 처리할 필요성이 생겼다. 그에 따라 이에 특화되었다고 할 수 있는 함수형 프로그래밍이 주목받게 된 것이다.

함수형 프로그래밍 특징

1. Pure Functions (순수함수)

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

// O
function add(a,b) {
    return a + b;
}
  • 함수에서 외부의 상태값을 참조하거나 변경하는 것은 순수함수라고 볼 수 없다
  • 동일한 인자를 넣었을 때 항상 동일한 결과를 반환하고
  • 언제 선언이 되었는지 등의 요인을 포함하여 외부로부터 전혀 영향을 받아서는 안된다.

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

// X
let person = { name : 'ellie', age : 20 };

function increaseAge(person) {
    person.age = person.age + 1;
    return person;
}

// O
const person = Object.freeze({ name : 'ellie', age : 20 };)

function increaseAge(person) {
    return {...person, age : person.age + 1};
}
  • 함수에 인자로 전달된 것을 변경하는 것은 절대 함수형이 아니다.
  • 새로운 버전의, 새로운 오브젝트를 만들어 결과로 전달해주어야 한다.
  • 이런 제약으로 다른 side effect를 만들지 않기 때문에 여러가지 동시다발적인 멀티쓰레딩 환경에서도 안정적으로 동작할 수 있다.
  • cf. Object.freeze : 불변성 데이터타입이 없는 자바스크립트에서 특정 오브젝트를 불변성으로 만들어주는 함수

3. Expressions Only

// 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);
}
  • if, switch, for과 같은 statements을 사용하지 않고
  • map과 같은 expressions로만 내용을 표현해야 한다.

4. First-class and higher-order functions

// First-class
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]);

// Higher-order
const addToppings = topping => food => food + topping;
const egg = addToppings('계란');
const bacon = addToppings('베이컨');

console.log(egg('피자'));
console.log(bacon('토스트'));
  • 다른 데이터와 마찬가지로 함수가 변수에 할당되거나 함수에 인자로 전달되거나 리턴되는 등의 일들을 할 수 있는 First-class(고차함수) 특징과
  • 함수 자체를 인자로 전달하거나 함수에서 또다른 함수를 리턴하는 higher-order(고차함수) 특징
  • 둘 모두 가지고 있어야 한다.

객체지향 프로그래밍을 위해서는 캡슐화,상속,다형성 등의 개념뿐 아니라 디자인패턴까지 학습해야 했듯이 함수형 프로그래밍을 위해서도 Monad, Semigroup, Functor 등 다양한 컨셉들에 대한 이해를 필요로 한다. 특히 제일 핵심이라고 할 수 있는 Monad는 이해하기 매우 어렵기로 유명하다.


참고 : https://www.youtube.com/watch?v=4ezXhCuT2mw&list=PLcTre5kSvixpF0kPJFWaLR02ana5hBjmK&index=2&t=12s

반응형

'🛠 기타 > 개발상식' 카테고리의 다른 글

CI/CD란?  (0) 2021.07.17
유데미(Udemy) 한글자막 undefined 해결 (21.07.15)  (0) 2021.07.15
명령형 UI와 선언형 UI  (0) 2021.05.02
SSH(Secure Shell Protocol)  (0) 2021.01.22
Linux - web server & apache  (0) 2021.01.22