f-lab 멘토링 중, if
문과 switch
문이 어떤 차이가 있는지에 대한 질문을 받았습니다. 이에 대해 정확하게 답변할 수 없었습니다. 비슷한 상황에 사용하는 두 분기문이 어떤 점이 다른지 궁금하기도 하여 정리해보고자 합니다.
if (Expression) Statement
// or
if (Expression) Statement else Statement
If
문은 Expression 부분이 true
면 If
Statement를 실행하고 false
면 else
Statement를 실행합니다.
switch (Expression) {
case Expression: {
// ...
}
// or
case Expression:
// ...
default:
// ...
}
Switch
문은 Expression의 값에 따라 case
값과 일치하는 곳으로 분기를 합니다.
If
문은 equality와 logical expression을 체크하고 Switch
문은 equality만 체크합니다.If
문은 integer, character, boolean과 같은 타입을 평가하고 Switch
문은 integer와 character만 평가합니다.If
문의 평가식이 false라면 else
문을 실행하는 반면 Switch
문은 평가식과 맞는 case
가 없다면 default
문을 실행합니다.If
문은 장황하여 수정하기 어렵고 Switch
문은 상대적으로 단순하여 수정이 쉽습니다.If
문은 런타임에 해석하여 분기하고 Switch
문은 컴파일 과정에서 jump table을 만들어 분기하기에 비교적 성능상 이점이 있습니다.위의 내용이 인터넷 검색으로 나온 If
문과 Switch
문의 차이점입니다. 하지만 의문점이 많이 남았습니다.
If
문을 대체할 수 있습니다.const a = 0;
switch(true) {
case a === 0:
// 코드
case f(a) === 'no':
}
위와 같이 Switch
문을 true로 돌리면 case
에 logical expression과 integer, character 외의 값을 넣어 평가할 수 있습니다. (심지어 함수도 평가 가능)
Switch
문이 컴파일 타임에 jump table을 만드는지에 대한 의문입니다.Switch
문의 case
는 동적으로 해석하는 것으로 보이기 때문입니다.var a = 3;
switch(true) {
case a++ > 5: console.log(a); break;
case a++ > 5: console.log(a); break;
case a++ > 5: console.log(a); break;
case a++ > 5: console.log(a); break;
case a++ > 5: console.log(a); break;
} // 7
위 코드처럼 a++ > 5
라는 case
를 동적으로 해석하여 출력(7)하고 있습니다.
If
문과 Switch
문은 문법에 차이가 있고 동작방식의 소소한 차이가 있습니다. 하지만 서로 대체 가능하여 그 차이가 크지 않은 것 같습니다.
If
문과 Switch
문의 차이는 사용 목적이 차이가 난다고 생각합니다. If-else
는 두가지 옵션 중 한가지를 선택하는 경우에 사용하도록 ECMAScript에 명세에 되어있고(else if
문은 없습니다. else
후에 또 다른 if
문이 나오는 겁니다.) Switch
문은 여러 옵션 중에 한가지를 선택하는 경우에 사용하도록 명시되어있기 때문입니다.
결론을 내기가 어려웠습니다. 피드백은 달게 받겠습니다
참고