switch 문은 점프 위치 변숫값에 따라 특정 위치(case)로 이동해 구문을 실행하는 선택 제어문이다. 점프할 수 있는 위치는 'case 위칫값:'으로 설정한다. 이렇게 클론(:) 문자가 붙은 값은 이동할 위치를 가리키는 일종의 팻말 역할을 한다고 생각하면 된다. case 구문 말고 default: 구문도 포함될 수 있는데 이는 if 문의 else 구문과 비슷한 기능으로, 일치하는 위칫값이 없을 때 점프할 위치를 나타낸다. default 구문은 생략할 수 있다.
switch 문의 구조
switch(점프 위치 변수) { // 점프 위치 변수 : 정수, 문자. 문자열 사용 가능
case 위칫값 1 : //점프 위치 변수 = 위칫값 1이면 이 위치로 이동
실행 구문;
case 위칫값 2 : //점프 위치 변수 = 위칫값 2이면 이 위치로 이동
실행 구문;
...
case 위칫값 n : //점프 위치 변수 = 위칫값 n이면 이 위치로 이동
default: //일치하는 위칫값이 없을 때 이 위치로 이동
실행구문; // default ~ : 생략 가능
}
다시 한번 말하지만 switch 문의 역할은 특정 위치로 이동시키는 것이 전부다. 그러다 보니 if문과는 조금 다르게 동작한다. 다음 예제를 살펴 보자.
switch 문을 이용한 점프의 예
int a = 2;
switch(a) {
case 1:
System.out.println("A");
case 2: // switch(a)에 따라 case 2:로 이동한 후 차례대로 구문 실행
System.out.println("B"); // 실행됨
case 3:
System.out.println("C"); // 실행됨
default:
System.out.println("D"); //실행됨
}
a 값이 2이므로 switch문의 역할은 case 2:로 실행 순서를 이동시키는 것이다. 이것이 전부다. 그다음부터는 원래 프로그램 실행 순서대로 1줄씩 진행된다. 따라서 B,C,D가 모두 출력된다. 여기서 case 2: 구문은 실행 명령이 아닌 단순히 위치를 정하는 팻말의 역할을 하므로 아무것도 실행하지 않는다. 이것이 조건식이 true인 첫 번째 블록 하나만을 실행하는 if 문과 다른 점이다.
그렇다면 switch 문도 if 문처럼 단 하나의 실행문만 실행하게 할 수는 없을까? break 제어 키워드를 사용하면 된다. 제어 키워드는 뒤에서 좀 더 자세하게 다루도록 하고, 여기에서는 'break는 if 문을 제외한 가장 가까운 중괄호({})를 탈출'하는 키워드라는 것만 기억하자. 즉, switch 문에서 break를 만나면 switch 문을 탈출하게 되는 것이다. 다음 예제의 결과를 살펴보자.
break 키워드를 포함한 switch 문의 예
int a = 2;
switch (a) {
case 1:
System.out.println("A");
break;
case 2: //switch(a)에 따라 이동되는 위치
System.out.println("B"); // 실행됨
break; // switch 문을 탈출
case 3:
System.out.println("C");
break;
default:
System.out.println("D");
}
switch(a)가 case 2:로 실행 순서를 이동시켜 "B"를 출력한다. 이어서 break를 만나 switch문을 탈출한다. '애초에 case 구문 문법을 만들 때 break 기능을 포함하면 좋았을텐데..."라고 생각하는 사람도 있을 것이다. 하지만 의도적으로 break를 빼고 프로그램을 작성할 때도 자주 있다. 예를 들어 다음과 같이 10점 만점에 7점 이상은 "Pass"를 출력하고 나머지는 "Fail"을 출력하고자 할 때를 생각해 보자.
Switch문을 이용한 7점 이상 Pass 출력의 예 1
int a = 8;
switch(a) {
case 10;
System.out.println("Pass"); break;
case 9;
System.out.println("Pass"); break;
case 8;
System.out.println("Pass"); break; // 실행한 후 switch 문 탈출
case 7;
System.out.println("Pass"); break;
default:
System.out.println("Fail");
}
한눈에 봐도 중복 코드가 많아 비효율적으로 보인다. 각 case 구문에서 Pass 또는 Fail을 출력하는 명령 하나만 수행하므로 이 정도이지, 만약 case 구문마다 수십가지 작업을 수행한다면 코드의 중복은 더욱 심각해질 것이다. 이렇게 case 구문마다 break 키워드를 붙이는 대신, 다음 예와 같이 하나의 실행문에 여러 개의 case를 지정하면 훨씬 간결하게 코드를 작성할 수 있다.
swhitch문을 이용한 7점 이상 Pass 출력의 예 2
int a = 8;
switch(a) {
case 10:
case 9:
case 8:
case 7:
System.out.prinltn("Pass"); break;
default:
System.out.prinltn("Fail");
switch 문은 위칫값으로 정수, 문자, 문자열만 사용할 수 있는 반면 if문은 조건식에서 다양한 비교 연산자, 논리 연산자를 쓸 수 있으므로 효율성에서는 차이가 날 수 있지만 기본적으로 switch문은 if 문과 상호 변환할 수 있다. switch 문과 if 문의 동작 원리를 알면 변환 자체는 그리 어려운 일이 아닐 것이다. 다음 예는 switch 문으로 작성된 코드를 동일한 기능을 수행하는 if 문으로 변환한 코드다.
swtich 문과 동일한 기능을 수행하는 if 문
int a = 8;
//switch 문
swtich(a) {
case 10:
case 9:
System.out.println("A");
break;
case 8:
System.out.println("B"); // 실행한 후 탈출
break;
case 7:
System.out.println("C");
break;
default:
Sysstem.out.println("D");
}
//if문
if(a >= 9) {
System.out.println("A");
}
else if (a == 8) {
System.out.println("B"); // 실행한 후 탈출
else if (a == 7) {
System.out.println("C");
else {
System.out.println("D");
}
그렇다면 switch문과 if 문 사이에는 어떤 성능 차이가 있을까? 답을 먼저 말하면 전체적인 속도의 차이는 거의 없다고 보면 된다. 다만 각 결과에 따른 속도 차이가 날 수 있는데, 예를 들어 위 예제의 if 문에서 "A"가 출력될 때는 1개의 조건식만 검사한 후 출력되지만, "C"나 "D"가 출력될 때는 3개의 조건식을 비교한 후에 출력된다. 따라서 100만 개의 "A"출력과 100만 개의 "C" 출력 사이에 속도가 발생할 수 있다. 반면 switch 문일 때 "A"를 출력하든 "C"나 "D"를 출력하든 동일하게 한 번의 점프만을 수행한 후 실행되므로 모든 출력 속도가 동일하다는 장점이 있다. 하지만 조건식의 검사 속도가 워낙 빠른데다 한 번에 수백만 개의 데이터를 처리하는 상황이 아니라면 어느 것을 사용해도 상관없다.
switch 문 (break 미포함, break 포함, if문 변환)
//break가 포함되지 않았을 때
int value1 = 2;
switch (value1) {
case 1:
System.out.println("A");
case 2:
System.out.println("B"); //점프한 후 계속 실행
case 3:
System.out.println("C");
default:
System.out.println("D");
}
System.out.println();
//break가 포함되어 있을 때
int value2 = 2;
switch(value2) {
case 1:
System.out.println("A");
break;
case 2:
System.out.println("B"); // 실행한 후 탈출
break;
case 3:
System.out.println("C");
break;
default:
System.out.println("D");
}
System.out.println();
//if - else if - else 구문으로 변환
if(value1 ==1) {
System.out.println("A");
}
else if(value1 == 2) {
System.out.println("B"); // 실행한 후 탈출
}
else if(value1 == 3) {
System.out.println("C");
}
else{
System.out.println("D");
}
결과