Computer Science

함수형 프로그래밍의 특징과 장단점

emhaki 2023. 2. 8. 11:01
728x90
반응형
SMALL

함수형 프로그래밍이란?

함수형 프로그래밍은 하나의 프로그래밍 패러다임으로 정의되는 코딩 접근 방식이며, 자료처리를 수학적 함수의 계산으로 취급하고 상태와 가변 데이터를 멀리하는 프로그래밍 패러다임을 의미한다.

함수형 프로그래밍의 특징

🔎 1. 순수함수 (Pure function)

  • 동일한 입력에는 항상 같은 값을 반환해야 하는 함수
  • 함수의 실행이 프로그램의 실행에 영향을 미치지 않아야 하는 함수
  • 함수 내부에서 인자의 값을 변경하거나 프로그램 상태를 변경하는 Side Effect가 없는 것
num = 1

def add(a):
  return a + num

위와 같은 예제에서는 add라는 함수 안에서 전역으로 선언된 변수인 num을 참조하기 때문에 순수함수라고 볼 수 없다. 

// 순수함수
def add(a, b):
    return a + b

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 속성을 변경하므로 불변성을 만족하지 못한다.

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

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

위처럼 객체의 값을 바꾸기 위해서는 데이터의 복사본을 만들어서 그 복사본을 사용해 작업을 진행하고 반환한다.

🔎 3. 선언형 함수 (Declarations)

let numbers = [1, 2, 3];

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

위의 예시에서는 for문을 사용해서 배열의 각 요소에 multiplier 곱해주는 명령형 프로그래밍이다. 함수형 프로그래밍에서는 마찬가지로 if, switch, for 등 명령문을 사용하지 않고 함수형 코드로 사용해야 한다.

// 선언형 프로그래밍
function multiply(number, multiplier) {
    return number.map((num) => num * multiplier);
}

위의 예시에서는 for문을 map으로 바꿨다.

🔎 4. 1급 객체와 고차함수 (First-class, Higher-order functions)

  • 함수형 프로그래밍에서는 함수가 1급 객체가 된다. 1급 객체의 특징은 다음과 같다.
  • 변수나 데이터 구조안에 담을 수 있다.
  • 파라미터로 전달 할 수 있다.
  • 반환값(return value)으로 사용할 수 있다.
  • 할당에 사용된 이름과 관계없이 고유한 구별이 가능하다.
  • 동적으로 프로퍼티 할당이 가능하다.
// 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("haki");

console.log(haki("95")); // 95haki

위의 예제처럼 함수의 반환 값으로 다른 함수를 사용하거나, 함수의 반환 값으로 또 다른 함수를 사용 할 수 있어야 한다.

함수형 프로그래밍을 알아야하는 이유

사실 객체지향적 사고와 명령형 프로그래밍을 사용하기만 해도 왠만한 프로그램을 설계하고 작성하는 데는 무리가 없다고 한다. 이미 함수형 프로그래밍이라는 패러다임이 나오기 전부터 여러 프로그램들이 만들어졌으니 말이다. 하지만 함수형 프로그래밍이 주목받는 이유는 분명 기존의 프로그래밍이랑 분명한 차이가 있기 때문이다. 함수형 프로그래밍의 대표적인 장점은 다음과 같다.

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

함수형 프로그래밍의 장단점

장점

1. 높은 수준의 추상화를 제공한다.

2. 함수 단위의 코드 재사용이 수월하다.

3. 불변성을 지향하기 때문에 프로그램의 동착을 예측하기 쉬워진다.

 

단점

1. 순수함수를 구현하기 위해서는 코드의 가독성이 좋지 않을 수 있다.

2. 함수형 프로그래밍에서는 반복이 for문이 아닌 재귀를 통해 이루어지는데 (deep copy), 재귀적 코드 스타일은 무한 루프에 빠질 수 있다.

3. 순수함수를 사용하는 것은 쉬울 수 있지만 조합하는 것은 쉽지 않다.

📚 Reference

 

기존의 사고 방식을 깨부수는 함수형 사고

최근 많은 언어들이 함수형 프로그래밍 패러다임을 도입하며, 이에 대한 개발자들의 관심 또한 나날히 높아지고 있다. 필자 또한 라는 책을 읽으면서 기존의 패러다임과 사뭇 다른 함수형 프로

evan-moon.github.io

 

함수형 프로그래밍이란?

jongminfire.dev

 

https://www.zerocho.com/category/JavaScript/post/576cafb45eb04d4c1aa35078

 

www.zerocho.com

728x90
반응형

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

인증과 인가  (0) 2023.04.02
쿠키(Cookie)와 세션(Session)  (0) 2023.02.08
IPC(Inter-Process Communication)란?  (2) 2023.02.06
[DB] 데이터베이스 정규화란?  (0) 2023.02.02
애자일(Agile)이란?  (0) 2023.02.01