주인장의 프로그래밍 개발 공부방

[Chapter 3 조건문] 3. switch문을 써보자. 본문

프로그래밍 기본 지식/Chapter 3 조건문

[Chapter 3 조건문] 3. switch문을 써보자.

거신 2019. 6. 18. 10:28

지난 번에는 조건문의 하나인 if문에 대해서 알아봤고

사용하는 방법과 응용에 대해서 알아봤었다.

이번에는 또 다른 조건문인 switch문에 대해서 알아보도록 하자.

 

목표 : switch문을 정확하게 사용하고 어떤 경우에 사용하는지, switch문은 어떻게 동작하는지 정확하게 이해한다.

 

1. switch문의 구조

 

우리가 앞서 봤었던 if문과는 조금 구조가 다르게 되어 있다.

if문은

if(조건식) {
	구현부;
}
else if(조건식) {
	구현부;
}
else {
	구현부;
}

와 같은 구조였다면 switch문

switch(값) {
case 값1:
	구현부;
	break;
case 값2:
	구현부;
	break;
default:
	구현부;
	break;
}

와 같은 구조를 지니고 있다.

if문과 차이점이라고 한다면

if문if, else if, else가 크게는 전부 한 세트지만

각각의 조건식과 구현부를 모두 지니고 있으면서 각각의 영역을 가지고 있는 것이고

switch문switch라는 가장 큰 영역 안에

각각의 case, default라는 작은 영역을 지니고 있는 것이다.

비유를 조금 해보자면

 

if문if, else if, else라는 각각의 방으로 존재하고 있고 조건식이라는 이름표가 붙어 있는 것이다.

그리고 이름표에 맞는 방에 들어가면 구현부라는 가구들이 놓여져 있는 것이다.

 

switch문switch라는 큰 건물이 하나가 있고 (조건)값이라는 하나의 이름표가 붙어 있다.

그 안에 case와 default라는 방들이 존재하고 있으며

각각 상이한 이름(값1, 값2 등등)을 지니고 있는 것이다.

그리고 case라는 방 안에 구현부와 break;라는 가구가 존재하고 있는 것이다.

 

어떻게 보면 비슷할 수도 있지만 구조가 조금 다르다는 것을 알 수 있다.

그리고 if문은 조건식이 사용되며 switch문은 값을 사용한다는 점도 다르다.

같은 점이라면 if문과 switch문 모두 조건식의 결과와 값에 따라서 하나의 경우만 실행한다는 점이다.

 

2. switch문 예시

 

이번에도 역시 예제를 통해서 switch문에 대해서 알아보자.

 

예시)

int answer = 1;
switch(answer) {
case 1:
	System.out.println("1번을 선택했습니다.");
	break;
case 2:
	System.out.println("2번을 선택했습니다.");
	break;
case 3:
	System.out.println("3번을 선택했습니다.");
	break;
default:
	System.out.println("1 ~ 3번 중에 선택하세요.");
	break;
}

switch문의 가장 대표적인 예시라고 할 수 있겠다.

예시는 1번부터 3번까지의 보기가 있는데 그 중에서 번호 하나를 선택했을 때

결과를 출력해주는 코드가 되겠다.

지금은 answer1을 넣었기 때문에 switch안에서 case가 1인 경우를 찾아서 실행한다.

결과를 확인하면 콘솔창에 "1번을 선택했습니다." 라는 결과가 출력된다.

만약 answer에 2 또는 3을 넣으면 그에 맞는 결과가 출력되는 것을 확인할 수 있다.

또는 그 외의 숫자를 입력하면 default의 결과가 출력되는 것도 알 수 있으니

직접 실행하고 확인해보도록 하자.

 

이 예시를 다시 살펴보면 if문과는 다르게 조건식이 사용되지 않는다는 것을 알 수 있다.

정해진 값을 이용해서 해당하는 case를 찾아가 실행하게 되는데

여기에서 중요한 것이 바로 정해진 값이 되겠다.

조건식이라는 것이 들어갈 수 없게 되어 있다.

다르게 말하면 true 또는 false와 같이 논리 값은 여기에 자리를 잡을 수 없다는 뜻이다.

만약 위의 예시에서

switch(true)라고 작성하게 되면 바로 에러가 출력이 되는데

boolean 값은 넣을 수 없다는 에러가 출력된다.

그리고 switch문에서 사용할 수 있는 값int범위 이하의 정수와 문자, String만 가능하다.

자세하게 적어보자면 char, byte, short, int, String으로 이렇게 5개만 사용이 가능하다.

 

그리고 예시를 잘 살펴보면 항상 등장하고 있는 녀석이 있다.

바로 case와 break;인데 이 녀석들의 역할이 무엇인지 알아볼 필요가 있다.

 

3. case와 break;

 

switch문의 또 하나의 특징이라고 한다면 바로 case와 break;의 존재일 것이다.

위의 예시를 다시 보자면

 

예시)

int answer = 1;
switch(answer) {
case 1:
	System.out.println("1번을 선택했습니다.");
	break;
case 2:
	System.out.println("2번을 선택했습니다.");
	break;
case 3:
	System.out.println("3번을 선택했습니다.");
	break;
default:
	System.out.println("1 ~ 3번 중에 선택하세요.");
	break;
}

case 뒤에 정수가 따라오는데 이 숫자가 바로 목적지가 되는 것이다.

여기에는 앞서 언급했듯이 int이하의 정수와 문자, String을 사용할 수 있다.

예시에는 필자가 목적지를 1, 2, 3으로 설정했기 때문에

각각 case 1: case 2: case 3:으로 작성했고

그 외의 값들은 의미가 없기 때문에 default라는 것으로 예외처리를 했다.

즉, default는 else와 같이 생략해도 무방한 것이다.

case는 switch의 { } 안에 위치하고 있어야하고

꼭 : (콜론)을 붙여줘야 한다.

그리고 여기에서 중요한 것은 case 뒤에 따라오는 값

switch에서 받는 값의 타입과 동일해야 한다는 점이다.

꽤나 쉽게 놓칠 수 있는 부분이기 때문에 주의하는 것이 좋겠다.

예를 들면 위의 코드에서는 answer가 int타입의 변수이기 때문에

case에도 당연히 int타입의 정수를 값으로 적은 것이다.

만약 answer의 타입이 char라면 case에는 1이 아니라

'1'이라고 문자 형태로 적어야 제대로 동작한다.

String도 마찬가지이다.

answer가 String타입이라면 "1"과 같이 적어줘야 한다.

switch문을 사용하면서 이 부분에서 실수하는 경우가 허다하니

조금은 신경쓰도록 하자.

 

그리고 등장하는 것이 break;인데

뜻 그대로 멈추다라는 의미를 지니고 있다.

그렇다면 뭘 멈춘다는 뜻일까?

위의 예시를 고쳐보려고 한다.

 

예시)

int answer = 1;
switch(answer) {
case 1:
	System.out.println("1번을 선택했습니다.");
case 2:
	System.out.println("2번을 선택했습니다.");
case 3:
	System.out.println("3번을 선택했습니다.");
default:
	System.out.println("1 ~ 3번 중에 선택하세요.");
}

앞의 예시에서 break;를 전부 지워봤다.

이렇게 작성하고 프로그램을 실행하면 결과창에

"1번을 선택했습니다."부터 "1 ~ 3번 중에 선택하세요."가 전부 출력이 된다.

break;라는 녀석이 없으니 멈추지 않고 전부 실행하는 것이다.

 

answer에 1이 들어있으니 목적지인 case 1:에 도달하면 case 1:의 내용을 실행하고

그 다음에 등장하는 모든 것들을 실행하는 것이다.

만약 answer에 2를 넣는다면 case 1:은 해당하지 않으니 무시하고

case 2:부터 시작해 끝까지 전부 출력할 것이다.

이 것이 break;가 필요한 이유가 되겠다.

 

break;가 없으니 멈추지 않고 계속 달려갔으니 우리가 원하지 않는 결과까지 출력되는 것이다.

그래서 break;를 사용해 우리가 원하는 결과만 출력하고 그 다음에 switch문을 종료시키는 것이다.

이 부분이 if문과의 큰 차이라고 볼 수 있겠다.

 

4. switch문의 응용_1

 

설명은 조금 복잡했겠지만 기본적인 switch문의 틀과

구성하고 있는 녀석들이 하는 일에 대해서 알아봤으니

응용을 한 번 해보자

 

예제)

보기가 4개가 존재하는 문제를 푸는 프로그램을 작성해보자.

 

코드)

Scanner sc = new Scanner(System.in);

System.out.println("Q. 5 x 2는?");
System.out.println("1)5 2)10 3)15 4)20");
System.out.print("입력 : ");
int answer = sc.nextInt();

switch(answer) {
case 1:
	System.out.println("틀렸습니다.");
	break;
case 2:
	System.out.println("정답입니다.");
	break;
case 3:
	System.out.println("틀렸습니다.");
	break;
case 4:
	System.out.println("틀렸습니다.");
	break;
}

sc.close();

예시는 간단한 문제풀이 프로그램이 되겠다.

사용자는 문제를 보고 해당 보기 중에서 정답을 선택할 것이다.

1 ~ 4번 사이의 번호를 입력하면 answer에 입력한 번호가 저장이 되고

answer를 가지고 switch를 찾아가게 된다.

여기에서 answer와 동일한 case를 찾아가서 해당하는 문구를 출력하게 된다.

만약 입력을 2로 입력했다면 "정답입니다."라고 출력될 것이고

그 외의 번호를 입력했다면 "틀렸습니다."를 출력할 것이다.

그리고 이번에는 default:를 따로 작성하지 않았기 때문에

1 ~ 4번 외의 숫자를 입력하면 아무것도 출력하지 않고 프로그램은 종료된다.

 

이것 만으로도 괜찮은 프로그램으로 작성했다고 할 수 있겠지만

여기에서 default를 추가해서 예외처리를 한 번 해보자.

 

코드)

Scanner sc = new Scanner(System.in);

System.out.println("Q. 5 x 2는?");
System.out.println("1)5 2)10 3)15 4)20");
System.out.print("입력 : ");
int answer = sc.nextInt();

switch(answer) {
case 1:
	System.out.println("틀렸습니다.");
	break;
case 2:
	System.out.println("정답입니다.");
	break;
case 3:
	System.out.println("틀렸습니다.");
	break;
case 4:
	System.out.println("틀렸습니다.");
	break;
default:
	System.out.println("1 ~ 4번 중에서 선택하세요.");
}

sc.close();

default:만 추가해 예외처리까지 해주면서 좀 더 퀄리티가 있는 프로그램으로 만들었다.

그리고 default:에는 굳이 break;를 작성하지 않아도 되는데

당연한 이유겠지만 어차피 맨 마지막에 있는데 멈추든 안 멈추든 결과는 똑같기 때문이다.

 

5. switch문의 응용_2

 

하나의 예제를 더 만들어보자.

 

예제)

알파벳 대소문자를 구분하지 않고 보기를 선택하는 문제풀이 프로그램을 만들어보자.

 

코드)

Scanner sc = new Scanner(System.in);

System.out.println("Q. 10 + 9는?");
System.out.println("A)19 B)29 C)39");
System.out.print("입력(대소문자 무시) : ");
String answer = sc.next();

switch(answer) {
case "a":
case "A":
	System.out.println("정답입니다.");
	break;
case "b":
case "B":
	System.out.println("틀렸습니다.");
	break;
case "c":
case "C":
	System.out.println("틀렸습니다.");
	break;
default:
	System.out.println("A ~ C 중에서 하나만 고르세요.");
}

sc.close();

위의 예제는 이전의 예제와는 다르게 번호로 선택하는 것이 아니라

알파벳 a, b, c를 입력받아서 실행하는 프로그램이 되겠다.

그런데 알파벳에는 대문자와 소문자가 따로 존재하고 있기 때문에

사용자가 대문자로 입력하든 소문자로 입력하든 상관없이

마음대로 입력해도 결과가 출력되도록 만든 것이다.

여기에서는 break;를 선택해서 집어넣어 대소문자 구분을 없애버린 것이다.

a를 입력해도 case "a"로 찾아가 "A"에 있는 내용까지 같이 읽는 것이다.

b도 마찬가지이고 c도 마찬가지이다.

나중에 꽤나 유용하게 쓰일 곳이 있을 수 있으니 괜찮다면 기억해두는 것도 좋겠다.

 

6. switch문을 사용하는 경우

 

이전에 if문조건식을 사용하기 때문에 넓은 범위의 조건을 사용할 때 주로 쓴다고 했었다.

정해진 값 뿐만 아니라 넓은 범위까지 모두 포용하기 때문에

일반적으로 조건문을 사용한다면 if문을 사용한다고 했었다.

그와 반대로 switch문값을 사용하기 때문에 넓은 범위의 조건을

만족시키기에는 다소 무리가 있다.

그래서 위의 예제들과 같이 보기를 선택하는 것과 같이

정해진 값을 사용하는 곳에서는 switch문이 굉장히 유용하다.

그렇다고 넓은 범위의 조건에서 switch문을 사용할 수 없는 것은 아니다.

다만, 그 넓은 범위 안에서 수많은 값들을 하나씩 지정해준다는게

꽤나 비효율적인 작업이 될 것이라 생각한다.

 

7. 마무리

 

switch문switch, case, default, break로 구성되어 있고

switch라는 큰 방 안에 case, default, break가 존재하고 있는 것이다.

switch는 if와 다르게 조건식이 아닌 정해진 값을 가지고 판단을 하는데

case 뒤에 붙는 값이 목적지를 가리키는 것이 된다.

그리고 case 안에는 break;가 자리잡고 있는데

break;의 역할은 break전에 있는 것들을 모두 실행하고

break;를 만나면 switch문을 완전히 종료하게 된다.

그리고 if문의 else와 같이 switch문에도 default라는 것이 존재한다.

마찬가지로 생략이 가능하고 특별한 범위를 가지지 않는다.

또한 default에서는 break도 생략이 가능하다.

switch문정해진 값으로 조건을 판단하기 때문에

넓은 범위의 조건보다는 선택지와 같이 한정된 좁은 범위에서 사용하는게 유용하다.

Comments