Media Log


1. switch


switch문은, if~else문에서 여러개의 조건문이 올때 else if문으로 해결할 수도 있지만, 너무 많다보면 코드가 산만해 보일수도 있습니다. 이렇게 판단해야할 조건문이 많을 경우에는 switch문을 사용합니다.


switch문의 기본 구성은 이렇습니다.

switch (n) {

case 1:

변수의 값이 1일 경우에 실행될 문장

case 2:

변수의 값이 2일 경우에 실행될 문장

default:

위의 조건을 모두 만족하지 못할때 실행되는 문장

}


switch문은 괄호 안에오는 n의 값을 가지고 그 값에 해당하는 레이블으로 이동합니다. 여기서 레이블(label)은 위에 쓰인 case, default 모두 레이블(label)이라고 하며, 이 레이블은 위치를 나타내기 위해 사용됩니다.


아래의 예를 통해 switch문의 실행 흐름을 살펴보도록 하겠습니다.

class MonthSwitch {

    public static void main(String[] args) {

        int month = 2;


        switch (month) {

            case 1:  System.out.println("1월"); break;

            case 2:  System.out.println("2월"); break;

            case 3:  System.out.println("3월"); break;

            case 4:  System.out.println("4월"); break;

            case 5:  System.out.println("5월"); break;

            case 6:  System.out.println("6월"); break;

            case 7:  System.out.println("7월"); break;

            case 8:  System.out.println("8월"); break;

            case 9:  System.out.println("9월"); break;

            case 10: System.out.println("10월"); break;

            case 11: System.out.println("11월"); break;

            case 12: System.out.println("12월"); break;

            default: System.out.println("해당하는 달이 없습니다.");break;

        }

    }

}


결과:

2월


코드를 보시면, switch문 괄호 안에온 변수 month의 값은 2이므로 2에 해당하는 레이블로 이동합니다. (case 2)

그런데, 각 레이블의 끝에 break문이 쓰이신게 보이시나요? 이 break문은 이후에 배울 반복문에서도 쓰입니다. break문의 역할은 뜻 그대로 '탈출하다', 즉 switch문 밖으로 벗어나게 해주는 키워드입니다.


만약 이 break문이 없다면 어떻게 될까요?

class MonthSwitch {

    public static void main(String[] args) {

        int month = 2;


        switch (month) {

            case 1:  System.out.println("1월");

            case 2:  System.out.println("2월");

            case 3:  System.out.println("3월");

            case 4:  System.out.println("4월");

            case 5:  System.out.println("5월");

            case 6:  System.out.println("6월");

            case 7:  System.out.println("7월");

            case 8:  System.out.println("8월");

            case 9:  System.out.println("9월");

            case 10: System.out.println("10월");

            case 11: System.out.println("11월");

            case 12: System.out.println("12월");

            default: System.out.println("해당하는 달이 없습니다.");

        }

    }

}


결과:

2월

3월

4월

5월

6월

7월

8월

9월

10월

11월

12월

해당하는 달이 없습니다.


코드를 보시면, switch 괄호 안의 변수 month 값이 2이므로 그에 해당하는 레이블로 이동합니다. (case 2)

그런데, 여기서 문장을 출력하고 switch문 밖으로 빠져나가지 못하고 그 아래의 내용들을 모두 출력시켜 버린 후에야 switch문을 빠져나와 버립니다. 참고로, default문을 사용할때는 break문을 사용하지 않아도 됩니다. 그 이유가, default문에서 break문이 쓰이지 않아도 아래에서 더이상 실행될 문장이 없기 때문입니다. 그리고 default문은 있어도 되고, 없어도 됩니다. 위의 예제에서 default를 생략해도 아무런 문제가 없다는 것을 말합니다.


+ case 레이블은 한줄에 두개 이상이 올수 있습니다.

switch (n) {

case 1: case 2: case 3:

(n의 값이 1 또는 2 또는 3일 경우에 실행되는 문장)

case 4: case 5: case 6:

(n의 값이 4 또는 5 또는 6일 경우에 실행되는 문장)

default:

(위의 조건을 모두 만족하지 못할때 실행되는 문장)

}

  1. 오연수 at 2012.08.21 18:10 신고 [edit/del]

    swith문이
    비주얼베이직의 select case문이네요..
    좋은 강좌 감사합니다.

    Reply
  2. 오연수 at 2012.08.23 17:54 신고 [edit/del]

    switch구나

    Reply
  3. 언어 at 2012.09.20 15:59 신고 [edit/del]

    c와 비교적 비슷해서 이해하기 좋네요 좋은강좌 감사합니다^^

    Reply
  4. 김승현 at 2012.10.04 02:28 신고 [edit/del]

    감사합니다~

    Reply
  5. BlogIcon 이영호 at 2012.12.03 11:23 신고 [edit/del]

    제가 이제 막 공부를 시작한 초보라 궁금한 게 있는데요. case 1: ~~~
    저기 case 다음에 오는 변수 1에 문자도 가능한 건가요?
    가능하다면 case 'angel': 이렇게 써야 하나요, 아니면 case angel: 이렇게 써야 하나요?
    너무 무식한 질문인가...

    Reply
    • BlogIcon EXYNOA at 2012.12.03 20:49 신고 [edit/del]

      자바7 부터는 switch-case 간의 문자열 비교를 지원합니다. 물론 사용한다면 아래와 같은 방법을 통해 비교할 것입니다.

      case "angel":
      ..

      그리고, 그 이하버전에서는 char형과 integer형만 비교가 가능합니다.

  6. 김광연 at 2013.01.10 22:00 신고 [edit/del]

    openjdk로 아래내용을 컴파일했더니 않되요
    class switch
    {
    public static void main(String[] args)
    {
    int a=2;

    switch(a)
    {
    case 1: System.out.println("aaa");break;
    case 2: System.out.println("sss");break;
    case 3: System.out.println("dfsfs");break;
    default: System.out.println("a");break;
    }
    }
    }

    Reply
  7. jinlak at 2013.04.26 18:39 신고 [edit/del]

    제가
    class Swich
    {
    public static void main(String[] args)
    {

    int num = 1;

    swich (num);
    {
    case 1: case 2: case 3:
    System.out.println("num의 값은 1과 2와 3의 값중 하나이다."); break;
    case 4: case 5: case 6:
    System.out.println("num의 값은 4와 5와 6의 값중 하나이다."); break;
    default:
    System.out.println("num값과 일치하는 값이 없다.");
    }
    }
    }
    이렇게 작성하니
    Swich.java:10: error: orphaned case
    case 1: case 2: case 3:
    ^
    1error
    라고 에러가 뜹니다.

    Reply
    • BlogIcon EXYNOA at 2013.04.26 22:55 신고 [edit/del]

      switch (num)
      {
      case 1: case 2: case 3:
      System.out.println("num의 값은 1과 2와 3의 값중 하나이다."); break;
      case 4: case 5: case 6:
      System.out.println("num의 값은 4와 5와 6의 값중 하나이다."); break;
      default:
      System.out.println("num값과 일치하는 값이 없다.");
      }

    • 활력포션 at 2013.12.18 15:24 신고 [edit/del]

      첫줄에 class Swich <= t가 빠졌네요.

  8. 초보 at 2014.09.15 17:31 신고 [edit/del]

    지금 c언어는 어느정도 끝내고 자바 배우려는데요..

    대부분의 제어문이나 연산자등은 동일 한가요?

    자바와 c의 차이점이 어떻게 될까요?

    Reply
    • 초보 at 2014.09.15 17:32 신고 [edit/del]

      아 그리고 이런 c언어에서도 충분히 했던 간단한 예제들은 다 건너 뛰어도 무방하겠죠?

    • BlogIcon EXYNOA at 2014.09.24 01:44 신고 [edit/del]

      C언어와 겹치는 개념이라고 생각이 확실하게 되신다면 과감하게 넘기셔도 됩니다. 아무래도 C언어와 자바의 가장 큰 차이점은 절차지향과 객체지향의 차이인 것 같습니다. (구조체 <-> 클래스, 인터페이스, 추상 클래스 등)

  9. b at 2016.05.05 14:19 신고 [edit/del]

    switch 문과 if~else if문을 섞어서 학점을 출력하는 코딩을 하려다
    오히려 헷갈리는 군요 적절하게섞어서 할수있는방법있나요

    아니면

    switch문으로 학점을계산을 할수있나요???

    Reply
    • BlogIcon EXYNOA at 2016.05.11 17:49 신고 [edit/del]

      점수를 받아서 학점을 출력하는 프로그램이라면 switch문으로도 손쉽게 구현하실 수 있습니다. 기존에 작성한 코드를 여기다 게시해주시거나, 아니면 따로 네이트온 대화로 말씀을 해주시면 감사하겠습니다.

  10. asad at 2016.10.09 00:06 신고 [edit/del]

    switch는 메인메소드안에서만 쓸수있는건가요??
    아니면 다른메소드에서도 사용이가능한가요??

    Reply
  11. GOod at 2017.10.03 11:33 신고 [edit/del]

    대학 강의들으면서 같이 이 홈페이지로 공부하고있습니다.
    많은 도움이 되고있습니다. 감사합니다.

    Reply

submit

티스토리 툴바