❗ 프로그래밍 패러다임(명령형 vs 선언형)
프로그래밍 패러다임은 프로그래머에게 프로그래밍의 관점을 갖게하고 결정하는 역할을 한다."명령형 프로그래밍은 어떻게 할 것인가(How)를 표현하고, 선언형 프로그래밍은 무엇을 할 것인가(What) 표현한다."
명령형 프로그래밍
: 프로그래밍의 상태와 상태를 변경시키는 구문의 관점에서 연산을 설명하는 방식(=How)
객체지향 프로그래밍(OOP)
: 객체들의 집합으로 프로그램의 상호작용을 표현
선언형 프로그래밍
: 어떤 방법으로 해야 하는지(How)를 나타내기보다 무엇(What)과 같은지를 설명하는 방식
함수형 프로그래밍(FP)
: 순수 함수를 조합하고 소프트웨어를 만드는 방식 (클로저, 하스켈, 리스프)예를들어, 레고공장을 명령형과 함수형 두 가지 공장에서 만들어 낸다고 할 때, 레고는 아래와 같이 만들어진다.
명령형 공장: 원료가 들어오면 먼저
빨간색 색소
를 넣는다. 그 뒤,4*4
레고틀로 레고 원료를 찍는다. 찍어낸 원료는 2시간 동안 굳힌 뒤에 질감을 위해 특수 배합괸 도료로 코팅을 해준다.
함수형 공장:빨간 4*4 레고 블록
➡ 명령형 공장은 "어떻게(how)"에 집중하고 있다. / 함수형 공장은 "무엇(what)"에만 집중하고 있다. 이는 함수형 프로그래밍의 장점을 나타낸다.
함수형 프로그래밍의 경우, 코드의 길이가 줄고, 부산물이 없어진다. 내부에서고려해야 하는 변수(side effect)가 없기 때문에 함수는 특정 input에 대해 output을 생성해 낼 수 있다. 또한 절차가 가려지기 때문에 가독성이 좋다
객체지향 프로그래밍(OOP)
은 프로그램을 상호작용하는 객체들로 보는 반면,
함수형 프로그래밍(FP)
은 프로그래밍을 자체 값을 가지지 않는 순수함수들의 연속으로 본다.
즉, 함수형 프로그래밍은 명령적이라기보단 선언적이고 어플리케이션의 상태의 흐름이 순수 함수를 통해 흐른다. 이는 어플리케이션의 상태가 공유되고, 객체의 메소드와 함께 배치되는 객체 지향 프로그래밍과는 대조적이다.✨✨✨
함수형 코드는 객체 지향 코드에 비해 더 간결하고, 더 예측 가능하고, 더 테스트하기 쉬운 경향이 있다.
❗ 순수함수
입출력이 순수하다는 것은, 반드시 하나 이상의 인자를 받고, 받은 인자를 처리하여 반드시 결과물을 돌려줘야 한다.인자를 제외한 다른 변수는 사용하면 안된다. 받은 인자만으로 결과물을 내야 한다.
// 외부에 영향을 안받는 순수함수 O function add(a, b) { return a + b; } const result = add(2, 3) // 외부에 영향을 받는 함수 X let num = 1; function add(a) { return a + numl; }
또한 if, for, switch 와 같은 문장(statements)을 쓰지 말고, expresions(내장함수)을 써야한다.
// expresions 순수함수 O function multiply(numbers, multiplier) { return numbers.map(num => num * multiplier); } // statements (for, if, switch ...) 순수함수 X let numbers = [1, 2, 3]; function multiply(numbers, multiplier) { for (let i = 0; i < numbers.length; i++) { numbers[i] = numbers[i] * multiplier; } }
input으로 들어온 값에 함수가 영향을 주지 않으며, 외부 변수에 영향을 받지 않고, 항상 같은 output을 생성해 내는 함수이다. 이러한 특성 때문에 함수형 프로그래밍에서 함수 자체는 불변하는 값으로 볼 수 있다. (불변성)
// 외부 변수에 영향을 받지 않는 불변성 , 순수함수 O let person = { name: 'leedev', age: 20 }; function increseAge(person) { return { ...person, age: person.age + 1 }; // 새로운 obj를 만들어서 결과값으로 전달한다 } const result = add(2, 3) // 즉, 외부의 상태나 함수에 인자로 전달된 데이터의 상태를 변경하지 않는다!!! (side effect 만들지 않음) // 외부 변수에 영향을 받는 가변성, 순수함수 X let person = { name: 'leedev', age: 20 }; function increseAge(person) { person.age = person.age + 1; return person; } const result = add(2, 3)
그리고 이 함수라는 값들을 조합해서 새로운 함수(값)를 만들어 낼 수 있다. 때문에 함수도 객체와 동일한 취급이 가능하다.
이러한 특징을 1급 객체(First Object, 또는 1급 시민)라고도 한다.
🏈 1급 객체(First class object)란 다음과 같은 조건을 만족하는 객체
변수
나데이터
에 할당할 수 있어야 한다.- 파라미터(객체의 인자)로 전달 할 수 있다.
- 반환값(return value)으로 사용할 수 있다.(=객체의 리턴값으로 리턴할 수 있다)
- 할당에 사용된 이름과 관계없이 고유한 구별이 가능하다.
- 동적으로 프로퍼티 할당이 가능하다.
- 자바스크립트에서 함수(Function)은 객체(Object)이므로 1급 함수로 불린다.