1급 시민(first-class citizen)의 세 가지 특징
1. 변수에 할당할 수 있다
2. 다른 함수의 인자로 전달될 수 있다.
3. 다른 함수의 결과로서 리턴될 수 있다.
대부분의 프로그래밍 언어에서 숫자는 1급 시민의 조건을 충족합니다.
숫자는 변수에 저장할 수 있고, 인자나 반환값으로 전달할 수 있습니다.
1급 객체(first class object)란?
1급 객체는 특정 언어에서 객체(object)를 1급 시민으로써 취급한다는 뜻입니다.
1급 시민의 조건을 모두 충족합니다.
1급 함수(first class function)란?
1급 객체 뿐만 아니라, 1급 함수도 존재합니다. 함수를 1급 시민으로 취급하는 것입니다. 몇몇의 학자들은 1급 시민의 조건과 함께 1급 함수에게 다음과 같은 추가적인 조건을 요구합니다.
- 런타임(runtime) 생성이 가능하다
- 익명으로 생성이 가능하다
고차 함수(higher-order function)란?
함수를 인자로 전달받거나 함수를 결과로 반환하는 함수입니다.
다시 말해, 고차 함수는 인자로 받은 함수를 필요한 시점에 호출하거나 클로저를 생성하여 반환합니다.
자바스크립트의 함수는 일급 객체이므로 값처럼 인자로 전달할 수 있으며 반환할 수도 있습니다.
고차 함수는 외부 상태 변경이나 가변(mutable) 데이터를 피하고 불변성(Imuutability)을 지향하는 함수형 프로그래밍에 기반을 두고 있습니다. 함수형 프로그래밍은 순수 함수와 보조 함수의 조합을 통해 로직 내에 존재하는 조건문과 반복문을 제거하여 복잡성을 해결하고 변수의 사용을 억제하여 상태 변경을 피하려는 프로그래밍 패러다임입니다. 조건문이나 반복문은 로직의 흐름을 이해하기 어렵게 하여 가독성을 해치고, 변수의 값은 누군가에 의해 언제든지 변경될 수 있어 오류 발생의 근본적 원인이 될 수 있기 때문입니다.
함수형 프로그래밍은 결국 순수 함수를 통해 부수 효과(Side effect)를 최대한 억제하여 오류를 피하고 프로그램의 안정성을 높이려는 노력의 한 방법이라고 할 수 있습니다.
JavaScript의 함수는 1급 함수? 1급 객체?
자바스크립트에서는 객체를 1급 시민으로 취급합니다. 그리고 사실 자바스크립트의 함수도 객체로써 관리되므로 1급 객체라고 볼 수 있스빈다. 동시에, 자바스크립트의 함수는 1급 함수의 추가 조건도 만족합니다.
이렇게 1급 객체인 동시에 1급 함수이지만, 보통 1급 객체로 기술하는 편인듯 합니다. 아마 함수가 객체이기 때문이지 않을까 싶습니다.
JavaScript에서 함수가 1급 객체인 것이 중요한 이유
함수가 1급 객체라는 사실은 겉으로 봤을 때는 그리 특별하지 않을 수 있습니다. 함수를 그냥 주고받을 수 있다는 것 뿐이지만, 이것이 아주 큰 차이점을 만듭니다.
가장 중요한 장점은, 바로 고차함수가 가능하다는 점입니다. 자바스크립트의 내장 고차 함수들은 정말 편리합니다. 인자로 목적에 맞는 함수를 하나 넘겨주면 아주 쉽게 처리가 됩니다. ES6에서 람다가 지원이 되면서 훨씬 간편해졌습니다.
콜백함수란?
인자로 받아지는(들어가는, 불러진) 함수
콜백함수라고 불리는 이유 => 부르면 와서
엔지니어님께서 든 예시가.. 편의점이 있다면
편의점 사장님이 고차함수이고 알바생이 콜백함수이다.. 라고 하셨습니다.
추상화(abstraction)란?
추상화란 복잡한 어떤 것을 압축해서 핵심만 추출한 상태로 만드는 것입니다.
일상생활에서 추상화가 아닌 것을 찾아보기 힘듭니다.
자바스크립트를 포함한 많은 프로그래밍 언어 또한 추상화의 결과입니다.
https://mari-mo.tistory.com/86
추상화의 관점에서 고차 함수가 갖는 이점
CPU는 0과 1만 이해합니다. 코드가 해석되는 복잡한 것들은 브라우저의 자바스크립트 엔진이 대신 해줍니다.
개발자가 해야하는 것은 사용하는 언어의 문법(syntax)을 올바르게 사용하여 다양한 프로그램을 비교적 쉽게 작성하는 것입니다.
이처럼 고민거리가 줄고, 문제 해결이 더 쉬워지는 것이 추상화의 이점입니다.
- 추상화 = 생산성(productivity)의 향상
프로그램 작성 시 반복되는 로직을 별도의 함수로 작성하여 사용하는 것 역시 추상화의 좋은 사례입니다.
추상화의 관점에서 함수를 바라보면, 함수는 사고(thought) 또는 논리(logic)의 묶음입니다.
함수를 통해 얻은 추상화를 한 단계 높인 것이 고차함수 입니다.
- 함수 = 값을 전달받아 값을 리턴합니다 = 값에 대한 복잡한 로직은 감춰져있습니다 = 값 수준에서의 추상화
고차함수는 이 추상화의 수준을 사고의 추상화 수준으로 끌어올립니다.
- 값 수준의 추상화 : 단순히 값(value)을 전달받아 처리하는 수준
- 사고의 추상화 : 함수(사고의 묶음)을 전달받아 처리하는 수준
다시 말하자면, 고차 함수를 통해 보다 높은 수준(higher order)에서 생각할 수 있습니다.
- 고차함수 = 함수를 전달받거나 함수를 리턴합니다 = 사고(함수)에 대한 복잡한 로직은 감춰있다 = 사고 수준에서의 추상화
추상화의 수준이 높아진 만큼 생산성도 높아집니다.
참고:
https://hanamon.kr/codestates-til-%ED%95%AD%ED%95%B4%EC%9D%BC%EC%A7%80-18%EC%9D%BC%EC%B0%A8/
https://bestalign.github.io/dev/first-class-object/
https://poiemaweb.com/js-array-higher-order-function
'자바스크립트 > 기초' 카테고리의 다른 글
나머지 매개변수, 전개 구문(Rest parameters, Spread syntax) (0) | 2021.07.17 |
---|---|
구조 분해 할당 (Destructuring assignment) (2) | 2021.07.09 |
TDZ (Temporal Dead Zone) (1) | 2021.06.28 |
객체 메소드(Object methods) (1) | 2021.06.27 |
slice, substring, substr 차이 (0) | 2021.06.25 |