본문 바로가기

TS

(Typescript) 함수 표현식과 일등 함수 개념

자바스크립트는 함수형 언어 '스킴'과 프로토타입 기반 객체지향 언어 '셀프'를 모델로 만들었다.

타입스크립트도 또한 자바스크립트의 이러한 특징을 모두 가지고 있다.

 

함수 표현식은 함수형 언어의 핵심 기능이다. 프로그래밍 언어가 일등 함수 기능을 제공하면

'함수형 프로그래밍 언어'라고 한다.

 

일등함수

일등함수란, 함수와 변수를 구분하지 않는다는 의미이다.

 

let f = function(a, b) {return a + b}
f = function(a, b) {return a -b}

심벌 f가 변수인지 함수인지 사실상 구분할 수 없다. 이것이 변수와 함수를 구분하지 않는다 의미이다.

 

표현식

프로그래밍 언어에서 '표현식'이라는 용어는 리터럴, 연산자, 변수, 함수 호출 등이 복합적으로 구성된

코드 형태를 의미한다. 예를 들어 1 + 2는 1과 2라는 리터럴과 덧셈 연산자 + 으로 구성된 표현식이다.

표현식은 컴파일러에 의해 계산법(evaluation)이 적용되어 특정 값이 된다.

 

함수 표현식

위의 코드 심볼 f 에서 변수 f에는 function(a, b) {return a + b}를 값처럼 대입하는데,

이 function(a, b) {return a + b} 부분을 함수 표현식(function expression)이라고 한다.

 

계산법

컴파일러는 표현식을 만나면 계산법을 적용해서 값을 계산한다.

계산법에는 조급한(eager) 계산법과 느긋한(lazy) 계산법 두 가지가 있다.

 

컴파일러가 1 + 2 라는 표현식을 만나면 조급한 계산법을 적용해 3이라는 값을 만든다.

반면에 function(a, b) {return a + b}라는 함수 표현식을 만나면,

심벌 a, b가 어떤 값인지 알 수 없어 느긋한 계산법을 적용해 계산을 보류한다.

 

함수 호출 연산자

어떤 변수가 함수 표현식을 담고 있다면, 변수 이름 뒤에 함수 호출 연산자(function call operator) ()를

붙여서 호출할 수 있다. 함수 호출이란, 함수 표현식의 몸통 부분을 실행한다는 뜻이다.

 

만약, 함수가 매개변수를 요구한다면 함수 호출 연산자() 안에 필요한 매개변수를 명시할 수 있다.

 

익명 함수

함수 표현식은 사실 익명 함수의 다른 표현이다. 

let value = (function(a, b) {return a + b;})(1, 2) //3

TS에서 가끔 위와 같은 형태로 작성된 코드를 만난다. 함수 표현식의 개념 없는 상태에서

단순히 익명 함수를 '이름이 없는 함수'로만 이해하면, 이런 형태의 코드가 어떻게 동작하는지 

그 원리를 쉽게 알 수 없다.

 

앞 코드를 이해하려면 연산자 우선순위를 고려해 코드를 분해해야 한다.

함수 호출 연산자 () 는 연산자의 우선순위가 매우 높기 때문에 

함수 표현식 부분을 소괄호로 묶어서 컴파일러가 정상적으로 함수 표현식의 시작과 끝부분을

알 수 있게 해야 한다.

 

01: let value = 
02: (function(a, b) {return a + b})
03: (1, 2)

컴파일러는 02 행의 익명 함수 부분에 게으른 계산법을 적용해 그 상태로 놔두지만,

곧바로 03행의 함수 호출 연산자를 만나서 02행의 함수 몸통에 조급한 계산법을 적용해

최종적으로 3이라는 값을 만들어 낸다. 그 다음 01행의 value 변수에 이 값을 대입한다.

 

const 키워드와 함수 표현식

함수 표현식을 담는 변수는 let 보다 const 키워드로 선언하는 것이 바람직하다.

let 키워드는 변수값이 변할 수 있으므로 const 키워드로 선언하면

함수 내용이 이후에 절대로 바뀔 수가 없다.