if 문
// if문 (if statement)
// 만약 (조건부분)이 충족되면, {동작부분}을 수행해라
if (조건부분) {
동작부분
}
// if문 (if statement)
// 온도가 0도 이하면, 물이 언다를 출력
let temperature = 0;
if (temperature <= 0) {
console.log('물이 업니다.');
}
// if문 (if statement)
// 온도가 0도 이하면, 물이 언다를 출력
let temperature = 10000;
if (temperature <= 0) {
console.log('물이 업니다.');
} else {
console.log('물이 얼지 않습니다.');
}
// else는 if의 조건부분에 해당하지 않는 경우 실행되는 내용을 의미함.
else if문
// if문 (if statement)
// 온도가 0도 이하면, 물이 언다를 출력
let temperature = 1;
if (temperature <= 0) {
console.log('물이 업니다.');
} else {
if (temperature < 100) {
console.log('물이 얼지도 끓지도 않습니다.');
} else {
console.log('물이 끓습니다.');
}
}
/*
else 안에 if 문을 한번 더 작성하면 된다
---> 중첩을 여러번 반복하면 '가독성'이 떨어짐!
*/
else 안에 if-else문을 반복하여 중첩 사용하면 가독성이 떨어질 수 있음.
else 다음 바로 if문이 오는 경우 'else if'문을 사용하면 됨.
// else if 문 (if statement)
// 온도가 0도 이하면, 물이 언다를 출력
let temperature = 150;
if (temperature <= 0) {
console.log('물이 업니다.');
} else if (temperature < 100) {
console.log('물이 얼지도 끓지도 않습니다.');
} else {
console.log('물이 끓습니다.');
}
// else if 문 (if statement)
let temperature = 150;
if (temperature <= 0) {
console.log('물이 업니다.');
} else if (temperature < 100) {
console.log('물이 얼지도 끓지도 않습니다.');
} else {
if (temperature < 150) {
console.log('물이 끓습니다.');
} else {
console.log('물이 모두 수증기가 되었습니다.');
}
}
/*
0이하 -> 물이 업니다
0초과 100미만 -> 물이 얼지도 끓지도 않습니다
100이상 150미만 -> 물이 끓습니다
150이상 -> 물이 모두 수증기가 되었습니다
*/
// else if 문 (if statement)
let temperature = 150;
// 가독성을 위해 코드를 수정함
// if -> else if -> else if -> else
if (temperature <= 0) {
console.log('물이 업니다.');
} else if (temperature < 100) {
console.log('물이 얼지도 끓지도 않습니다.');
} else if (temperature < 150) {
console.log('물이 끓습니다.');
} else {
console.log('물이 모두 수증기가 되었습니다.');
}
/*
0이하 -> 물이 업니다
0초과 100미만 -> 물이 얼지도 끓지도 않습니다
100이상 150미만 -> 물이 끓습니다
150이상 -> 물이 모두 수증기가 되었습니다
*/
switch문
// switch문 (switch statement)
/**
* 당신은 등산을 하던 중 갑작스레 산불이 발생해 대피 중입니다.
* 그러던 중 산중턱에서 다친 동물 4마리를 만났습니다.
* 이미 체력이 많이 떨어진 당신,
* 이 동물 중 단 한 마리만 구출할 수 있습니다.
* 과연 당신의 선택은?
* 1. 토끼, 2. 고양이, 3. 코알라, 4. 강아지
*/
// 무엇을 선택했는지에 따라 다른 결과를 확인할 수 있음.
// switch문 (switch statement)
switch (비교할_값) {
case 조건값_1:
동작부분; // 비교값과 조건값이 일치할 때 동작함
break; // 조건값에 대한 동작을 마친 후, switch문을 빠져 나와라
case 조건값_2:
동작부분;
break;
default:
// 비교할 값이 "모든 조건값과 일치하지 않을 때" 동작함
// else문과 비슷하고, 필요할 경우 생략 가능함
동작부분;
}
// switch문 (switch statement)
let myChoice = 2;
switch(myChoice) {
case 1:
console.log('토끼를 선택한 당신, ...')
break;
case 2:
console.log('고양이를 선택한 당신, ...')
break;
case 3:
console.log('코알라를 선택한 당신, ...')
break;
case 4:
console.log('강아지를 선택한 당신, ...');
break;
default:
console.log('1에서 4사이의 숫자를 선택해 주세요.')
}
break문을 지우면 어떻게 될까?
ctrl + D : 똑같은 모양으로 작성된 코드를 동시 선택 가능
// switch문 (switch statement)
let myChoice = 2;
switch(myChoice) {
case 1:
console.log('토끼를 선택한 당신, ...')
case 2:
console.log('고양이를 선택한 당신, ...')
case 3:
console.log('코알라를 선택한 당신, ...')
case 4:
console.log('강아지를 선택한 당신, ...');
default:
console.log('1에서 4사이의 숫자를 선택해 주세요.')
}
// break문이 없으면 아래에 있는 모든 동작을 실행하게 된다
break문을 지우면 모든 동작을 실행하게 된다.
switch문 vs if문
// switch문
switch(myChoice) {
case 1:
console.log('토끼를 선택한 당신, ...');
break;
case 2:
console.log('고양이를 선택한 당신, ...');
break;
case 3:
console.log('코알라를 선택한 당신, ...');
break;
case 4:
console.log('강아지를 선택한 당신, ...');
break;
default:
console.log('1에서 4사이의 숫자를 선택해 주세요.');
}
// if문
if (myChoice === 1) {
console.log('토끼를 선택한 당신, ...');
} else if (myChoice === 2) {
console.log('고양이를 선택한 당신, ...');
} else if (myChoice === 3) {
console.log('코알라를 선택한 당신, ...');
} else if (myChoice === 4) {
console.log('강아지를 선택한 당신, ...');
} else {
console.log('1에서 4사이의 숫자를 선택해 주세요.');
}
if문과 switch문 모두 특정한 조건에 따라 다르게 동작하는 코드를 만들 수 있음.
- if문 : 어떤 넓은 범위를 만족하는 조건식을 만들 때 효과적임.
- switch문 : 특정한 값에 일치하는 조건을 만들 때 효과적임.
주의할 점은 switch문은 암묵적 형변환을 허용하지 않아서 등호 3개를 입력해야함.
let myChoice = '2'; // 숫자 2를 문자형으로 입력한 경우
switch(myChoice) {
case 1:
console.log('토끼를 선택한 당신, ...');
break;
case 2:
console.log('고양이를 선택한 당신, ...');
break;
case 3:
console.log('코알라를 선택한 당신, ...');
break;
case 4:
console.log('강아지를 선택한 당신, ...');
break;
default:
console.log('1에서 4사이의 숫자를 선택해 주세요.');
}
if (myChoice === 1) { // switch문은 암묵적 형변환을 하지 않아서 등호 3개를 붙여야 됨.
console.log('토끼를 선택한 당신, ...');
} else if (myChoice === 2) {
console.log('고양이를 선택한 당신, ...');
} else if (myChoice === 3) {
console.log('코알라를 선택한 당신, ...');
} else if (myChoice === 4) {
console.log('강아지를 선택한 당신, ...');
} else {
console.log('1에서 4사이의 숫자를 선택해 주세요.');
}
switch문에서는 default문이 실행되었고, if문에서는 else문이 실행된 것을 알 수 있음.
그럼 if문에서 조건식에 등호 2개만 사용하면 어떻게 될까?
let myChoice = '2'; // 숫자 2를 문자형으로 입력한 경우
switch(myChoice) {
case 1:
console.log('토끼를 선택한 당신, ...');
break;
case 2:
console.log('고양이를 선택한 당신, ...');
break;
case 3:
console.log('코알라를 선택한 당신, ...');
break;
case 4:
console.log('강아지를 선택한 당신, ...');
break;
default:
console.log('1에서 4사이의 숫자를 선택해 주세요.');
}
if (myChoice == 1) { // 등호 2개로 동등비교만 함.
console.log('토끼를 선택한 당신, ...');
} else if (myChoice == 2) {
console.log('고양이를 선택한 당신, ...');
} else if (myChoice == 3) {
console.log('코알라를 선택한 당신, ...');
} else if (myChoice == 4) {
console.log('강아지를 선택한 당신, ...');
} else {
console.log('1에서 4사이의 숫자를 선택해 주세요.');
}
switch문에서는 default문이 실행되었고,
if문에서는 myChoice가 2일때의 조건문(첫번째 else if문)이 실행되었음을 알 수 있음.
즉, if문의 조건을 switch문으로 작성할 경우 엄격한 형변환을 위해 조건식에 등호 3개를 사용해야 한다는 말임.
switch문은 값들을 비교할 때 자료형을 엄격하게 구분하고,
if문으로 대체할 때는 반드시 등호 3개로 일치비교를 해야함.
for문
// 반복문 (loop statement)
// 코드잇 최고! x 10 --> 어떻게 할까요?
// 1. 복붙을 10번 한다
console.log('코드잇 최고!');
console.log('코드잇 최고!');
console.log('코드잇 최고!');
console.log('코드잇 최고!');
console.log('코드잇 최고!');
console.log('코드잇 최고!');
console.log('코드잇 최고!');
console.log('코드잇 최고!');
console.log('코드잇 최고!');
console.log('코드잇 최고!');
// 죽음....! 역시 이런 건 컴퓨터가 해야함.
// for 반복문 (loop statement)
for (초기화부분; 조건부분; 추가동작부분) {
동작부분
}
/*
if문과 차이점
if문 : 동작을 한번만 수행하고 끝남
for문 : 조건부분이 충족되면, 계속해서 동작부분을 반복함.
*/
초기화부분 : 처음 시작할 때 딱 한번만 실행되는 부분
조건부분 : if문과 동일하게 boolean형태로 판단 후 true가 나오면 '동작부분'의 내용을 실행함.
추가동작부분 : 동작부분 실행 후 추가동작부분을 실행함.
// for 반복문 (loop statement)
// '코드잇 최고!'라는 문장을 10번 출력하는 for문
for (let i = 1; i <= 10; i++) {
console.log('코드잇 최고!');
}
반복문을 만들 때 가장 먼저 생각해야할 것?
→ 얼마나 반복해야하는가?
초기화부분 :
반복의 횟수를 저장하는 역할이 변수 i인 것임.
for문에서 i는 주로 반복횟수를 저장하는 변수로 사용함.
조건부분 :
10번 반복이니까 i <= 10
추가동작부분 :
변수의 값을 하나씩 증가시키는 코드를 추가동작 부분에 작성함.
// for 반복문 (loop statement)
// '코드잇 최고!'라는 문장을 10번 출력하는 for문
for (let i = 1; i <= 10; i++) {
console.log(`${i}코드잇 최고!`);
}
// 반복하는 횟수에 맞는 숫자를 표시하기 위해 ${i} 작성
가장 먼저 초기화 부분이 실행됨. 변수 i가 선언됨.
→ 조건부분이 평가됨.
처음에는 i가 1이니까 true가 되어 동작부분이 실행됨. (i = 1)
→ '1 코드잇 최고'가 출력됨.
→ i가 하나 증가함. i가 2가 됨.
→ 초기화부분은 건너뛰고, 조건부분으로 넘어감.
조건부분이 false가 될 때까지 계속 반복.
→ 조건부분이 평가됨.
i = 2
'2 코드잇 최고'가 출력됨.
.
.
.
i = 11이 되는 지점에서 false가 되어 반복이 종료됨.
• 추가동작부분을 꼭 채울 필요는 없음.
// 추가동작부분이 없음
for (let i = 1; i <= 10;) {
console.log(`${i} 코드잇 최고!`);
i++; // 동작부분에서 i를 증가시킴
}
추가동작부분을 생략하고, 동작부분에 반복횟수를 증가시켜도 제대로 작동됨.
그렇지만 동작부분에서는 실제로 반복하고자하는 내용들만 집중하고, 어떤 조건과 관련된 부분은 이 소괄호에 집중하면서 좀 더 목적에 맞는 코드를 작성할 수 있음.
• 초기화부분에서 사용하는 변수는 for문의 로컬변수임.
for (let i = 1; i <= 10; i++) {
console.log(`${i} 코드잇 최고!`);
}
console.log(i); // Error !!
// i는 for문의 로컬변수임을 알 수 있음
초기화변수를 for반복문 바깥에서 출력하려고 하면 에러가 남.
• 초기화 부분도 채울 필요가 없으나 반드시 세미콜론(;)을 쓰자.
// for 안에 초기화변수를 선언하는 대신 for 바깥에 미리 변수를 선언함.
let i = 1;
for (; i <= 10; i++) {
console.log(`${i} 코드잇 최고!`);
}
// for반복문에서 세미콜론은 구분하는 용도
// → 무조건 2개가 있어야 함
for문 소괄호 안에 반드시 세미콜론 2개를 사용해야함.
• 1부터 100까지 짝수만 출력하기
/*
i를 1부터 100까지 반복
2로 나눴을 때 나머지 0일 때만 i를 출력
*/
for ( let i = 1; i <= 100; i++ ){
if (i % 2 === 0) {
console.log(i);
}
}
/*
i를 1부터 50까지 반복하면서
i에 2를 곱한다
*/
for (let i = 1; i <= 50; i++ ) {
console.log(i * 2);
}
/*
i를 2부터 100까지 반복하면서
i를 2씩 증가시킨다
*/
for (let i = 2; i <= 100; i += 2 ) {
console.log(i);
}
• 주어진 높이(height)에 맞게 '*'로 삼각형을 그려주는 함수 printTriangle을 완성하기
function printTriangle(height) {
// i를 높이만큼 반복하여
// 반복할 때마다 i만큼의 별이 나오게 함
for (i = 1; i <= height; i++) {
console.log('*'.repeat(i));
}
}
function printTriangle(height) {
// message = 한 줄에 출력되는 별
// i는 반복횟수
let message = '';
for (let i = 0; i < height; i++) {
message += '*';
console.log(message);
}
}
/*
height = 3이라고 하면
i = 0 일때 *
i = 1 일때 **
i = 2 일때 ***
*/
// 테스트 코드
console.log('높이: 1');
printTriangle(1);
console.log('높이: 3');
printTriangle(3);
console.log('높이: 5');
printTriangle(5);
while문
// while문 (while statement)
while (조건부분) {
동작부분
}
// while문 (while statement)
// 특별한 경우가 아니라면 while문과 for문은 대체가 가능함.
let i = 1;
while (i <= 10) {
console.log(`${i} 코드잇 최고!`);
i++;
}
// 반복에 필요한 횟수 -> 글로벌변수 생성
// 반복할 동작 -> while문 안에서 동작부분 작성
for (let i = 1; i <= 10; i++) {
console.log(`${i} 코드잇 최고!`)
}
// 가독성 측면에서는 for문이 좋다
// while문 (while statement)
let i = 30;
while ( i % 7 !== 0) {
i++;
}
console.log(i);
/*
30이상의 수에서 7로 나눴을 때
나머지가 0이 아니면(true) 1을 증가시키는 것을 반복하다가
나머지가 0이 된다면(false) 반복을 멈춤
*/
반복문 밖의 글로벌변수를 가지고 조건을 평가함.
반복문 안에서도 이 변수를 다루고 있음.
반복문이 다 실행된 다음에 반복문 밖에서 이 값을 사용하고 있음.
이 코드를 for문으로도 만들 수 있으나, for문은 보통 조건비교에 사용되는 값을 반복문 내부에서만 사용하고, 반복문 외부에서는 사용불가능함.
반복문 밖에서도 변수를 사용해야할 경우에는 while문을 사용하는 것이 좋음.
for문보다 사용빈도가 낮지만, 상황에 따라 while문을 활용해야할 수도 있음.
• while 반복문을 사용하여 1 이상 100 이하의 홀수를 모두 출력하기
// i를 1부터 100까지 반복하면서 i를 출력하기
let i = 1;
while (i <= 100) {
console.log(i); // 출력
i++; // i가 1씩 증가
}
// i를 2로 나눴을 때 나머지가 0일 때 i를 출력
let i = 1;
while (i <= 100) {
if (i % 2 === 1) {
console.log(i);
}
i++;
}
// i를 1부터 50까지 반복하면서 i * 2 - 1을 출력하는 방법
let i = 1;
while (i <= 50) {
console.log(i * 2 - 1);
i++;
}
// i를 1부터 100까지 반복하면서 i를 2씩 증가시키는 방법
let i = 1;
while (i <= 100) {
console.log(i);
i += 2;
}
• while문을 활용해서 정수 180의 약수를 모두 출력하고, 총 몇 개의 약수가 있는지 출력하기
const N = 180;
let i = 1;
let count = 0;
while ( i <= 180 ) {
if ( N % i == 0 ) {
console.log(i)
count++;
}
i++;
// * 주의 : while문 안에서 증가해야함. 안 그러면 무한루프
}
console.log(`180의 약수는 총 ${count}개입니다.`)
/*
1. 180이하 자연수 (약수를 찾아야 하는 수) = 변수 i를 선언
2. i가 1부터 180까지 반복해야함 -> while의 조건문
3. 180의 약수를 찾아야 하므로
-> N(180)을 i로 나눴을 때 나머지가 0이 되는지 조건이 필요함
-> if문 작성
4. 나누어 떨어지는 수 i를 출력
-> i는 while문 안에서 1개씩 증가
5. 반복횟수는 count 변수를 선언하기
-> i가 증가할 때마다 count가 하나씩 증가하도록 하면 됨.
(count는 while문 밖에서 출력 가능함)
*/
break와 continue
break : 반복문 전체를 빠져 나옴.
contiunue : 해당 코드를 한번 건너뛰고 다음 단계로 넘어감.
// break와 continue
let i = 1;
// while문으로 1부터 10까지 반복
while (i <= 10) {
console.log(i);
i++;
}
// break와 continue
let i = 1;
// while문으로 1부터 10까지 반복
while (i <= 10) {
console.log(i);
i++;
break; // 1만 출력됨
}
// i = 1에서 시작하고 1번 반복 후 break로 빠져나감
// break와 continue
// i가 1부터 7일때까지만 반복함
// while문으로 작성
let i = 1;
while (i <= 10) {
console.log(i);
if (i === 7) {
break;
}
i++;
}
// for문으로 작성
for (let i = 1; i <= 10; i++ ) {
console.log(i);
if (i === 7) {
break;
}
}
// break와 continue
/*
i가 1부터 10까지일 때 반복함
i가 2로 나누었을 때 나머지 0인 경우
-> 즉 i가 짝수인 경우를 모두 건너뜀
*/
// for문
for (let i = 1; i <= 10; i++) {
if (i % 2 === 0) {
continue;
}
console.log(i);
}
// while문
let i = 1;
while (i <= 10) {
if (i % 2 === 0) {
i++; // 추가동작부분이 없어서 적어 줘야됨.
continue;
}
console.log(i);
i++;
}
구구단 만들기
// 구구단 만들기
// for문
for ( let i = 1; i <= 9; i++) {
for (k = 1; k <= 9; k++) {
KuKu = i * k
console.log(`${i} * ${k} = ${KuKu}`)
}
}
// while문
let i = 1;
while ( i <= 9) {
let j = 1;
while ( j <= 9) {
GuGu = i * j
console.log(`${i} * ${j} = ${GuGu}`);
j++;
}
i++;
}
/* 주의할 점 :
while 안에 j를 선언해야
i가 1일 때 j는 1부터 9까지 반복후
다시 i가 2일 때 j가 1이 되어야 함.
그니까 선언 자체를 while문 안에다 해야 됨.
*/
피보나치 수열
// 피보나치 수열
let A = 1;
let B = 1;
for (let i = 1; i <= 48; i++ ) {
if ( i == 1 ) {
console.log(i);
console.log(i);
}
let C = A + B;
console.log(C);
A = B;
B = C;
}
/*
1, 1, 2, 3, 5, 8 ...
앞에 1이 똑같이 2개 있어서
맨 처음 i=0일때는 그냥 1이 2개 나오도록 함. 귀찮으니까.
i=1인 경우부터 변수 3개를 활용해서 반복문 진행됨.
A
B
C = B + A
이런 흐름으로 감.
*/