요약
- 일급객체란 변수나 자료구조(예를 들어 객체나 배열 등)에 저장할수 있으며 함수의 매개변수에 전달하거나 함수의 반환값으로 사용할수있는걸 일급객체라고 부릅니다.
(더 정확하게 말하고 싶으면 무명의 리터럴로 생성할수 있으며 즉 런타임에 생성이 가능합니다 까지 붙여주면 되는데 꼬리질문이 들어오기 쉬운 문장이라 공부만 해놓는걸 추천)
- 자바스크립트는 함수도 일급 객체이며 함수를 객체와 동일하게 사용할수있다는 의미를 가집니다. 일급 객체로서 함수가 가지는 가장 큰 특징은 일반 객체와 같이 함수의 매개변수에 전달할수 있으며 함수의 반환값으로 사용할수있다는것입니다. 이를 통해 함수형 프로그래밍을 가능하게 합니다.
- 함수형 프로그래밍은 순수 함수와 보조 함수의 조합을 통해 외부 상태를 변경하는 사이드 이펙트를 최소화 해서 불변성을 지향하는 프로그래밍 패러다임을 말합니다.
- 함수형 프로그래밍의 최종 목표는 로직 내에 존재하는 조건문과 반복문을 제거해서 복잡성을 해결하며 변수 사용을 억제하거나 생명 주기를 최소화해서 상태 변경을 피해 오류를 최소하는것입니다.
- 순수 함수는 어떤 외부상태에도 의존하지 않고 오직 매개변수를 통해 함수 내부로 전달된 인수에만 의존해 값을 생성하고 반환하는 함수를 말합니다. 즉 순수함수는 불변성을 유지합니다.
자바스크립트의 함수
// 1. 함수는 무명의 리터럴로 생성할수있다. // 2. 함수는 변수에 저장할수있다. // 런타임(할당 단계)에 함수 리터럴이 평가되어 함수 객체가 생성되고 변수에 할당 const increase = function(num) { return ++num; }; const decrease = function(num) { return --num; } // 2. 함수는 객체에 저장할수있다. const auxs = { increase, decrease }; // 3. 함수의 매개변수에 전달할수있다. // 4. 함수의 반환값으로 사용할수있다. function makeCounter(aux) { let num = 0; return function() { num = aux(num); return num; }; } // 3. 함수는 매개변수에게 함수를 전달할수 있다. const increaser = makeCounter(auxs.increase); console.log(increaser()); // 1 console.log(increaser()); // 2 // 3. 함수는 매개변수에게 함수를 전달할수 있다. const decreaser = makeCounter(auxs.decrease); console.log(decreaser()); // -1 console.log(decreaser()); // -2
함수가 일급 객체라는것은 함수를 객체와 동일하게 사용할수 있다는 의미
객체는 값이므로 함수는 값과 동일하게 취급할수 있다.
→ 함수는 값을 사용할수있는곳이라면 어디서든지 리터럴로 정의할수 있으며 런타임에 함수 객체로 평가된다.
일급 객체로서 함수가 가지는 가장 큰 특징은 일반 객체와 같이 함수의 매개변수에 전달할수있으며 함수의 반환값으로 사용할수있다.
→ 함수형 프로그래밍을 가능하게 하는 자바스크립트 장점
함수는 객체지만 일반 객체와는 차이가 있다.
일반 객체는 호출할 수 없지만 함수 객체는 호출할 수 있다.
함수 객체는 일반 객체에는 없는 함수 고유의 프로퍼티를 소유한다.
순수 함수와 비순수 함수
함수형 프로그래밍에서 어떤 외부상태에 의존하지 않고 변경되지 않는 부수효과가 없는 함수를 순수함수라고 하고 외부상태에 의존하거나 외부상태를 변경하는 부수효과가 있는 함수를 비순수 함수라고 한다.
순수함수는 어떤 외부상태에도 의존하지않고 오직 매개변수를 통해 함수 내부로 전달된 인수에만 의존해 값을 생성하고 반환한다.
함수 내부상태에만 의존하더라도 내부 상태가 호출될때마다 변화하는값이라면 순수 함수가 아니다.
순수함수는 인수를 변경하지않는것이 기본이다.
순수함수는 불변성을 유지한다.
순수함수는 어떤 외부 상태에도 의존하지 않으며 외부 상태를 변경하지도 않는 함수다.
함수가 외부상태를 변경하면 상태 변화를 추적하기 어려워진다.
→ 함수 외부 상태의 변경을 지양하는 순수함수를 사용하는것이 좋다.
함수형 프로그래밍은 순수함수와 보조 함수의 조합을 통해 외부 상태를 변경하는 부수효과를 최소화 해서 불변성을 지향하는 프로그래밍 패러다임이다.
로직 내에 존재하는 조건문과 반복문을 제거해서 복잡성을 해결하며 변수 사용을 억제하거나 생명주기를 최소화해서 상태 변경을 피해 오류를 최소화하는것을 목표로 한다.
콜백 함수
// n만큼 어떤 일을 반복한다. function repeat(n) { // i를 출력한다. for(var i = 0; i < n; i++) console.log(i); } repeat(5); // 0 1 2 3 4
repeat 함수는 매개변수를 통해 전달받은 숫자만큼 반복하여
console.log(i) 를 호출한다.repeat 함수는
console.log(i) 에 강하게 의존하여 다른 일을 할수 없다.함수의 변하지 않는 공통 로직은 미리 정의해두고 경우에 따라 변경되는 로직은 추상화해서 함수 외부에서 내부로 전달하는것이다.
// 외부에서 전달받은 f를 n만큼 반복 호출한다. function repeat(n, f) { for(var i = 0; i < n; i++) { f(i) } } var logAll = function(i) { console.log(i) } // 반복 호출할 함수를 인수로 전달한다. repeat(5, logAll); // 0 1 2 3 4
함수는 경우에 따라 변경되는 일을 함수 f로 변경했고 이를 외부에서 전달받는다.
JS의 함수는 일급객체이므로 함수의 매개변수를 통해 함수를 전달할수 있다.
repeat 함수는 더이상 내부 로직에 강력히 의존하지 않고 외부에서 로직의 일부분을 함수로 전달받아 수행하므로 더육 유연한 구조를 갖게 되었다.
함수의 매개변수를 통해 다른 함수의 내부로 전달되는 함수를 콜백함수라고 하며 매개변수를 통해 함수의 외부에서 콜백 함수를 전달받은 함수를 고차함수라고 한다.
매개변수를 통해 함수를 전달받거나 반환값으로 함수를 반환하는 함수를 함수형 프로그래밍 패러다임에서 고차 함수라고 한다.
콜백 함수는 함수 외부에서 고차 함수 내부로 주입하기 때문에 자유롭게 교체할수있다는 장점이 있다.
고차 함수는 콜백 함수를 자신의 일부분으로 합성한다.
고차함수는 매개변수를 통해 전달받은 콜백함수의 호출시점을 결정해서 호출한다.
콜백함수는 고차 함수에 의해 호출되며 이때 고차함수는 필요에 따라 콜백함수에 인수를 전달할수있다.
따라서 콜백함수를 전달할때 콜백함수를 호출하지않고 함수 자체를 전달해야한다.
콜백 함수는 함수형 프로그래밍 패러다임 뿐만 아니라 비동기 처리에 활용되는 중요한 패턴이다.