showmiso 2019. 10. 15. 14:37


03. 변수

1. 변수의 선언과 기본 타입

- var
hoisting이 된다.
block level scope X

- let
block level scope O
변수를 초기화하기전에 접근불가하게 하여 hoisting을 방지한다.

- const
상수. 선언시 초기화는 가능하지만 재할당되지 않는다.
read only, Type anootation을 추가하지 않아도 자동으로 type이 추론된다.
block level scope O
* const에서도 객체 리터럴의 속성값은 변경이 가능하다. (P.81)
Typescript에서 값 재할당하는 것은 허용하지 않으나 속성값 변경은 허용하는 특성이 있다. 


2. 타입검사

정적 타입 검사 (statically type checking)
: Java, C++
동적 타입 검사 (dynamically type checking) 
: 실행시간에 타입검사를 수행. Javascript
점진적 타입 검사 (gradually type checking)
: Typescript, Python

- 점진적 타입검사 
: 컴파일 시간에 타입 검사를 수행하면서 필요에 따라 타입 언어의 생략을 허용한다. 

- 타입계층도
1. 기본타입
2. 객체타입
3. 기타타입

1. 기본타입
: 보편적으로 사용되는 내장타입
: string, number, boolean, symbol, enum, string literal

1) string : ""(double quote 사용 권장), back quote와 ${expressions} 형태로도 사용가능
2) number : 10, 16, 2, 8진수 모두 지원
3) boolean
4) symbol : 고유한 식별자 타입으로 사용됨
5) enum
6) string literal : string의 확장 타입으로 사용자 정의 타입을 정의 한후 문자열만 할당하는 방식이다. 
=> type eventMiso = "park" | "han"; 

2. 객체타입
: 속성을 포함하고 있으며, 호출 시그니처(call signature), 생성자 시그니처(construct signature)등으로 구성됨
: Array, Tuple, Function, Construct, Class, Interface

1) Array : 배열 형태
=> let items: number[] = [1, 2, 3];
2) Tuple : 배열 요소가 n개로 정해질 때 각 요소별로 타입을 지정한 것
=> let x: [string, number] = ["test", 100];
3) Function : call signature를 포함하도록 정의한 타입
4) Construct : 하나의 객체가 여러 생성자의 Signature로 구성될 때 포함할 수 있는 타입으로
constructor type literal을 사용해 정의한다. 
5) Class, Interface : 객체 타입

3. 기타타입
1) Union : 2개 이상의 타입을 하나의 타입으로 정의한 것
=> var x: string | number;
2) Intersaction : 두 타입을 합쳐 하나로 만들 수 있는 타입
3) 특수 타입 : void, null, undefined
- void : 함수의 리턴값이 없을 때 주로 사용된다. 
- null, undefined : 둘 다 다른 모든 타입의 하위타입이다.
undefined는 어떤 빈 값으로도 초기화되지 않는 타입이다.
null 타입에 경우 person 변수에 객체 리터럴을 할당하고 null로 초기화 하면 person 변수는 Object 타입이 된다.
=> var person = { name : "happy" };
person = null;


- symbol Type
: 유일한 식별자로 사용됨. symbol 함수를 이용해 다음과 같은 형태로 선언함.
=> let hello = symbol("hello"); // hello는 symbol의 description

심벌은 호출될때마다 유일한 객체로 만들어진다
또한, 객체리터럴의 속성키로 쓸 수 있다. (P.97)

- enum Type
=> enum WeekDay { Mon, Tue, Wed, Tus };
let day1 = WeekDay.Mon; // 속성으로 접근하는 것은 가능하다.
let day2 = WeekDay["Tue"]; // 인덱스 접근 표현식은 문자열 리터럴을 사용해야 한다.

- any Type
제약이 없는 타입으로 어떤 타입의 값도 받아들일 수 있다.
또한 컴파일 시간에 타입 검사를 생략할 수 있다. (추천하지 않음)
* any 와 object 의 차이 (P.104)
: 둘 다 어떤 값으로도 할당 받을 수 있지만, object는 변수에 할당된 값의 타입이
number인지 string인지 알 수 없기 때문에 number가 가진 내장함수를 사용할 수 없다.

object 타입은 컴파일 과정에서만 유효한 타입이므로 실제 Javascript로 컴파일된 뒤에는 타입이 사라진다. 

- array Type
let fruits: string[] = ["banana", "apple", "mango"];
fruits.push("grape");

let myVar: any[] = [1, "hi", true]; // any 타입으로 지정하면 어떤 요소등 배열로 추가할 수 있다.

let myVar: (number | string | boolean)[] = [1, "hi", true]; // union 타입으로 타입을 제약할 수도 있다. 

- generics Type
let num: Array = [1, 2, 3];

배열 요소로 익명함수를 받으려면 타입에 함수를 넣으면 된다.
let mums: Array<() => string> = [() => "one", () => "two"];

Typescript에서 선언한 배열 타입이든, 제네릭 타입이든 
컴파일 시 타입 검사를 위해서 필요하고 컴파일 후에는 타입이 제거된 배열만 남는다는 것이다. 

- Tuple Type
정해진 개수 n에 대응하는 배열 타입