일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 | 29 |
30 | 31 |
- SQLD
- 노마드 코더
- 최원영 저자
- 공부를 가장한 일기일지도
- 구름edu
- 알고리즘
- boj
- nomadcoders
- 백준
- 노마드코더
- 엘리스코딩
- 비전공자를 위한
- 프로그래머스
- 자바스크립트
- Do it! 시리즈
- K-Digital Credit
- 톺아보기
- 자격증
- js
- IT 지식
- 티스토리챌린지
- 제로베이스
- CodeStates
- SQL 개발자
- 모던 자바스크립트 deep dive
- 개발자북클럽
- 노개북
- 이해할 수 있는
- 오블완
- javascript
- Today
- Total
개발자를 희망하는 초보의 자기개발 이야기
모던 자바스크립트 Deep Dive 8장 제어문 본문
스터디를 진행하면서 책을 읽고 내용과 떠오르는 생각, 용어들을 정리하고 있습니다.
문제 되는 부분이나 틀린 부분이 있다면 편하게 말씀해 주세요.
8장 제어문
조건에 따라 코드 블록을 실행(조건문)하거나 반복 실행(반복문)할 때 사용한다.
8.1 블록문
블록문은 0개 이상의 문을 중괄호로 묶은 것으로 자바스크립트는 블록문을 하나의 실행 단위로 취급한다. 블록문의 끝에는 세미콜론을 붙이지 않는다.(블록문 자체가 하나의 종결을 의미하기 때문) 블록 내에 일반적인 구문을 넣으면 블록이 종료되면서 undefined를 반환하고 종료되나 key와 value를 넣게 되면 자바스크립트 엔진은 해당 블록은 객체라고 판단하고 해당 객체를 반환하는 기현상이 발생한다..;
{ let num = 10; } // undefined
{ a : 1 } // {a:1}
8.2 조건문
조건문은 주어진 조건시의 평가 결과에 따라 코드 블록(블록문)의 실행을 결정한다. 조건은 불리언 값으로 평가될 수 있는 표현식이다. 자바스크립트는 if ... else 문과 switch 문으로 두 가지 조건문을 제공한다.
8.2.1 if ... else 문
if문의 조건식이 불리언 값이 아닐 경우 불리언 값으로 강제 변환되어 실행할 코드 블록을 결정한다. 대부분의 if ... else 문은 삼항 조건 연산자로 바꿔 쓸 수 있다. 삼항 조건 연산자 표현식은 값처럼 사용할 수 있기 때문에 변수에 할당할 수 있어 유용하다. if ... else 문 자체는 값으로 사용할 수 없기 때문에 변수에 할당할 수 없다.
경우의 수가 3가지인 삼항 조건 연산자
var num = 0;
var kind = num ? ( num > 0 ? '양수' : '음수') : '영';
console.log(kind); // '영'
조건에 따라 단순히 값을 결정하여 변수에 할당하는 경우 삼항 조건 연산자를 사용하는 편이 가독성이 좋다. 하지만 여러 줄의 문이 필요하다면 if ... else 문을 사용하는 편이 가독성이 좋다.
8.2.2 switch 문
상황을 의미하는 표현식을 지정하고 콜론 뒤에 실행될 문을 지정하는 형태다.
break 문이 없다면 case문의 표현식과 일치하지 않더라도 실행 흐름이 다음 case 문으로 연이어 이동하기 때문에 default를 제외한 각 case에는 break 문을 기입하는 것이 일반적이다. default문은 가장 하단에 위치해야 한다. 아래와 같이 조건에 해당하지 않는 경우 가장 마지막 case인 'February'가 반환된다..; 다른 위치에 default문을 위치시킬 거라면 break 문을 같이 둬야 하는데 굳이..
var month = 13;
switch (month) {
default: monthName = 'Invalid month';
case 1: monthName = 'January';
case 2: monthName = 'February';
} // 'February'
break 문을 생략한 폴스루가 유용한 경우도 있는데 if ... else 문으로 해결할 수 있다면 if ... else 문을 사용하는 편이 좋고, 가독성이 더 좋다면 switch 문을 사용하는 편이 좋다.
※ 폴스루(fall-through)란?
: 하나의 case 절에서 break 문을 사용하지 않고 다음 case 절로 코드 흐름이 이어지는 것을 의미한다.
8.3 반복문
조건이 거짓일 때까지 반복해서 코드 블록을 실행하는 것이다. for, while, do ... while문을 기본 제공한다.
8.3.1 for 문
for문의 변수 선언문, 조건식, 증감식은 모두 옵션이므로 반드시 사용할 필요는 없다. 단, 셋 다 선언하지 않고 사용하면 무한루프가 되니 주의해야 한다. for 문 내에 for 문을 중첩해 사용할 수 있는데 이를 중첩 for 문이라 한다.
8.3.2 while 문
for문은 반복 횟수가 명확할 때 주로 사용하고 while 문은 반복 횟수가 불명확할 때 주로 사용한다. 조건식의 평가 결과가 불리언 값이 아니면 불리언 값으로 강제 변환하여 실행한다.
while (true) { ... }
정재남 님이 redux-saga 라이브러리가 위와 같은 무한루프 방식으로 이벤트를 탐지해서 처리한다고 하는데 속도 부하를 어떻게 처리하는지 나중에 공부해야겠다.
※ redux-saga란?
: react/redux의 순수하지 않은 동작(개인적으로는 이상동작이라고 생각한다)을 감지해서 제어할 수 있는 라이브러리다. 예를 들어 사용자가 동일한 api를 여러 번 호출할 경우, 가장 마지막 호출의 response만 받아오도록 제어한다거나 특정 액션이 발생하면 그에 따라 다른 함수나 자바스크립트 코드가 동작하는 식이다.
8.4 break 문
break문은 코드 블록을 탈출하는 역할을 하는데 반복문을 더 이상 진행하지 않아도 될 때 불필요한 반복을 피할 수 있어 유용하다. 일반적으로 레이블 문, 반복문, 또는 switch 문의 코드 블록을 탈출한다. 이 외에 문에서 break 문을 사용하면 SyntaxError(문법 에러)가 발생한다.
8.4 label 문
프로그램의 실행 순서를 제어할 때 사용한다. 예를 들어 이중 for 문의 경우 두 for문의 조건식을 모두 만족해야 종료가 되지만, label 문을 사용하면 특정한 조건일 때 for문 전체를 빠져나온다. 대박..
outer : for (let i = 0; i < 5 ; i++) {
for (let j = 0; j < 2; j++) {
if (i + j === 5) break outer;
console.log(`inner [${i}, ${j}]`);
}
}
그런데 가독성이 나쁘니 쓰지 말라는 게 정재남 님과 이응모 님의 공통의견. ㅎㅎ 사실 아래와 같이 해도 결과는 같다.
for (let i = 0; i < 5 ; i++) {
for (let j = 0; j < 2; j++) {
if (i + j === 5) break;
console.log(`inner [${i}, ${j}]`);
}
}
또는 아래와 같이 레이블문으로 된 코드를 여러 개 만들어 따로따로 제어하는 것도 가능하겠지만 마찬가지로 가독성이 나쁘고 의도치 않은 결과가 나올 수 있다.
inner : for (let a = 0; a < 5 ; a++) {
for (let b = 0; b < 2; b++) {
console.log(`inner [${a}, ${b}]`);
if (a + b === 3) break inner;
}
}
outer : for (let i = 0; i < 5 ; i++) {
for (let j = 0; j < 2; j++) {
console.log(`inner [${i}, ${j}]`);
if (i + j === 5) break outer;
}
}
8.5 continue 문
반복문의 코드 블록 실행을 현 지점에서 중단하고, 반복문의 증감식으로 실행 흐름을 이동시킨다. break 문처럼 반복문을 탈출하지는 않는다. 실행해야 할 코드가 한 줄이라면 if문을 그대로 사용하는 것도 좋지만 그렇지 않는 경우 continue를 사용하면 추가적인 들여 쓰기 및 중괄호를 생략할 수 있어 가독성이 더 좋다.
var string = 'Hello ahahaha'
var search = 'h';
var count = 0;
for(var i = 0; i < string.length; i++){
if (string[i] !== search) continue;
count++;
}
정리
프로그래밍 언어를 판단하는 한 가지 기준으로 제어문을 이야기한다. 그렇기 때문에 HTML이나 CSS가 프로그래밍 언어가 아니라고 강력하게 주장하는 것이다.
제어문까지만 공부해도 기본적인 코딩은 가능하다는 이야기가 있기 때문에 이 부분까지를 가장 기본적인 단계라 볼 수 있지 않을까. 코딩테스트 문제 풀 때도 프로그래머스 level0, 1 정도는 for문으로 대부분 해결 가능했던 것 같다. 물론 실행속도까지 조건에 들어가 버리면 배열 고차함수(forEach, map, filter, reduce 등) 없이 안되기는 하더라만..
6장 정도부터 책 정리하면서는 코드나 이미지를 첨부하지 않고 깔끔하게 작성하리라 다짐했는데 코드 입력 없이 말로만 기록하는 것은 한계가 있는 것 같다. 능력 부족인가 싶기도..; 어쨌든 '결과가 불리언으로 강제변환', '표현식이다'.라는 문구들이 쉽게 간과할 수 있는 부분이지만, 출력 형태를 의미하기 때문에 결과값이 달라진다는 뜻이거나, 표현식이라는 건 다른 곳에 할당할 수 있다는 의미라는 것을 생각하면서 꼼꼼히 봐야 한다.
물론 이론과 실제는 항상 괴리가 있어서 코딩은 별개의 문제다..ㅜㅜ.. 코딩하러 가야겠다..
'도서 > 모던 자바스크립트 Deep Dive' 카테고리의 다른 글
모던 자바스크립트 Deep Dive 10장 객체 리터럴 (0) | 2023.11.14 |
---|---|
모던 자바스크립트 Deep Dive 9장 타입 변환과 단축 평가 (0) | 2023.11.13 |
모던 자바스크립트 Deep Dive 7장 연산자 (2) | 2023.11.09 |
모던 자바스크립트 Deep Dive 6장 데이터 타입 (0) | 2023.11.08 |
모던 자바스크립트 Deep Dive 5장 표현식과 문 (0) | 2023.11.07 |