[JS] If-else와 switch 문의 차이

CheolHyeon Park·2022년 11월 3일
0

JavaScript

목록 보기
11/23


f-lab 멘토링 중, if문과 switch문이 어떤 차이가 있는지에 대한 질문을 받았습니다. 이에 대해 정확하게 답변할 수 없었습니다. 비슷한 상황에 사용하는 두 분기문이 어떤 점이 다른지 궁금하기도 하여 정리해보고자 합니다.

👉🏻 If문

If문 구조

if (Expression) Statement

// or

if (Expression) Statement else Statement

If문은 Expression 부분이 trueIf Statement를 실행하고 falseelse Statement를 실행합니다.

👉🏻 Switch문

Switch문 구조

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을 만드는지에 대한 의문입니다.
    JS에서 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문은 여러 옵션 중에 한가지를 선택하는 경우에 사용하도록 명시되어있기 때문입니다.

결론을 내기가 어려웠습니다. 피드백은 달게 받겠습니다

참고

profile
나무아래에 앉아, 코딩하는 개발자가 되고 싶은 박철현 블로그입니다.

0개의 댓글