if 문은 프로그램이 실행되는 흐름에 분기(branch)를 일으킨다. 이전 절에서 소개한 방법과 같이 여러 개의
if 문을 사용해서 다중 분기를 수행할 수도 있다. 하지만 이 방법이 언제나 최선은 아니다. 특히 모든 분기가
단 하나의 변수 값에 의해 결정될 때는 더욱 그렇다. 이 경우 여러 개의 if 문에서 동일한 변수의 값을 반복해서
확인하는 건 명백한 낭비이다.
switch 문의 용도는 위와 정확이 똑같지만 switch 문은 반복된 if 문에 비해 훨씬 효율적이다.
자바스크립트의 switch 문은 자바(Java)나 C의 switch 문과 매우 비슷하다.
if 문과 유사하게 switch 문에도 하나의 표현식과 코드 블록이 따라온다.
하지만 switch 문의 전체 문법은 이보다 더 복잡하다. 먼저 코드 블록의 여러 위치에서 레이블을 붙인다. 레이블을 붙이는 데에는 case 키워드를 쓰고 그 뒤에 콜론과 값을 쓴다. switch 문이 실행되면 '표현식'의 값을 계산하고 이 값에 대응하는 case 레이블을 찾는다. 올바른 레이블을 찾으면 해당 case 레이블 직후에 나오는 코드 블록의 첫 번째 문장부터 실행하기 시작한다. 표현식의 값과 대응하는 case 레이블을 찾지 못하면, 이럴 때를 위한 특수 레이블인 default: 레이블 직후의 첫 번째 문장부터 실행하기 시작한다. 만일 default: 레이블도 없으면 모든 코드 블록을 건너뛴다.
설명만 보고 switch문의 작동을 이해하려면 헷갈릴 수 있다.
예를 보는 편이 훨씬 명확하게 그 작동을 이해할 수 있다.
아래의 switch 문은 이전 절에서 보았던 if/else 문과 동등하다.
위 코드에서 각 case의 끝에 break 키워드가 쓰였음을 주목하다. 이번 작의 뒷부분에 설명하겠지만
break 문은 코드 실행을 중지하고 switch 문이나 루프의 끝으로 건너뛰는 역할을 한다.
switch 문의 case 절은 오직 실행하려는 코드가 시작하는 지점을 지정할 뿐이지 끝나는 지점을 지정하지는 않는다. break 문이 없다면 switch 문은 그 '표현식'의 값에 대응하는 case 레이블의 코드 블록에서 실행을 시작하여 switch 문 블록의 끝까지 계속 실행한다.
정말 희귀하긴 하지만 간혹 하나의 case 레이블에서 시작하여 다음으로 줄줄이 이어가는 것이 유용할 때도 있긴하다. 하지만 이런 희귀한 예외를 제외한 99퍼센트에 대해서는 switch 문에서 모든 case의 끝마다 break 문을 삽입하는 것을 잊지 말아야 한다. (하지만 switch 문을 함수 내부에서 사용할 때는 break 문 대신 return 문을 사용할 수도 있다. 둘다 swith 문을 종료하는 역할을 하기 때문에 그 다음에 이어지는 case의 실행을 막을 수 있다.)
아래에 보다 사실적인 switch 문의 예가 있다.
여기서는 어떤 값을 문자열로 바꾸는데 그 값의 타입에 따라 각기 다른 방법을 작용하여 문자열로 바꾼다.
앞에서 살펴본 두 예에서는 case 키워드에 이어서 숫자 또는 문자열 리터럴이 따라왔다. 이것이 실제 코딩에서 switch 문이 사용되는 가장 흔한 형태이다. 하지만 ECMAScript 표준에 의하면 case 다음에는 임의의
표현식이 따라올 수 있다.[각주:1] 예를 들어보자.
case Math.PI:
case n+1:
case a[0]:
switch 문은 먼저 switch 키워드 다음에 나오는 평가식을 평가한 후, 대응하는 값을 찾을 때까지 case 문들이 나열된 순서대로 각 case 문의 표현식을 평가한다.[각주:2] 대응하는 case를 판별하는 데에는 동등 연산자 ==가 아닌 일지 연산자 ===가 사용된다. 따라서 아무런 타입 변환 없이 표현식 값이 같아야만 한다.
case에 함수 호출이나 할당과 같이 부수 효과가 있는 표현식을 사용하는 것은 좋지 않은 프로그램 습관이다. 왜냐하면 매번 switch 문이 실행될 때 모든 case 표현식들이 평가되지는 않기 때문이다. 경우에 따라 부수 효과가 일어날 수도, 일어나지 않을 수도 있다면 프로그램의 올바른 작동을 예측하기 힘들다. 가장 안전한 방법은 case 표현식을 상수 표현식만으로 제한하는 것이다.
앞에서 설명한 바와 같이, switch 표현식에 대응하는 case 표현식이 하나도 없으면 switch 문은 default: 레이블이 붙은 문장 이후부터 실행하기 시작한다. 만일 default: 레이블도 없으면 switch 문은 그 몸체를 모조리 건너뛴다. 지난 예에서 default: 레이블은 switch 몸체에서 모든 case 레이블 다음의 맨 마지막에 등장했음을 유념하라. 바로 이 장소가 default: 레이블이 등장하기에 논리적인 장소이며 실제로도 흔히 등장하는 곳이다. 하지만 default: 문은 사실 switch 문의 몸체 어디서 등장해도 무방하다.
- 바로 이 점 때문에 자바스크립트 switch 문은 C나 C++, 자바의 switch 문과 큰 차이가 있다. 이러한 언어에서 case 문의 표현식은 반드시 컴파일시에 상수로 얻어질 수 있어야 한다. 이는 정수 타입 또는 다른 정수 형태의 타입(char, unsigned int 등)이어야 하며 모든 case 문의 표현식은 같은 타입이어야 한다. [본문으로]
- 이 점 때문에 자바스크립트 switch 문은 C나 C++, 자바의 switch 문보다 효율성이 떨어진다. 이러한 언어에서 case 표현식은 컴파일시 상수로 얻어지기 때문에 자바스크립트와는 달리 이를 실행 시간에 평가하지 않아도 된다. 더구나 C나 C++, 자바에서 case표현식은 정수값이다 보니 흔히 점프 테이블을 사용하여 매우 효율적으로 switch 문을 구현하곤 한다. [본문으로]
'IT_Programming > JavaScript' 카테고리의 다른 글
자바스크립트 완벽가이드 - 6.7 do/while (0) | 2010.07.04 |
---|---|
자바스크립트 완벽가이드 - 6.6 while (0) | 2010.07.04 |
자바스크립트 완벽가이드 - 6.4 else if (0) | 2010.07.04 |
자바스크립트 완벽가이드 - 6.3 if (0) | 2010.07.04 |
자바스크립트 완벽가이드 - 6.2 복합문 (0) | 2010.07.04 |