조건문
if
if문은 조건이 참인지 거짓인지를 판단하고 분기를 수행한다. 이때 if문에 지정하는 조건은 참과 거짓을 판단할 수 있는 boolean 타입이여야한다.
1 | let text: string = ""; |
statusActive 변수는 숫자타입인데 숫자가 0이면 false 이고, 0이 아닌 나머지는 true이다.
text 변수는 문자열 타입인데, 빈 값일 때 false이고, 값이 있으면 true이다. 첫번째 if문은 둘다 false 이므로 if문이 실행되지 못한다.
switch
switch 문은 비교 대상이 많을 때 단순한 형태로 비교를 수행하기 위해 사용한다.
break 문을 통해 switch문을 벗어날 수 있어야 하고 , case 절에 부합하지 않는 예외조건을 처리 하기 위해 default 절을 추가할 수도 있다.
switch의 표현식에는 변수가 올 수 있고, 표현식의 값과 일치하는 case 절이 실행된다.
1 | let command: number = 0; |
위 예제에서 switch문의 조건은 number 타입이므로 case 절의 값은 모두 number 타입이여야한다.
case 절의 값 타입이 정해져 있지 않은 경우에는 다음과 같다.
1 | let command2: any = "hi"; |
fall-through
switch에서 break문을 생략하면 다음 case 절이 실행되는 폴스루(fall-through)가 일어날수 있다.
case문 내의 break 문이 없어 case 문이 종료되지 않고 다음 case 문이 이어져 실행되는 현상을 말한다.
1 | let input = 2; |
case 0 절에 break문이 누락되어 폴스루가 발생해 case 1절이 자동으로 실행됨
타입스크립트의 폴스루 사용 여부를 설정하고 싶으면 tsc 컴파일러 옵션인 nofallthroughcasesinswitch를 수정하면 된다.
1 | // |
반복문
타입스크립트는 ECMA 자바스크립트를 따르므로 자바스크립트의 반복문을 지원한다.
ECMA 스크립트 표준이 발전하는 과정에 맞춰 새로운 for문이 타입스크립트에 추가되었다.
기본 for문
for문에서 사용할 변수에 let키워드와 타입을 지정할 수 있다.
1 | // ES5 |
ES5 : var선언자는 블록 레벨 스코프가 적용되지 않아 for문에서 초기화한 변수를 for밖에서도 사용 가능했다.
타입스크립트 : j변수에 number 타입을 지정해 타입 안전성을 강화했고, let선언자를 사용해 for문 내부에서만 사용되도록 블록 레벨 스코프가 적용되었다.
for in문 (ES5)
for…in문은 ES5의 자바스크립에서 배열이나 객체를 순회할 떄 사용한다.
1 | let islands = ["a", "b", "c", "d"]; |
for…in문에 선언된 변수 index는 인덱스를 나타내며, 배열의 요소를 가져오려면 islands[index]와 같이 인덱스를 통해 값을 접근 할 수 있다.
만약, 인덱스가 숫자가 아닌 키라고 한다면 객체 리터럴을 이용하면 된다.
1 | let fruits = { a: "apple", b: "banana", c: "cherry" }; |
fruits 변수를 객체 리터럴로 초기화했고, for…in문을 이용해 객체 리터럴을 순화했다. 이때 property변수를 통해 키 값으로 접근 했으며, fruits[property]로 문자열 키를 이용해 대응되는 객체의 값을 가져왔다.
for of문 (ES6)
for…of문은 ES6 표준에 추가된 특징이며 인덱스를 이용해 값을 가져오는 for…in과 달리 for…of문은 바로 값을 가져올 수 있다.
[형식]
for(변수 of 이터러블){
명령문;
}
이터러블(iterable)객체는 반복 가능한 객체인 배열, 문자, 숫자, DOM 컬렉션, 맵(Map), 셋(Set) 등을 말한다.
- 이터러블 객체가 문자열인 경우
1 | for (let value of "hi") { |
- 이터러블 객체가 배열인 경우
1 | for (const value of [1, 2, 3]) { |
일반 for문에서 let 선언자가 아닌 const를 사용하면 상수가 되어 증가 값이 바뀌지 않아 무한 루프가 되지만,
for of는 Symbol.iterator 의 구현을 통해 각 이터레이션 값의 요소를 가져오기 때문에 const를 사용할 수 있다.
Map 과 Set
ES6에 추가된 이터러블 객체로 맵(Map)과 셋(Set)이 있다. 맵과 셋은 tsconfig.json 의 target 속성이 es5이면 컴파일 되지 않는다.
es5에 맵과 셋을 대응할 만한 문법이 존재하지 않기 때문이다.
따라서, 맵과 셋을 이용하는for of 문을 실행하려면 tsconfig의 target 을 ES2015로 수정해아한다.
1 | { |
- Map
1 | let itMap = new Map([ |
- 맵 객체는 키 중복을 허용하지 않으므로 for…of문을 이용해 출력해보면 중복을 제하고 출력된다.
- 맵 객체는 키-값 기반이므로 키를 이용해 값을 가져올 수 있다.
맵 겍체를 이용하지 않고 객체 리터럴을 이용해 맵의 특징인 중복 제거와 키를 통한 값 접근을 구현 할 수도 있다.
1 | let map: { [key: string]: number } = {}; |
- Set
셋 객체(Set Object)는 어떤 타입의 값이든 유일한 값을 저장 할 수 있다. 셋 역시 맵처럼 컴파일러 target 속성이 ES2015일때 허용된다.
1 | let itSet = new Set(["a", "b", "c", "a"]); |
Set 객체는 값을 추가하거나(add), 비우거나(cleear), 삭제하는것(delete)과 같이 키가 아닌 값을 다루는 메서드를 제공한다.
[Symbol.iterator()]메서드를 이용한 이터러블 객체 사용
[Symbol.iterator()]은 ES6에 추가된 특징으로 배열, 맵, 셋과 같은 이터러블 객체를 순회하는데 사용한다.
이 메서드는 반복문을 순회할 때 마다 next() 메서드를 통해 순회 중인 객체를 반환하는 특성이 있다.
1 | let arr = [1, 2]; |
while과 do-while
while
while문의 조건이 참이면 명령문을 실행하며 조건이 거짓이면 명령문의 실행을 끝내는 반복문이다.
do while문
do-while문은 명령문을 실행하고 나서 조건이 참이면 명령문을 실행하고 거짓이면 명령문 실행을 끝내는 반복문이다.
while과 달리 명령문을 먼저 실행하고 조건을 검사하기 때문에 최소 한 번 이상 명령문 실행이 보장된다.
1 | let cnt: number = 0; |