FrontEnd/웹 지식

함수형 프로그래밍

728x90

🐘 함수형 프로그래밍

[번역] 함수형 프로그래밍 전문가 되기 (Part 1)

가장큰 도움을 받은 글이었다. 위의 내용과 인터넷의 정보들을 조합하여 정리해 보았다.

 

🐬 순수 함수

💡 순수 함수 는 매우 간단한 함수라고 생각 할수있다. 단지 입력된 파라미터에 따라 동작된다.

 

 

let z = 10;
function add(x, y) {
  return x + y;
}

 

위 함수처럼 z변수에 접근하지 않고 독립적으로 진행된다.

 

또다른 특성으로는 순수함수는 같은 Input엔 같은 Output이 와야 한다는 것이다.

 

writeFile(fileName);
updateDatabaseTable(sqlCmd);
sendAjaxRequest(ajaxRequest);
openSocket(ipAddress);

 

예를 들어 위 함수들은 파일,데이터베이스를 조작하거나 하는등의 입력된 값을 실행하는 것 외의 활동을 하게된다. 즉, 같은 입력이 들어와도 부작용이 있을 수 있다.

 

 

🐬 불변성

💡 함수형 프로그래밍에서는 변수가 없다.

 

물론 저장된 값들이나 해당 함수안에서는 변수들이 존재한다. 물론 변수 없이 프로그래밍을 하는것은 불가능 하지만 변수가 아닌, 상수로 존재하는 것이다.

예를 들어 x라는 지역변수에 값이 할당된다면 해당 값은 상수처럼 동작해야 한다. 그렇다면 반복문은 어떻게 될까

결국 for,while같은 반복문은 변하는 값을 사용한다. 변수를 바꾸지 않고 함수형 프로그래밍을 작성하는 방법은 재귀함수 이다.

 

 

재귀함수는 이전 값들을 수정하지 않고, 이전값들을 계산하고 반환된 새로운 값을 계속 사용하는 방식이기 때문에 이를 활용하여 반복문을 작성한다.

 

 

하지만 자바스크립트에서는 재귀함수를 찾기 힘들다. 여기엔 이유가 있다! 우선 자바스크립트 문법은 매끄럽지 못하고, 보통 사람들은 재귀적으로 생각하는것에 익숙하지 못하기 때문이다.

이러한 불변성의 가장 큰 장점은 값이 바뀌지 않기 때문에 읽기만 할 수 있다는 것이다. 만약 어떠한 값을 바꾸려 한다면, 그 값부터 얻은 새로운 값을 이용해야 한다.

 

 

🐬 고차함수

함수형 프로그래밍을 이용하면 리팩토링또한 매끄럽게 진행이 가능하다. 보통 리팩토링을 진행하면 비슷한 부분이 있는곳에서 다른부분만 치환하는 방식으로 진행하게 된다.

그렇다면 만약에 아래와 같은 상황이 있다고 생각해보자!

function validateAddress(address) {
  if (parseAddress(address))     console.log('Valid Address');
  else
    console.log('Invalid Address');
}
function validateName(name) {
  if (parseFullName(name))     console.log('Valid Name');
  else
    console.log('Invalid Name');
}

해당 부분은 함수부분 빼고 모든 부분이 일치한다. 만약에 함수를 파라미터로 전달할 수 있다면 두 함수를 하나로 합치는 것 또한 가능할 것이다. 여기서 나온 개념이 고차함수이다.

 

 

대부분의 언어에서는 함수를 파라미터로 전달하는것을 지원하지 않는다고 한다. 하지만 함수형 프로그래밍에서는 함수는 1급 시민으로, 함수를 단지 값으로 생각한다.

 

 

이렇게 함수를 파라미터로 받는 함수를 고차함수라고 한다.

🐬 클로저

클로저에 대한 설명은 MDN문서에 잘 나와 있었다. 또한 아래 글들도 설명이 잘 나와 있었다.

 

 

클로저 - JavaScript | MDN

[JS]클로져(closure)와 클로져의 사용 예제

 

[JS]클로져(closure)와 클로져의 사용 예제

클로저란? MDN에서는 closure를 이와 같이 정의한다. > "A closure is the combination of a function bundled together (enclosed) with references to its surrounding state

velog.io

 

 

내용이 굉장히 길지만 차근차근 읽으면 이해할만 했다. 중요한건 함수와 함수가 선언된 어휘적 환경의 조합 이란 것이다.

 

조금 쉽게 풀어서 설명하자면

 

자신을 포함하고 있는 외부 함수보다 내자부함수가 더 오래 유지되는 경우, 외부 함수 밖에서 내부함수가 호출되더라도 외부함수의 지역 변수에 접근할 수 있는 함수

 

라고 생각할 수 있을 것 같다.

 

 

🐬 합성 함수

클로저에서 잠깐 설명했지만 리팩토링 과정을 굉장히 어렵다. 코드를 상세하게 짜면 재사용하기 어렵고, 너무 일반적으로 만들면 사용하기 어려울 수 있기 때문이다.

 

결국 함수형 프로그래밍에서 함수들은 하나의 조각이다. 이 조각들을 합쳐서 하나의 프로그램을 만들 수 있다. 조각들을 합쳐 나온 좀더 큰 조각이 합성함수라고 볼 수 있다.

 

이는 루카스에서의 배경 지식에 나온 예제와 상당히 유사하다. 작은 역할을 하는 함수들을 합쳐서 하나의 큰 역할을 하는 함수로 만들면 그것이 합성함수이다.

🐬 커링

만약에 함수들의 인자의 개수가 가지각색이면 함수들을 합성할 때 문제가 생길 수 있다.

하지만 모든 함수가 1개의 파라미터만 받는다면 이 문제를 해결할 수 있다.

JS에 커링을 적용한 아주 간단한 예시를 하나 보자.

var add = x => y => x + y

x+y를 구현한 함수지만, 입력을 한번에 2개를 받는것이 아닌, 나누어서 받는다.

많은 파라미터를 받는 일반버전의 함수를 적은 파라미터의 함수로 리팩토링할때 커링은 빛나게 된다!

🐬 참조 투명성

💡 모든 프로그램에 대해 어떠한 표현식을 모두 그 표현식의 결과로 바꿔도 프로그램에 아무 영향이 없는 것

 

> val x = "Hello"> val r1 = x + " World"
> val r2 = "Hello" + " World"> val r3 = x + " World"

 

 

출처:

https://dowhateveryouwant.tistory.com/30

[우주에 점 찍기:티스토리]

 

 

다음과 같은 예제가 있다 생각해보면, 해당 값의 모든 결과값은 같다. 즉, 함수 x를 그 리턴값으로 치환해도 프로그램에 문제가 없다. 이를 참조에 투명하다 라고 한다.

728x90

'FrontEnd > 웹 지식' 카테고리의 다른 글

자바스크립트 타이머함수  (0) 2022.08.30
스레드와 스케줄링  (0) 2022.08.30
XML 파서  (0) 2022.08.30
콜스택, 메모리힙과 메모리모델 구조  (0) 2022.08.30
캐시교체 정책  (0) 2022.08.30