showmiso 2019. 10. 15. 14:38

06. 함수

태초에 javascript에 기명함수와 익명함수가 있었다.
기명함수의 경우 var와 마찬가지로 hoisting 문제가 발생했다.

ex)
myFunction(1, 2);
function myFunction(a, b) {}
// 함수 선언부 전에 함수 호출이 가능해져 코드가 복잡해지는 문제

이를 해결하기 위한 방법은 변수에 익명함수를 할당하는 것이다.

ex)
let resultMultiple = function(a, b) { return a * b; }
// 익명함수는 함수 선언 전에는 호출이 불가하다. 

TypeScript는 함수의 매개변수와 반환타입에 모두 타입을 명시하여
함수내부에 타입 검증을 하는 불필요한 코드를 삭제하거나, 의도치 않은 캐스팅에 대비하도록 한다. 

function max(x: number, y: number): number {...}

6.2 매개변수의 활용
1. 기본 초기화 매개변수 (default-initialized parameter)

function pow(x: number, y: number = 2): number {...}

2. 나머지 매개변수

// 매개변수를 최소 2개이상 받는 경우
function concat(a, b, ...restParameter) {
   return a + b + restParameter.join("");
}

// 매개변수를 0개 이상 받는 경우
function concat(...restParameter) {
   return restParameter.join("");
}

3. 선택 매개변수

function sum(a: number, b?: number): number {
   return a + b;
}
console.log(sum(1));

함수에 선언된 매개변수는 2개지만, 2번째 매개변수에 선택 매개변수를 사용함으로써
인수 하나를 생략하더라도 에러가 발생하지 않는다. 

다만, 선택 매개변수는 초기값 설정 매개변수와 동시에 사용할 수 없다.

function sum(a: number, b?: number = 2): number {...}

// 선택 매개변수의 경우 b에 대한 undefined 검사를 통해 초기값을 설정해야 한다. 
function sum2(a: number, b?: number) {
    if (b === undefined) {
        b = 0;
    }
    return a + b;
}
console.log(sum2(1));


6.4. 함수 오버로드 
function overloads : 함수명은 같지만, 매개변수와 반환 타입이 다른 함수 여러 개를 선언할 수 있는 것을 말한다.

function add(a: string, b: string): string;
function add(a: number, b: number): number;
function add(a: any, b: any): any {
    return a + b;
}

가장 일반적인 함수를 가장 아래에 선언하고 그 위로 구체적인 타입을 명시한 함수의 시그니처를 쌓는 방식으로 선언한다. 

function add(a: number): number;
function add(a: number, c: number): number;
function add(a: any, b?: any): any {
    if (b === undefined) {
        return a;
    } else {
        return a + b;
    }
}

매개변수가 다른 오버로드를 지정할 때는 선택 매개변수를 둬 매개변수의 개수에 변화를 줄 수 있습니다. 

pick 함수는 다양한 타입의 인수를 받고 반환 타입도 여러개 입니다.
오버로드에서 타입을 나열할 때 일반적인 타입을 가장 먼저 선언하고, 
그 위로 세부적인 타입(number, object)를 선언했습니다.

function pick(x: { name: string }) : number;
function pick(x: { month: number }) : string;
function pick(x: number): number;
function pick(x: any): any {...}

object 타입은 속성명과 속성명의 타입에 따라 여러 형태가 올 수 있는데
예제에서는 { month: number }, { name: string } 과 같은 형태의 object 타입을 선언했습니다. 
예제에서 pick 함수의 매개변수와 반환타입이 다양한데, 유니언 타입으로도 표현할 수 있습니다. 

function pick(x: number | { month: number } | { name: string }) : string | number;
function pick(x: any): any {...}


6.3 익명함수

let x1 = () => { };

let y1 = x => { return x; };
let y2 = x => { return x; };
let y3 = x => x

매개변수가 1개일 때는 소괄호를 생략할 수 있습니다.

즉시 호출 함수

(x => { x; })(3);

let iif = (x => { return x; })(3);

- 화살표 함수를 filter과 reduce에 적용
- this도 사용할 수 있다.