개요
목이 마른 와타시는 자판기에서 음료수를 뽑아먹으려고 1000원을 넣었다. 그런데 마시려는 음료수는 1300원이다. 아 비싸구나~ 싶으면서도... 살 수 없다는 것을 알면서도... 상도덕을 무시하고 음료수가 나오는 버튼을 눌러버렸는데 그 음료수가 그냥 나와버린다면? 그래서 내가 즐겨버린다면? 우주의 균형이 무너지거나 세상은 멸망하지는 않겠지만 자판기 제작자는 상사에게 겁나게 쿠사리를 먹을 것이다.
그런 슬픈 일을 방지하기 위해 조건문이라는 것이 생겼다.
If
가장 대표적인 조건문으로, 상황이 맞으면 실행하고, 안맞으면 실행하지 않게 하거나 별도의 구문을 실행한다. goto나 while, switch같은 커맨드를 제어문이라고도 하는데, 이 if도 제어문의 일종이다. 이 제어문이라는 개념을 처음으로 고안해낸 과학자 에이다 러브레이스는 도박으로 망했다는 재미없는 후문이 있다.
아무튼 조건문은 if, else, else if로 나뉘는데, 이것들은 괄호 안의 조건에 맞으면 블록 안의 내용을 실행하고, 아니면 걍 무시하고 블록 끝으로 이동한다.
if ( /* 논리값 */ true )
{
console.log("여긴 조건에 맞았을 때 오는 곳이야.");
}
else if ( false )
{
console.log("여긴 위의 조건에 맞진 않는데 다른 조건은 맞을 때 오는 곳이야.");
}
else
{
console.log("여긴 두 개의 if 조건에 해당되지 않았을 때 오는 곳이야.");
}
보통 논리값을 바로 뚜드려 넣는 경우는 거의 없고, 변수나 관계 연산식, 함수 등을 넣게 된다. if ( a== b ) 라던가, else if ( !func() ) 같이...
Switch
if문으로 흐름을 제어하는 법은 알겠는데, 생각보다 if문을 많이 걸어야 할 때가 생겨 곤란할 때가 있다. 그럴 때 switch문은 해결책이 될 수 있다.
switch문은 조건문을 걸 수는 없고, 조건으로 내건 변수가 어느 값과 일치하는 경우만 다룬다. 처음 볼 땐 어렵지만 익숙해지면 다루기 쉽다. 아래와 같이 쓰면 댐!
switch( 변수 )
{
case 1:
// 변수가 1이라면 이쪽 구문을 실행
break;
case 2:
// 변수가 2이라면 이쪽 구문을 실행
case 3:
case 4:
// 변수가 4이라면 이쪽 구문을 실행
break;
case 6:
// return으로도 멈출 수 있다. 근데 이러면 함수까지 그냥 끝나버린다.
return 0;
default:
// 변수가 위의 조건에 해당되지 않는다면 이쪽 구문을 실행
break;
}
break 커맨드가 있으면 조건에 맞는 case의 구문을 실행한 뒤, switch 블록을 빠져나온다. 변수가 1일 경우에는 case 1:에 해당되는 구문만 실행하고 빠져나온다는 뜻이다. 아무 조건에도 맞지 않는 경우 default 구문을 실행한다. 이 default 구문은 아예 없어도 상관없다.
하지만 해당 구문에 break 커맨드가 없으면? 프로그램은 switch문을 빠져나오지 않고 아래 case의 구문을 계속해서 실행한다. 변수가 2거나 3인 경우일 때 case 2, case 3의 구문을 실행했는데, 부레끼가 없어 멈추지를 못하니 밑의 case 4의 구문까지 그냥 실행해버린다는 뜻이다.
왜 이따구로 만들었나요? 물어보면 그냥 그렇게 만들었다고밖에... 할 말이 없음... 이 break 라는 커맨드는 switch문 뿐만이 아니라 다른 제어문에서도 '작동, 멈춰!' 하는 의미로 쓰인다.
반복문
반복문은 똑같은 구문을 여러 번 실행시켜주는 마법의 커맨드다.
선생님이 코딩 과제를 주신다. a = a * a 이라는 제곱 계산식과 b라는 수가 주어졌을때, 계산식을 b번 만큼 한 값을 반환하라는 과제다. 즉 변수에 맞춰 거듭제곱을 1번에서 최대 999번까지 하는 미친 코드를 쓰라는 것이다. 반복문을 배우지 못한 불쌍한 학생이라면
if (1번 할 때)
{ a = a * a }
else if (2번 할 때)
{ a = a * a * a }
else if (3번 할 때)
{ a = a * a * a * a }
else if (4번 할 때)
{ a = a * a * a * a * a }
else if (5번 할 때)
{ a = a * a * a * a * a * a }
switch(b)
{
case 1:
return a * a;
case 2:
return a * a * a;
case 3:
return a * a * a * a;
case 4:
return a * a * a * a * a;
case 5:
return a * a * a * a * a * a;
...
}
식으로 999번을 써서 답안을 제출할 것이다. 이러면 선생님도 울고 학생도 울고 우리 사회를 이끌어나가는 시민들도 IT업계의 현실은 저런 거구나 싶어 울어버릴 것이 분명하다.
그런 슬픈 일을 방지하기 위해 반복문이라는 것이 생겼다.
while
if문과 비슷하게 작동한다. 조건에 맞으면 블록에 있는 구문을 실행하는데...
문제는 구문이 끝나도 빠져나오지 않고 구문의 처음으로 돌아가 조건에 맞지 않게 될 때까지 계속 실행한다!
let a = 2;
let b = 3;
while ( b > 0 )
{
// 여기부터 다시 시작한다
a = a * a;
// 여기서 조건을 충족하면 구문의 맨 위로 올라간다
// 충족하지 못하면 빠져나온다
}
이런 코드를 짜게 됐다면, a가 3번만 거듭제곱되고 끝날 것 같으나, b의 값이 변하지 않기 때문에 a가 무한으로 제곱된다. 중간에서 b의 값을 바꿔주는 것이 좋다.
while문도 break 커맨드를 사용해서 진행을 멈추고 중간에 나오게 할 수 있다. 그것과 비슷하게 continue 라는 커맨드도 있는데, 이것도 break 처럼 진행을 멈추지만, 나오지는 않고 다시 구문의 처음으로 돌아간다.
let a = 2;
let b = 3;
while ( b > 0 )
{
a = a * a;
if ( a == 1 ) // 만약 a가 1이라면
{
break; // 제곱해도 의미가 없으니 while문에서 빠져나온다
}
b = b - 1; // b를 1씩 감소시킨다
if ( b == 1 ) // 만약 b가 1이라면
{
console.log("마지막 제곱이 간다!");
continue; // 뒤의 내용을 실행하지 않고 바로 처음으로 올라간다
}
console.log("제곱이 끝나기까지 앞으로" + b + " 번");
}
do ... while
약간 어려운 문법.
dowhile문이라고도 한다. while문과 똑같은 기능을 갖지만, 일단 저질러놓고 조건을 따지는 식이다. 즉, 조건에 맞던 맞지 않던 한 번은 반드시 실행된다!
do
{
console("난 무적권 한 번은 실행돼!");
} while ( 조건식 );
for
좀 더 어려운 문법.
while문의 심화형으로, while보다 더 간편하게 반복문을 만들 수 있다. 익숙해지면 while보다 훨씬 쓰기 편해진다. 잘 이해가 되지 않는다면 그냥 while 써도 된다.
for ( 초기화식; 조건식; 반복이 끝났을 때 실행할 연산 )
let a = 0;
while ( a < 10 )
{
a += 1;
console.log("이건 코드 길이가 긴 반복문이고 변수도 따로 만들어야 해서 불편해.");
}
// ---------
for (let i = 0; i < 10; i += 1)
{
console.log("이건 위의 while문과 동일해.");
}
- 초기화 연산
반복문에 진입하기 전 변수를 새로 만들거나, 이미 있던 변수의 값을 조정할 수 있다.
여기서 변수를 새로 만들 경우, 그 변수는 반복문이 끝나면서 사라진다.
보통은 let i = 0; 등으로 반복문만을 위해 필요한 변수를 만든다. - 조건문
if나 while의 조건과 똑같다. 이게 틀리다고 나오면 for문도 작동을 멈춘다. - 처음으로 돌아갈 때 실행할 연산
구문이 끝났거나 continue 커맨드 쓰거나 해서 처음으로 돌아갈 때, 여기 있는 연산을 실행한다.
보통은 i = i + 1 ( i++ 와 같다 ) 등으로 반복문만을 위해 필요한 변수를 조정한다.
for in
어려운 문법.
for 문의 심화형으로, 배열이나 객체를 차례대로 읽는다.
배열을 읽을 경우 요소가 되는 변수를 그냥 읽지만, [이름: 값]으로 분류된 객체 변수의 경우에는 이름에 해당되는 부분만 읽는다.
for( let 변수 in 배열이나 객체 )
let obj = { name:"abc", weight:99, height:190 };
let arr = [ "a", "b", 3.14 ]
// for 문으로 객체 읽기
let obj_keys = Object.keys(obj); // 오브젝트 내 속성들의 이름 부분만 배열로 반환하는 함수
for (let i = 0; i < obj_keys.length; i++)
{
let propertyName = arr[i];
console.log(propertyName + "은(는) " + element + "(이)라는 값을 가졌네요!");
}
// for 문으로 배열 읽기
for (let i = 0; i < arr.length; i++)
{
let element = arr[i];
console.log(element + "(이)라는 값이 있네요!");
}
// ---------
// for in 문으로 객체 읽기
for (let propertyName in obj)
console.log(propertyName + "은(는) " + obj[propertyName] + "(이)라는 값을 가졌네요!");
// for in 문으로 배열 읽기
for (let element in arr)
console.log(element + "(이)라는 값이 있네요!");
for문도 충분히 짧지만, for in 문을 사용하면 더 더 짧게 만들 수 있다. 배열의 좌표값 등을 알기 위한 변수를 선언할 필요도 없어진다(장점이자 단점).
왜 중괄호가 없냐고? 코드를 한 줄만 작성할 거라면 중괄호를 쓰지 않아도 된다.
'프로그래밍 > JavaScript' 카테고리의 다른 글
| WEB - Event (0) | 2022.02.14 |
|---|---|
| WEB - Window와 Document (0) | 2022.02.12 |
| 배열 ( Array ) (0) | 2022.02.11 |
| 문자열 ( String ) (0) | 2022.02.11 |
| 함수 (0) | 2022.02.11 |