3주차 정리

박동규·2022년 1월 22일
0

프로그래밍 패러다임

프로그래밍 패러다임이란?

기계어에서 어셈블리어.. 기존의 프로그래밍 방식으로는 반복되는 코드가 많고 소프트웨어의 유지 보수와 기존 소프트웨어의 재사용이 어렵다는 등의 '문제'가 제기되며, 이를 해결하기 위해 고안하고 채택한 원칙들의 집합이라 표현할 수 있다.

명령형 프로그래밍 패러다임(OOP)

  • 어떻게 문제를 해결할 것인가를 서술한다.(How to solve)

선언형 프로그래밍 패러다임(FP)

  • 문제 해결을 위해 무엇을 해야할 지 서술한다.(What to solve)

함수형 프로그래밍

등장 배경

함수형 프로그래밍은 사실 오래 전 고안 된 패러다임 중 하나이다. 등장 당시에는 크게 주목 받지 못했으나, CPU 기술의 발달로 멀티 코어가 등장하게 되고, 멀티 프로세스를 가지는 프로그램이 늘어나며 점점 부각 되었다.

왜 부각 되었는가?

1. 불변성(Immutable)이 갖는 강점

FP는 값을 직접 변경하지 않고, 복사하여 이용하기 때문에 부수 효과가 없고 함수를 언제 실행 하더라도 동일한 결과값이 나온다. 이러한 특징 때문에 멀티코어 프로세스에서 교착 상태에 빠지지 않는다는 장점이 있고, 동시성 프로그래밍에서 강력한 패러다임으로 부각된다.

2. 명확성

함수명은 함수가 하는 일을 명확하게 표현하고, 함수 자체를 값으로 사용하여 이를 표현식으로 어떤 목표를 가졌는지(What) 명확하게 표현하기 때문에 코드를 읽기 쉽다.

순수 함수

https://velog.io/@kyu/%ED%95%A8%EC%88%98%ED%98%95-%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%B0%8D

클로저(Closure)

함수형 프로그래밍에서 함수는,
<자신이 선언된 시점에서의 환경 (어휘적 환경: lexical environment) 을 기억한다>

는 특징이 있다. 여기서 환경이란, 함수 안에 저장된 값들을 의미한다고 생각하면 된다. 이러한 개념을 클로저(closure)라고 부른다.

아래의 내용은 생활코딩에 개재된 예시이다.

function outter(){
    var title = 'coding everybody';  
    return function(){        
        alert(title);
    }
}

inner = outter();
inner();

함수 outter를 호출하여 inner 변수에 담았다. inner 변수에는 title을 참조하여 알림을 실행하는 이름 없는 함수가 담겨있는 상태고,

inner()로 실행하게 되면 outter 함수는 실행이 끝났기 때문에 outter의 지역변수(title)는 소멸되는 것이 일반적인 코드의 동작 방식이다.

하지만 FP에서는 내부 함수가 외부 함수의 지역변수를 참조하고 있다면, 해당 내부 함수가 소멸 되기 전까지 값을 기억하고 있는 특성을 가지고, 이를 클로저라 한다.


클로저의 개념이 없다면, 상태를 기억하기 위해서 전역변수를 사용해야 할 것이다. 전역변수를 사용하게 되면 누군가 변수에 접근하여 값을 변경할 수 있게 되는데, 이러면 순수함수라는 개념이 깨지게 된다. 클로저의 개념을 이용하면 함수가 상태를 관리할 수 있도록 할 수 있는 장점이 있다.

고차 함수

함수를 인자(argument)로 전달 받거나 함수를 반환하는 함수이다.
고차 함수의 개념을 이용하여 코드를 작성하면, 함수 내부의 실행 값은 숨기고 함수명을 유기적으로 chaining하여 마치 문장을 읽는 듯한 흐름으로 간결하게 코드를 작성할 수 있다.

let nums1 = [1, 2, 3];
let nums2 = [];

for(let i = 0; i < nums1.length; i++) {
  nums2.push(nums1[i] + 5);
}

console.log(nums2); // [6, 7, 8]

위의 방식은 일반 함수로 작성한 경우이다. 배열에 저장된 값에 +5씩 더하여 배열에 저장하는 로직이다.

let nums1 = [1, 2, 3];
let addNum5 = num => num + 5;
let nums2 = nums1.map(addNum5);

console.log(nums2); // [6, 7, 8]

고차 함수를 이용하면 map함수에 함수를 전달하여, 코드를 간결하고 읽기 쉽게 표현식으로 작성할 수 있다.

0개의 댓글