함수형 프로그래밍

Ouroboros·2023년 9월 3일
0

개발상식

목록 보기
5/17

1. 프로그래밍 패러다임

1) 종류


프로그래밍 패러다임은 프로그래머들에게 프로그래밍의 관점을 갖게 해주고 결정하게 해준다.
예를 들어, 객체지향 프로그래밍을 하는 개발자들은 프로그램을 상호작용하는 객체의 집합으로 본다. 반면에 함수형 프로그래밍을 사용한다면, 개발자는 프로그램을 함수값의 연속으로 생각한다.

2) 설명

1. 명령형 프로그래밍

▶️ 무엇(What)을 할 것인지 나타내기보다 어떻게(How) 수행할 명령을 순서대로 설명하는 방식
▶️ 컴퓨터가 수행할 명령들을 순서대로 써 놓은 것
▶️ 컴퓨터 프로그램은 아니지만 요리법이나 공정 점검표같은 것들이 명령형 프로그래밍과 비슷한 개념

  • 객체 지향형
    [객체지향 자세한 설명🥰]
    - 작은 부품인 객체를 만들고 이렇게 만들어진 객체들을 결합하여 하나의 프로그램을 만드는 방식
    - 대표적 언어 : C++, Java, C#

  • 절차 지향형
    - 위에서부터 아래로 순차적으로 진행되어서 프로그램을 유기적으로 연결하는 방식
    - 대표적 언어 : C, C++

2. 선언형 프로그래밍

▶️ 무엇(What)을 나타낼지에 대해서 관점을 두어서 프로그래밍을 수행하는 기법
▶️ 예를 들어, 웹 페이지는 선언형인데 웹페이지는 제목, 글꼴, 본문, 그림과 같이 "무엇"이 나타나야하는지를 묘사함

  • 논리형
    - 해결을 찾기 위한 단계들에 주목하기 보다는 해결의 '속성들’에 주목하는 프로그래밍 기법
  • 함수형
    - 순수 함수(Pure Function)를 조합하고 프로그램을 만드는 방식
    - 함수형 프로그래밍 언어들은 ⑴람다 연산을 발전시킨 것


2. 함수형 프로그래밍

1) 함수형 프로그래밍을 배워야 하는 이유

  • JavaScript
    객체 지향적인 측면이 보강되고 있지만 근간은 여전히 함수형 언어에 기반하고 있기 때문에 JS를 잘하기 위해서는 함수형 프로그래밍에 대한 이해가 필요
  • 모듈화
    객체 단위의 모듈화는 가장 작은 단위의 모듈화가 아닌 반면, 함수형 프로그래밍의 함수를 모듈화할 경우 수 많은 곳에 재사용 가능
  • 안전함
    함수형 프로그램은 순수 함수로만 짜야하기 때문에 순수함수는 ⑵부수효과가 적어지는 효과
    따라서 버그가 줄어들고 프로그램이 안전

2) 특징

1. 선언형 함수

선언형 함수는 무엇(What)을 나타낼지에 대해서 관점을 두어서 프로그래밍을 수행한다

//명령형
let numbers = [2, 1, 12];

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

명령형 프로그래밍은 for문을 이용해서 numbers에 multiplier를 곱해주는 과정을 나타낸다.
반면 선언형은 for문 대신에 map이라는 함수형 코드를 사용한다.
**Javascript에서 함수형 프로그래밍을 사용한다면, filter,map,take,reduce 등의 함수형 코드를 사용한다.

2. 순수함수

함수의 내부에서 인자값을 변경하거나 프로그램 상태를 변경하는(side effect) 부작용이 없는 함수
-> 부수효과가 적다.

//순수함수가 아닌 경우
let num = 9494;

function add(a) {
    return a + num;
}
// 순수함수
function add(a, b) {
    return a + b;
}

순수함수가 아닌 경우는 num 값의 변화에 따라서 add함수의 결과값이 바뀐다. 반면 순수함수의 예시에서는 add함수가 프로그램 실행에 영향을 주지 않고, 입력값에 의해서만 값의 변화만 있다.

3. 1급객체, 고차 함수

1급 객체 특징 :

  • 함수를 변수에 할당

//자바스크립트에서 함수는 일급 객체이기 때문에 변수를 저장할 수 있다.
//함수 표현식은 할당 전에 사용할 수 없다.
//square(7); // --> ReferenceError: Can't find variable : square

 
 const square = function (num) {
 	return num * num;
 }
 
 // square에는 함수가 저장되어 있으므로 (일급 객체), 함수 호출 연산자 '()'를 사용할 수 있다.
 output = square(7);
 console.log(output); // -> 49


함수 자체가 일급객체이기 때문에 고차함수를 만드는게 가능해진다.
고차 함수(higer order function)는 함수를 인자(argument)로 받을 수 있고, 함수의 형태로 리턴할 수 있는 함수이다.

  • 다른 함수를 인자로 전달
function tripple(num) {
  return num * 3;
}

function trippleNum(func, num) {
  return func(num);
}


//함수 trippleNum은 다른 함수를 인자로 받는 고차 함수이다.
//아래와 같은 경우, 함수 tripple은 함수 trippleNum의 콜백 함수이다.
 

let output = trippleNum(tripple, 5);
console.log(output); // -> 15;
  • 반환값으로 사용 가능
function multiplier(multiply){
  return function (num) {
    return num * multiply;
  }
}


//함수 multiply는 다른 함수를 리턴하는 고차 함수이다.
//multiplier는 인자를 한 개 입력받아서 함수(익명 함수)를 리턴한다.
//리턴되는 익명 함수는 인자 한 개를 받아서 multiply와 곱한 값을 리턴한다.

 
 // multiplier(8)은 함수이므로 함수 호출 연산자 '()'를 사용할 수 있다.
 let output = multiplier(8)(5); // -> 40
 console.log(output); // -> 40
 
 // javascript에서 함수는 일급 객체이기 때문에
 // multiplier가 리턴하는 함수를 변수(output)에 저장할 수 있다.

 const multiply1 = multiplier(7);
 output = multiply1(3);
 console.log(output); // -> 21

4. 불변성

함수형 프로그래밍에서의 데이터는 변하지 않는 불변성을 유지해야 한다.

//변하는 값
let person = { name: "song", age: "1999" };

function increaseAge(person) {
    person.age = person.age + 1;
    return person;
}
// 불변성 만족
const person = { name: "song", age: "2000" };

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

첫번 째 예시의 경우 increaseAge가 person의 age의 값을 변화시키므로 불변성을 만족시키지 못한다.
반면, 두번 째 예시는 원본 데이터를 변경하지 않고 데이터의 복사본을 만들어서 변경하고 return하고 있으므로 원본 데이터의 불변성을 유지하게 한다.

3) 장단점

<장점>

  • 더 나은 모듈화와 짧은 코드를 제공
  • 가독성이 높은 코드를 작성 가능
  • 부수효과를 제거
  • 함수 단위의 코드 재사용이 쉬움
  • 불변성을 지향하기에 프로그램 예측이 쉬움

<단점>

  • 함수형 프로그래밍의 개념 자체를 이해하기 어려움
  • 프로그래밍을 진행하면서 많은 함수들을 파악하고 유지 관리하기 힘들어질 수 있음 -> 함수를 조합하기 복잡해지며 꾸준한 리팩터링(Refactoring)이 필요

주석

⑴람다 : 알론조 처치가 1930년대에 개발된 형식 체계로서, 계산가능성, 결정문제, 함수정의, 함수응용과 재귀를 연구하기 위해 탄생했다.
⑵부수효과 : 원래의 목적과 다르게 다른 효과 또는 부작용이 나는 상태

참고자료

프로그래밍 패러다임 종류 그림
: https://adjh54.tistory.com/

프로그래밍 패러다임
1) https://adjh54.tistory.com/
2)
https://ko.wikipedia.org/wiki/%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%B0%8D_%ED%8C%A8%EB%9F%AC%EB%8B%A4%EC%9E%84
3) https://medium.com/free-code-camp/my-favorite-examples-of-functional-programming-in-kotlin-e69217b39112
4) https://code-lab1.tistory.com/245
5) https://jongminfire.dev/%ED%95%A8%EC%88%98%ED%98%95-%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%B0%8D%EC%9D%B4%EB%9E%80
6) 순수함수 코드 : https://mari-mo.tistory.com/83

0개의 댓글