본문 바로가기

개발 공부

[JS]함수형 프로그램이란

1. 함수형 프로그램 원칙

1. 입출력이 순수해야한다.(순수 함수)
    - 입출력이 순수한 것은 반드시 하나 이상의 인자를 받고, 인자를 처리하여 결과물로 도출해야한다.
    - 인자를 제외한 다른 변수는 사용하면 안된다. 인자를 제외한 다른 변수는 사용하면 안된다.
2. 부작용(부산물)이 없어야한다.
    - 프로그래머가 바꾸고자 하는 변수 외 바뀌어서는 안된다.
    - 원본 데이터는 불변해야한다.
    - 데이터 변경이 필요한 경우, 원본 데이터 구조를 변경하지 않고, 데이터의 복사본을 만들어 작업을 진행한다.

 

// 비상태, 불변성 만족
    const person = { name: "jongmin", age: "26" };
    
    function increaseAge(person) {
        return { ...person, age: person.age + 1 };
    }

3. 함수와 데이터를 중점으로 생각한다.

 

2. 함수형 프로그래밍 함수(map, filter, reduce)

1. map

 

var arr = [1, 2, 3, 4, 5];
var map = arr.map(function(x) {
  return x * 2;
}); // [2, 4, 6, 8, 10]

- arr라는 값을 이용해서 결과를 내고 값은 변하지 않았다.

 

2. filter

// 잘못된 함수형 프로그래밍
var arr = [1, 2, 3, 4, 5];
var condition = function(x) { return x % 2 === 0; }
var ex = function(array) {
  return array.filter(condition);
};
ex(arr); // [2, 4]

// 잘된 함수형 프로그래밍
var ex = function(array, cond) {
  return array.filter(cond);
};
ex(arr, condition);

- condition 변수때문, 인자로 받지 않은 변수를 사용하였다.(잘못된 함수형 프로그래밍)
- condition 변수를 인자로 받으면 된다. 이렇게 하면 쉽게 에러를 추적할 수 있다.(잘된 함수형 프로그래밍)

 

3. 선언형 함수

- 무엇을 할 것인가에 주목한다.

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);
}

- add안에서 add를 또 호출한다.
- 코드의 재사용성이 매우 높아진다.

 

4. reduce

var arr = [1,2,3,4,5,6,7,8,9,10];
arr.reduce(function(prev, cur) {
  return prev + cur;
}); // 55

5. 1급 객체와 고차함수

- 함수형 프로그래밍에서는 함수가 1급 객체다.

5-1. 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]

5-2. 고차함수 특징

- 함수를 인자로써 전달 할 수 있어야 한다.
- 함수의 반환 값으로 또 다른 함수를 사용할 수 있다.

// 고차 함수
const addInform = (name) => (age) => age + name;
const jongmin = addInform("종민");

console.log(jongmin("96")); // 96종민

3. 함수형 프로그래밍 장단점

3-1. 장점

1. 높은 수준의 추상화 제공
2. 함수 단위의 코드 재사용이 수월
3. 프로그램의 동작을 예측하기 쉽다.

3-2. 단점

1. 순수함수 구현하기 위해서 코드 가독성이 좋지 않을 수 있따.
2. 반복은 재귀를 통해이뤄져서 무한 루프에 빠질 수 있다.
3. 조합하는 것은 쉽지 않다.

 

4. 참조 투명성이란?

- 어떤 함수가 동일한 입력을 받았을때 동일한 결과를 나타내는 것.

int count = 0;
int count(){
    return count++;
}// count의 값이 매번 다르다.
final int x = 10;
int getX(){
    return x;
}// 항상 같은 x위 값을 반환하게 된다. 이를 참조 투명하다라고 한다.

 참고 자료:

 

함수형 프로그래밍이란?

jongminfire.dev

 

 

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

안녕하세요. 이번 시간에는 함수형 프로그래밍에 대해서 알아보겠습니다. 사실 함수형 프로그래밍을 중급 강좌에서 다루기엔 좀 어려운 감이 있습니다만, 다음 시간의 실습을 위해 다루도록 하

www.zerocho.com