if~else문 (만약에~, 그렇지 않으면~)
오늘은 조건문에 대해서 알아보도록 하겠습니다. 여기서 조건이란 사전적 의미 그대로 ‘어떤 일을 이루게 하거나 이루지 못하게 하기 위하여 갖추어야 할 상태나 요소’라는 뜻을 지니고 있습니다. 프로그래밍에서 프로그램 흐름을 조건에 따라 실행시키는게 바로 우리가 배울 ‘조건문’입니다. 우선 if문 부터 배워보도록 하겠습니다. 아래는 if문의 기본 구성입니다.
if (조건식) { // 조건이 참일 경우 실행될 문장 }
이 예제의 조건식에서 true 또는 false를 반환하는 논리 연산자나 관계 연산자가 자주 등장합니다. 조건식에 올 수 있는건 true 또는 false의 값을 가지는 bool 형식이여야 합니다. 예를 들어, 아래의 조건을 한번 살펴봅시다.
if (a > b) { Console.WriteLine("a가 b보다 큽니다."); }
a가 b보다 클 경우에 조건식은 참(true)이 되고, 그 영역의 문장을 실행시킵니다. 만약에 b가 a보다 크다면 거짓(false)이 되어 이 조건문은 무시해버리고 넘어가버리겠죠.
무엇보다 확실히 이해하려면 이론보다는 경험이 낫습니다. 아래는 if문을 사용하여 a와 b 중 무엇이 더 큰지 가려내는 예제입니다. 직접 작성하시고 다른 방법으로도 응용해보시는것을 권장합니다.
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace ConsoleApplication1 { class Program { static void Main(string[] args) { int a = 50; int b = 51; if (a < b) // 참고: 실행될 문장이 한줄이라면 괄호가 없어도 됨. Console.WriteLine("b가 a보다 큽니다."); if (a > b) Console.WriteLine("a가 b보다 큽니다."); } } }
b가 a보다 큽니다. 계속하려면 아무 키나 누르십시오 . . .
코드를 간단히 살펴보자면, 정수형 변수 a와 b라는 변수가 선언되고 그와 동시에 50과 51이란 값으로 각각 초기화 되었습니다. 그 다음에 if문이 등장하여 a와 b의 크기를 비교하는 연산자가 조건식 내에 등장합니다. b(51)이 a(50)보다 크므로 결과에서 “b가 a보다 큽니다.”라고 출력된 것입니다.
위의 코드를 대충 보기엔 코드에 아무런 문제가 없습니다. 그런데 15행과 17행에 쓰인 2개의 if문은 사실상 올바르지 못한 조건문의 사용이라 볼 수 있습니다. b가 a보다 크다면 a가 b보다 작다는 말이 됩니다. 즉, b가 a보다 크다면 a가 b보다 큰지 아닌지 가려내는 17행의 if문은 쓸모가 없습니다. (CLR이 두개의 조건 검사를 수행하는 것과 같음)
그럼 어떻게 해야 할까요? 바로 else문을 이용하시면 이를 쉽게 해결하실 수 있습니다. else문은 ‘그렇지 않으면~’ 발생하는 영역입니다. 만약에 a < b가 거짓이라면 else문 내의 문장이 실행되겠죠. else문의 기본적인 사용 형태는 아래와 같습니다.
if (조건식) { // 참일 경우에 실행될 문장 } else { // 위의 조건식에 아무것도 해당하지 않을때 실행될 문장 }
아래는 17행의 if문을 else문으로 변경하여 작성한 예제입니다.
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace ConsoleApplication1 { class Program { static void Main(string[] args) { int a = 50; int b = 51; if (a < b) Console.WriteLine("b가 a보다 큽니다."); else Console.WriteLine("a가 b보다 큽니다."); } } }
위 코드는 정상적으로 제 기능을 수행하고 있는것처럼 보이나 사실상 문제가 있습니다. 15행의 조건식인 a < b를 역으로 바꾸게 되면 a >= b가 됩니다. 지금 저 코드에서는 a와 b가 서로 같아도 “a가 b보다 큽니다”가 출력됩니다. 이것은 else if문을 사용하면 쉽게 해결할 수 있습니다. 참고로 else if는 if문에 종속적이므로 else if문이 등장하기전 if문이 반드시 등장해야 합니다. 아래는 else if문의 기본적인 사용 형식입니다.
if (조건식) { // 참일 경우에 실행될 문장 } else if (조건식) { // 참일 경우에 실행될 문장 } else { // 위의 조건식에 아무것도 해당하지 않을때 실행될 문장 }
아래는 if문과 else문 사이에 else if문을 추가하여 재작성한 예제입니다.
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace ConsoleApplication1 { class Program { static void Main(string[] args) { int a = 50; int b = 50; if (a < b) // a가 b보다 작을 경우! Console.WriteLine("b가 a보다 큽니다."); else if (a == b) // a와 b가 같을 경우! Console.WriteLine("a와 b는 서로 같습니다."); else // 그 외의 경우! Console.WriteLine("a가 b보다 큽니다."); } } }
a와 b는 서로 같습니다. 계속하려면 아무 키나 누르십시오 . . .
이제 정상적으로 결과가 출력되는것을 확인하실 수 있습니다. 그리고 한가지 더 알아두셔야 할게 있는데, 그것은 바로 if문의 중첩입니다. 중첩은 나중에 배울 반복문(for, while~)에서 자주 사용됩니다. 아래는 if문의 중첩 예제입니다.
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace ConsoleApplication1 { class Program { static void Main(string[] args) { int a = 50; if (a > 0) { Console.WriteLine("a는 양수입니다."); if (a > 30) Console.WriteLine("a는 30보다 큽니다."); } else Console.WriteLine("a는 양수가 아닙니다."); } } }
a는 양수입니다. a는 30보다 큽니다. 계속하려면 아무 키나 누르십시오 . . .
코드를 보면, if문 내에 또다시 if문이 사용되신 것을 보실 수 있습니다. if문은 꼭 두번이 아니고, 여러번 중첩이 가능합니다. 만약에 “a는 30보다 큽니다.”라는 문장이 출력되려면 a는 0보다 커야하며 30보다도 커야합니다. 만약에 0보다 크고 30보다 작다면 “a는 30보다 큽니다.”라는 문장이 출력되지 않겠죠. 이해되셨나요?
switch, label, break
이제 switch문에 대해 배워보도록 하겠습니다. switch문은 if문과 달리 여러개의 조건식의 결과를 검사할때 사용됩니다. 기본적인 switch문의 형태는 아래와 같습니다.
switch (조건식) { case 상수: // 만약 조건식의 결과가 이 상수와 같다면! // 실행될 코드 break; // 탈출! case 상수: // 실행될 코드 break; ... }
이해를 돕기위해 예를 하나 들겠습니다. 만약에 조건식에 a%2가 온다고 하고 a의 값이 13이며, 이 a가 홀수인지 짝수인지 구별하는 프로그램을 만들어 본다고 칩시다.
switch(a % 2) { case 0: Console.WriteLine("짝수입니다!"); break; case 1: Console.WriteLine("홀수입니다!"); break; }
이 경우에는 a를 2로 나눴을 때 나머지 값이 0이냐, 1이냐에 따라 나뉘는데 만약 0이라면 case 0:으로 이동하여 그 영역에 있는 문장을 실행시키고 break문을 만나 탈출합니다. 1이면 case 1:로 이동하겠죠. 참고로, switch문은 정수 형식과 문자, 문자열 형식만을 지원한다는 것을 알아두시면 좋겠습니다.
여기서 코드에 쓰인 break문이 어떤 역할을 하는지 모르시는 분이 있으신데, break문에 대한 이해를 위해 break를 주석 처리하고 아래 코드를 컴파일 하게되면 다음과 같은 오류가 발생합니다.
오류 1 한 case 레이블('case 0:')에서 다른 case 레이블로 제어를 이동할 수 없습니다. C:\Users\su6net\AppData\Local\Temporary Projects\ConsoleApplication1\Program.cs 16 17 ConsoleApplication1 ...
C언어에서는 break문이 없으면 그 아래 영역까지 모조리 실행되는 참사가 일어났으나, C#에서는 break문이 없다면 다른 레이블로 이동할 수 없다며 오류를 내보냅니다. 이 break문은 우리가 작성한 코드를 실행하고 그 영역을 빠져나오기 위해서 작성해주는 문장입니다. 나중에 반복문에서도 등장합니다.
아래는 문자열을 검사하여 해당 부분으로 이동하는 예제입니다.
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace ConsoleApplication1 { class Program { static void Main(string[] args) { String day = "수"; switch (day) { case "일": Console.WriteLine("일요일"); break; case "월": Console.WriteLine("월요일"); break; case "화": Console.WriteLine("화요일"); break; case "수": Console.WriteLine("수요일"); break; case "목": Console.WriteLine("목요일"); break; case "금": Console.WriteLine("금요일"); break; case "토": Console.WriteLine("토요일"); break; default: Console.WriteLine("아무 요일에도 해당하지 않습니다."); break; } } } }
day가 "수" 일때> 수요일 계속하려면 아무 키나 누르십시오 . . . day가 아무것도 해당하지 않을때> 아무 요일에도 해당하지 않습니다. 계속하려면 아무 키나 누르십시오 . . .
코드를 보시면, 문자열 변수 day에 담긴 값에 따라 switch문으로 인해 해당 부분으로 이동합니다. 만약에 “수”가 아닌 “가”처럼 해당하는 부분이 없을 경우에는 default: 영역으로 이동합니다. 여기서 default는 if문의 else와 비슷하다 생각하시면 이해하기 쉽습니다. 말 그대로 기본이 되는 영역이죠. 해당되는 영역이 없으면 이 기본 영역으로 이동하게 되는것 입니다.