본문으로 건너뛰기

else if로 여러 갈래

자바스크립트 목차조건레슨 16 / 76

목차

else if는 if와 else 사이에 갈래를 더 놓습니다. 자바스크립트는 위에서부터 조건을 하나씩 보다가 처음 참인 갈래 하나만 실행하고, 그 아래 조건은 보지도 않습니다.

if·else로는 갈래가 둘뿐입니다. 주문 금액이 2만 원 이상이면 2000원, 1만 원 이상이면 1000원을 빼고 그 밖에는 빼지 않는 것처럼 갈래가 셋 이상이면 else if를 씁니다. 갈래가 여럿이면 조건을 놓는 차례에 따라 결과가 달라집니다.

9단계 중 1단계. 1번 줄: total을 25000에 붙입니다.

1위에서부터 보다가 처음 참인 갈래로

else if는 앞 덩어리를 닫는 중괄호 뒤에 } else if (조건) { 꼴로 잇고, 몇 개든 둘 수 있습니다. else는 맨 끝에 하나만 두거나 두지 않습니다.

실행은 if 줄부터 조건을 하나씩 계산합니다. false면 그 덩어리를 건너뛰고 다음 else if 줄로 갑니다. 처음 true가 나온 갈래의 덩어리를 실행하면, 남은 갈래는 조건도 계산하지 않고 모두 건너뜁니다. 모든 조건이 false면 else 덩어리를 실행합니다(규칙 4).

const total = 15000;
if (total >= 20000) {
  console.log('2000원 할인');
} else if (total >= 10000) {
  console.log('1000원 할인');
} else {
  console.log('할인 없음');
}
실행 결과
1000원 할인

total이 달라지면 실행되는 갈래가 이렇게 바뀝니다.

total2번 줄4번 줄실행되는 줄
25000true보지 않음3번 — 2000원 할인
15000falsetrue5번 — 1000원 할인
9000falsefalse7번(else) — 할인 없음

갈래가 몇 개든 실행되는 덩어리는 많아야 하나입니다. else가 없으면 모든 조건이 거짓일 때 아무 덩어리도 실행되지 않습니다.

2조건의 차례가 결과를 바꾼다

70세에게 아래 코드는 무엇을 찍을까요? 답을 정한 뒤 펼쳐 보세요.

const age = 70;
if (age >= 20) {
  console.log('성인');
} else if (age >= 65) {
  console.log('경로');
}
실행 결과 보기
실행 결과
성인

예상과 다르면 그곳이 배울 곳입니다. 자바스크립트는 더 잘 맞는 갈래를 찾지 않습니다. 위에서부터 보다가 처음 true가 된 2번 줄의 갈래 하나만 실행하고, 4번 줄은 계산하지도 않습니다(규칙 4).

'20세 이상'이라는 넓은 조건은 '65세 이상'이라는 좁은 조건을 감쌉니다. 65세 이상은 모두 20세 이상이기도 하기 때문입니다. 그래서 넓은 조건을 위에 두면 그 아래 좁은 조건의 갈래는 어떤 값에서도 실행되지 않습니다. 조건이 서로 감싸면 좁은 조건부터 위에 놓습니다.

3오류: elseif라고 붙여 쓰면

else if는 else 뒤에 if 문을 하나 더 이은 것이라 두 낱말 사이를 띄웁니다. elseif나 elif처럼 줄여 쓰면 문법 오류가 납니다.

const total = 25000;
if (total >= 20000) {
  console.log(total);
} elseif (total >= 10000) {
  console.log(total);
}
실행 결과
main.js:4} elseif (total >= 10000) {                          ^ SyntaxError: Unexpected token '{'

Unexpected token '{'는 '여기서 {는 뜻밖이다', 곧 이 자리에 여는 중괄호가 올 수 없다는 뜻입니다. ^는 elseif가 아니라 줄 끝의 {를 가리킵니다. 자바스크립트가 elseif (…)까지는 처음 보는 이름 elseif를 부르는 식으로 읽고, 그 뒤의 {에서 문제를 발견했기 때문입니다. ^는 고칠 곳이 아니라 문제를 발견한 자리입니다.

예제

갈래를 고르는 코드 '고르기'는 조건 세우기 → 갈래마다 할 일 → 갈래 뒤 공통 세 걸음으로 쓰고, 걸음마다 주석 머리줄을 답니다.

const total = 25000;
// 1. 조건 세우기
const big = total >= 20000;
const sale = total >= 10000;
// 2. 갈래마다 할 일
let discount = 0;
if (big) {
  discount = 2000;
} else if (sale) {
  discount = 1000;
}
// 3. 갈래 뒤 공통
const pay = total - discount;
console.log(`낼 돈 ${pay}원`);
실행 결과
낼 돈 23000원
  • 1. 조건 세우기: 조건의 값에 먼저 이름을 붙입니다. big은 '2만 원 이상인가', sale은 '1만 원 이상인가'이고, 25000원이면 둘 다 true입니다. 이렇게 참·거짓 값 하나에 붙어 갈래를 고르는 데 쓰는 이름을 깃발이라고 부릅니다.
  • 2. 갈래마다 할 일: 덩어리 밖에서도 쓸 discount를 먼저 0에 붙여 두고, 좁은 조건의 깃발 big부터 봅니다.
  • 3. 갈래 뒤 공통: 중괄호 밖의 줄은 어느 갈래를 지났든 실행되어 낼 돈을 찍습니다.

자주 틀리는 곳

틀린 생각: 넓은 조건을 위에 둬도 아래 갈래가 제 값에서 실행된다.

85점이면 '80점 이상' 갈래가 실행될 것 같습니다. 그러나 아래 코드는 C를 찍고, B 갈래는 어떤 점수에서도 실행되지 않습니다.

const score = 85;
if (score >= 70) {
  console.log('C');
} else if (score >= 80) {
  console.log('B');
}
실행 결과
C

맞는 규칙: else if는 위에서부터 처음 참인 갈래 하나만 실행합니다. 서로 감싸는 조건은 좁은 것부터 놓습니다(규칙 4).

틀린 생각: if를 여럿 이어 써도 else if처럼 갈래 하나만 실행된다.

if 줄이 위아래로 붙어 있으면 한 묶음의 갈래처럼 보입니다. 그러나 95점에 등급이 둘 찍힙니다.

const score = 95;
if (score >= 90) {
  console.log('A');
}
if (score >= 80) {
  console.log('B');
}
실행 결과
A
B

맞는 규칙: 따로 선 if는 앞 갈래와 상관없이 그 줄에서 조건을 새로 계산해, 참인 덩어리가 모두 실행됩니다. 하나만 골라야 하면 둘째부터 else if로 잇습니다(규칙 4).

확인 문제

1. 1절 코드의 total을 20000으로 바꿨습니다. 무엇이 찍히는지 그대로 쓰세요.

const total = 20000;
if (total >= 20000) {
  console.log('2000원 할인');
} else if (total >= 10000) {
  console.log('1000원 할인');
} else {
  console.log('할인 없음');
}
힌트

2번 줄의 조건부터 total의 값을 넣어 보세요.

정답
실행 결과
2000원 할인

20000 >= 20000이 true라서 3번 줄을 실행하고, 4번 줄 아래는 보지 않습니다.

흔한 오답은 1000원 할인입니다. >= 연산자를 '보다 크다'로 읽어 2번 줄을 false로 본 것입니다.

2. 예제의 '2. 갈래마다 할 일'에 들어갈 다섯 줄이 섞여 있습니다. 들여쓰기는 맞게 적었습니다.

㉠   discount = 1000;
㉡ } else if (sale) {
㉢ if (big) {
㉣ }
㉤   discount = 2000;

다섯 줄은 아래 코드의 6번 줄 let discount = 0; 바로 아래에 들어갑니다.

const total = 15000;
// 1. 조건 세우기
const big = total >= 20000;
const sale = total >= 10000;
// 2. 갈래마다 할 일
let discount = 0;
// 3. 갈래 뒤 공통
console.log(discount);

(가) 다섯 줄의 차례를 기호로 쓰고, 다 맞춘 코드가 무엇을 찍는지도 쓰세요.

(나) big을 sale보다 먼저 보는 까닭으로 맞는 것을 고르세요.

  • ① 2만 원 이상이면 sale도 true라서, sale을 먼저 보면 2000원 갈래에 닿지 못하기 때문
  • ② 자바스크립트가 가장 잘 맞는 갈래를 골라 주니 결과는 같고, 읽기 좋으라고 큰 금액부터 쓰기 때문
  • ③ 참인 갈래가 모두 실행되니, 큰 할인을 먼저 붙인 뒤 작은 할인을 더해야 하기 때문
힌트

'2. 갈래마다 할 일' — 갈래 머리(if·else if)를 위에서부터 놓고, 머리마다 그 갈래의 할인 금액 줄을 붙인 뒤 닫는 중괄호로 끝냅니다.

정답

(가) ㉢ ㉤ ㉡ ㉠ ㉣이고, 1000을 찍습니다. 15000원이라 big은 false, sale은 true입니다. 서로 바꿔도 되는 줄은 없습니다.

(나) ①입니다. 25000원이면 big과 sale이 모두 true이고, 처음 참인 갈래 하나만 실행되므로 sale을 먼저 보면 2000원 갈래는 실행되지 않습니다.

②는 자바스크립트가 가장 잘 맞는 갈래를 찾아 준다고 본 것입니다. 2절처럼 차례를 바꾸면 결과가 달라집니다. ③은 else if를 따로 선 if 여럿처럼 본 것입니다.

3. 장보기 앱이 무게(kg)에 따라 배송비를 정합니다. 무엇이 찍히는지 쓰세요.

const kg = 12;
let fee = 0;
if (kg > 5) {
  fee = 3000;
}
if (kg > 10) {
  fee = 5000;
}
console.log(fee);
힌트

3번 줄과 6번 줄은 else if로 이어져 있나요, 따로 서 있나요?

정답
실행 결과
5000

두 if가 따로 서 있어 둘 다 조건을 계산합니다. 12 > 5가 참이라 fee가 3000에 붙고, 이어서 12 > 10도 참이라 5000에 다시 붙습니다.

흔한 오답은 3000입니다. 따로 선 if 둘을 else if처럼 하나만 실행된다고 본 것입니다. 5~6번 줄을 } else if (kg > 10) { 한 줄로 이으면 정말로 3000이 찍힙니다 — 넓은 조건이 위에 있기 때문입니다.

컴퓨터에서 해 보기(선택) — 점수에 들지 않습니다. 폰으로만 보고 있다면 건너뛰세요. 예제를 main.js에 저장해 돌립니다(낼 돈 23000원). 그다음 7번 줄과 9번 줄의 깃발 이름만 서로 바꿔 if (sale) {와 } else if (big) {로 쓰면 무엇이 찍힐지 먼저 적고, 바꿔 돌려서 맞춰 봅니다. 저장하고 돌리는 법은 내 컴퓨터에서 돌려 보기에 있습니다.

끝까지 내려오면 저절로 표시됩니다. 이 기기에만 저장합니다.

자바스크립트 목차로