[C# 입문] if 문 과는 다르게 쓸 수 있는 switch 문
앞서 우리는 if문에 대해 배워보았습니다.
if문에서는 어떤 상황을 가정하며 상황에 맞는 결과를 출력 혹은 행동할 수 있게끔 프로그램을 이끌어가는 하나의 흐름으로 볼 수 있습니다.
switch문 또한 if문과는 조금 다른 형태의 흐름을 제어하는 제어문이라 볼 수 있습니다.
switch문의 기본 형태
switch (조건의 대상이 되는 변수)
{
case 조건값1 :
조건값1이 참일 경우 실행;
break;
case 조건값2 :
조건값1이 참일 경우 실행;
break;
case 조건값3 :
조건값1이 참일 경우 실행;
break;
case 조건값4 :
조건값1이 참일 경우 실행;
break;
default :
위의 조건값에 해당하지 않는 경우에 실행;
break;
}
의 기본 형태로 진행하고 있습니다. 조건은 꼭 조건4까지만 있는 것이 아닌 원하는 만큼 넣어도 됩니다.
- switch문은 case 별로 나누어서
- case에 해당하는 조건을 찾아간 다음, 그에 해당하는 행동요건을 실행합니다.
- 그리고 중지! (break) 하는 형태를 이루고 있습니다.
- 위에서 원하는 조건(case)를 찾지 못한다면, 기본값(default)을 찾아서 실행하는 것이지요.
예시를 들어보도록 하겠습니다.
[1부터 5까지의 숫자를 한 개 입력받아서 실행하면 그에 따른 결과값을 출력하는 예제입니다.]
using System;
namespace MyFirstApp
{
class Program
{
static void Main(String[] args)
{
int input = 0;
Console.Write("1~5까지의 숫자를 입력하세요 : ");
input = Convert.ToInt32(Console.ReadLine());
switch(input)
{
case 1:
Console.WriteLine("1을 입력하셨군요!");
break;
case 2:
Console.WriteLine("2를 입력하셨군요!");
break;
case 3:
Console.WriteLine("3을 입력하셨군요!");
break;
case 4:
Console.WriteLine("4를 입력하셨군요!");
break;
case 5:
Console.WriteLine("5를 입력하셨군요!");
break;
default:
Console.WriteLine("1 ~ 5 외의 숫자를 입력하셨습니다!");
break;
}
}
}
}
실제 입력을 해서 확인해보면, 3을 입력하면 -> 3을 입력하셨군요! 라는 문장이 나오게 됩니다.
여기서는 지금까지와 다른 한 문장이 추가되었는데, 바로 Convert.ToInt32(Console.ReadLine()); 입니다.
C#은 프로그래머가 쓰기 좋게 만들어져서 이러한 형태처럼 해석을 하기 편하게 만들어져 있습니다. 처음보면 당황할 수 있지만, 조금만 익숙해진다면 그 무엇보다 편하게 쓸 수 있습니다.
Convert.ToInt32(Console.ReadLine()) 하나씩 해석해보도록 하겠습니다.
- 괄호에서 제일 안쪽, 오른쪽부터 해석합니다.
- Console.ReadLine() -> 한 줄을 읽겠다. (Console에 들어있는 기능 중 하나인 REadLine 기능을 쓰려고 한다.)
- 2번에서 읽어들인 것을 ToInt32 (Int 형으로, 즉 정수형으로), Convert (변환하겠다.) // Convert.ToInt32 를 한번에 해석해서 변환하려고 하는데, To Int32인 정수형으로 변환하고자 합니다. 정도로 해석할 수 있겠습니다.
앞으로 볼 내용들도 대부분 이러한 형태를 가지게 됩니다. 복잡한 형태라도 대부분이 이러한 형태를 가지고 있는데, 이 부분은 나중에 다시 설명하도록 하겠습니다. 지금은 입력받는 것은 문자열이지만, 입력받는 것은 정수형으로 받아야하므로 바뀐다는 사실만 알아두시면 됩니다.
그렇다면 만약에 break문을 안쓰게 되면 어떻게 될까요?
using System;
namespace MyFirstApp
{
class Program
{
static void Main(String[] args)
{
int input = 0;
Console.Write("1~5까지의 숫자를 입력하세요 : ");
input = Convert.ToInt32(Console.ReadLine());
switch(input)
{
case 1:
Console.WriteLine("1을 입력하셨군요!");
break;
case 2:
Console.WriteLine("2를 입력하셨군요!");
case 3:
Console.WriteLine("3을 입력하셨군요!");
case 4:
Console.WriteLine("4를 입력하셨군요!");
case 5:
Console.WriteLine("5를 입력하셨군요!");
default:
Console.WriteLine("1 ~ 5 외의 숫자를 입력하셨습니다!");
break;
}
}
}
}
이러한 형태로 말이죠.
여기에 3을 입력한다면, 결과는
3을 입력하셨군요!
4를 입력하셨군요!
5를 입력하셨군요!
1 ~ 5 외의 숫자를 입력하셨습니다.
가 나오게 될 것입니다.
여기서 우리는 break가 특정 case에 따른, 결과값을 break해준다는 사실을 볼 수 있습니다.
위와 같은 결과를 활용하면 이러한 형태를 만들 수도 있습니다.
using System;
namespace MyFirstApp
{
class Program
{
static void Main(String[] args)
{
int input = 83;
Console.WriteLine("당신의 성적은 ");
switch(input)
{
case 100: case 99: case 98: case 97: case 96: case 95: case 94: case 93:
case 92: case 91:
Console.WriteLine("A입니다.");
break;
case 90: case 89: case 88: case 87: case 86: case 85: case 84:
case 83: case 82: case 81:
Console.WriteLine("B입니다.");
break;
case 80: case 79: case 78: case 77: case 76: case 75: case 74: case 73:
case 72: case 71:
Console.WriteLine("C입니다.");
break;
case 70: case 69: case 68: case 67: case 66: case 65: case 64: case 63:
case 62: case 61:
Console.WriteLine("D입니다.");
break;
default:
Console.WriteLine("F입니다.");
break;
}
}
}
}
다양한 case를 활용해서 성적처리 프로그램을 만들었습니다. 단점은 너무 코드를 쓸 양이 많아진다는 점과 실수를 처리하기에는 부적절할 수도 있습니다. 그래서 위와 같은 코드는 if절로 처리하는 것이 더 효율적입니다. <조금 더 정확하게는 간단한 상수값을 통한 비교라면 switch문이 효율적이지만, 복합적인 상황 혹은 여러 가지 조합을 이용한 비교라면 if문이 유리합니다.>
using System;
namespace MyFirstApp
{
class Program
{
static void Main(String[] args)
{
int input = 83;
Console.WriteLine("당신의 성적은 ");
if ( input > 90 || input <= 100)
{
Console.WriteLine("A입니다.");
}
else if ( input > 80 || input <= 90)
{
Console.WriteLine("B입니다.");
}
else if ( input > 70 || input <= 80 )
{
Console.WriteLine("C입니다.");
}
else if ( input > 60 || input <= 70)
{
Console.WriteLine("D입니다.");
}
else
{
Console.WriteLine("F입니다.");
}
}
}
}
switch문으로 일일히 쓰는 것보다 if문을 활용한 범위를 쓰는 것이 더 깔끔합니다. 물론 더 다양한 형태로 사용할 수도 있습니다. 위의 코드는 하나의 예시일 뿐입니다.
if문과 switch문의 차이는 위와 같은 차이점이 있으며 보통 정수 혹은 딱딱 떨어지는 스위치를 누르는 것과 비슷하게 적용한다면 switch문이 유리하며, 특정 범위와 같은 범주라면 if문이 유리합니다.
이는 프로그래머의 성향일 뿐 정해진 답은 없습니다.
다만 좋은 프로그래밍은 누가보더라도 '가독성'이 좋은 코드입니다. 한 눈에 읽히는 것이 가장 좋습니다.
항상 중요한 것은 실습을 통해 둘 사이의 차이점을 이해하고 적절한 상황에 적절한 도구를 사용하는 것이겠죠?