2011년 4월 26일 화요일

자바의 제어문(switch)

오늘은 자바의 switch문에 대해서 알아보겠다.

switch (수식)
{
case 정수1: 명령문1;
case 정수2: 명령문2;
case 정수3: 명령문3;
......
......
case 정수8:case 정수9:명령문9;
//한 명령문에 케이스 여러개 만들수도 있다.
default: 명령n; //해당하는 케이스가 없어도 default(?) 모드니까 기본적으로 실행된다. 필요하지 않으면 안만들어도 된다.
}

수식과 정수가 일치하는 곳에서부터 밑으로 쭈욱 실행한다. 예제를 보면 이해가 한결 쉬울 것이다. 그럼 예제를 살펴보자.




위의 코드를 짜고 답이 어떻게 나올지 예상해 보자. 수식에 3이 들어가므로 case 3부터 default문까지 실행된다. 따라서 결과는 아래와 같다.

세엣
다섯
일곱


그럼 n에다가 10을 집어넣으면 어떻게 될까? 10과 매치되는 케이스는 없으므로 기본값인 "끝"이 출력된다. n대신에 n=n+1 같은 수식을 넣어서 계산도 가능하니 응용해 보기 바란다. 이번에는 해당케이스만 실행하고 switch문을 빠져나올수 있는 break에 대해서 알아보기로 하자.



위의 예제는 스위치문에 n과 m을 더한 숫자 7이 들어간다. 그래서 해당 케이스 7에 들어있는  명령문이 실행된다. 결과는 아래와 같다.

Total=7

해당 케이스부터 아래 default문까지 실행되어야 하는데 default문이 실행되지 않았다. break를 만나면 위와같이 switch문을 빠져나올수 있다. 그럼 이번에는 m값을 5로 고쳐보자. 그럼 스위치에 들어가는 값이 8이 된다. 그런데 케이스 8이 없다. 해당사항이 없으므로 기본모드인 default문이 작동된다. 그러면 결과는 아래와 같이 된다.

해당사항 없음
Total=0

이번에는 필자가 조금 헤깔릴만한 switch문을 만들어보았다. 과연 다 맞출수 있는 똘똘한 자바인(?)이 있을까? 그럼 아래의 예제를 보기 바란다.


switch문과 break, 그리고 증감연산자를 이용한 예제이다. 자바를 실행하기전 무엇이 나올지 메모지에 한번 써보기로 한다. 저번 시간에 배운 증감연산자의 내용을 기억한다면 맞출 확률이 상당히 높을 것이다. 그럼 결과를 살펴보자.

제로
하나
두울
세엣
1이라는 값이 x에 들어있음!

그럼 분석을 시작하겠다. x값으로 0을 주었다. switch문의 수식은 x++다. 이건 뭐라고 했징? x=x+1과 같다고 했다. 그래서 x=0+1 따라서 1이다. 그럼 case 1로 가야하는데 case 0에서부터 시작했다. 이상하다? ㅎㅎ 그런데 결과를 보니 x에 들어있는 값은 1이라고 제대로 나온다. 이제 감이 오는감? 그렇다. x++는 "선처리, 후연산"이라고 했다. 따라서, 값을 넘겨주는 처리부분을 먼저 행하니 x에 0이 대입되어 case 0으로 보내지고 x는 1을 증가시켜 연산하는 과정을 밟게 된다. 그리고 케이스 0부터 3까지 명령문들을 수행한다음 case 3에 break가 있으므로 switch문을 빠져나와 x값을 출력하고 있다.

if와 switch는 기능이 비슷하여 서로 상호작용이 가능하다. if로 써도되고 switch로 써도된다. 굳이 차이점을 말하라면 switch가 if에 비해 보기 편하다. 즉 아까 보다시피 가독성이 높다.ㅎㅎ 이렇게만 얘기하면 실망하겠지? 자 그럼 좀더 들어가보자면 switch는 char나 int 타입만 비교가능하지만 if는 String 타입도 가능하다. if는 순차적으로 원하는 조건을 살펴봐야 하지만 switch는 조건이 맞으면 해당란으로 바로 점프할수 있다. 또한 조건문이 많아지면 switch를 쓰는것이 더 빠르지만 요즘은 컴파일러 처리속도가 워낙 빠르니 그 효과를 기대하기가 어렵다. 굳이 따지자면 이런 차이들이 있겠지만 그냥 여러분 손가락이 안내(?)하는데로 가기 바란다. 저번과 이번 시간에 배운 조건문들은 수시로 쓰게 될테니 확실하게 이해하기 바라면서 오늘은 이만 마치겠다. ^^

댓글 3개:

  1. 안녕하세요 현재 자바 강의를 재밌게 보고 있는 내년 달걀한판입니다 ^^

    문의 드릴 사항이 있어서요

    마지막 예제를 보면 마직막 값이 "1이라는 값이 들어있음" 이자나요

    그런데 실제로 x++로 x는 3까지 카운트되므로

    "3이라는 값이 들어있음" 이 맞는거 아닌가요

    현재 돌려봐도 그렇고 어떻게 1이되는지 모르겠네요 ㅠ.ㅠ

    답변 부탁드리겠습니다. 감사합니다.

    답글삭제
  2. 0이냐 아니면 1이냐가 주안점인데 강의에서 보시는것과 같이 x++ 이거는 x=x+1과 같애요. 기본값이 0이니까 x에 0을 대입해보면 x=0+1이라서 x=1이죠. 2나 3은 나올리가 없죠. 이게 반복문이 아니니까요. switch는 받은 인자와 같은 case로 이동합니다. 여기선 계산하면 case1으로 가야하는데 case0에서 시작하죠? 이걸 강의자가 왜 그런지 끝에 잘 설명해놓았네요. 사람들이 혼동하는게 스위치문은 한줄 실행하고 끝나는줄 아는데 해당 케이스로 이동해서 예에서처럼 중지하는 브레이크문 나올때까지 한줄한줄 계속 이동해요. 이정도만 아시면 될듯싶습니다.

    답글삭제
  3. 흠 결국 스위치 문에서 x값이 인덱스처럼 해당 값을 찾아가
    break문이나 switch문이 끝날때 까지 수행하는 것이라 보고

    x 값이 case 3번까지 실행하였다고 하여 그 숫자 3값이 x에 대입이 되거나 1,2,3 하나씩 +1씩 증가 되거나 하지는 않는 것이라 이해하였습니다.

    답글삭제