1. 분기문 (selection statements)
● if
if는 분기문이라 하여 말 그대로 Boolean 식을 평가한 후 처리를 분기하는 제어문입니다.
if (Boolean식)
{
}
else if (Boolean식)
{
}
else
{
}
if의 Boolean식이 True라면 중괄호({})안의 코드를 실행하게 됩니다. else if나 else는 선택적이며 if의 결과가 false인 경우 실행될 수 있습니다. 이때 else if문은 다른 if문에서 의존하지 않는 새로운 Boolean 식을 평가할 수 있습니다. 또한 if문은 필요하다면 여러 개로 중첩될 수 있습니다.
if문을 비롯한 다른 제어문이나 반복문에도 해당될 수 있는 내용으로 실행되는 구문의 영역이 한 줄에 불과하다면 중괄호({})는 생략될 수 있습니다.
int a = 10;
if (a == 10)
Console.WriteLine("a는 10입니다.");
C#7.0부터는 패턴 매칭이라는 새로운 기능이 추가되었는데 이 패턴 매칭을 if문에 적용해 보면 다음과 같이 처리할 수 있습니다.
object o = "10";
if (o is int i)
Console.WriteLine($"o의 값은 {i}입니다.");
else
Console.WriteLine("o는 int가 아님");
//o는 int가 아님
패턴 매칭은 is연산자와 함께 사용되며 예제에서는 o가 int형식인 경우 해당 값을 i에 저장하도록 하는 패턴 매칭을 구현하고 있습니다.
실제 o는 "10"이라는 문자열을 가지고 있으므로 else이하 구문이 실행되지만 "10"대신 10 값을 할당하면 패턴 매칭 조건에서 True값을 가질 수 있게 됩니다.
● switch
switch는 if와 달리 하나의 단일식을 여러 개의 가능한 case문으로 비교합니다. 따라서 아래 switch는 i의 값을 여러개의 case문과 비교하여 해당하는 값으로 실행을 분기하게 됩니다.
int i = 3;
switch(i)
{
case 1:
Console.WriteLine("i는 1");
break;
case 2:
Console.WriteLine("i는 2");
goto case 4;
case 3:
Console.WriteLine("i는 3");
goto Etc;
case 4:
case 5:
Console.WriteLine("---");
break;
default:
Console.WriteLine("그 외");
break;
}
Etc:
Console.WriteLine("Goto-");
//i는 3
//Goto-
switch내부의 case는 반드시 ':'문자로 끝나야 하며 내부 포함되는 구문은 여러 줄이라 하더라도 중괄호({})사용을 필요로 하지 않습니다.(구문의 들여 쓰기를 명확히 하기 위해 일부러 중괄호({})를 사용하는 경우도 있습니다.)
case문의 종료는 통상 break;로 끝나야 하지만 필요하다면 goto case를 통해 다른 case문이나 goto [Label명]을 통해 다른 코드 영역으로 분기할 수 있으며 혹은 case4처럼 조건의 결과가 다른 case문과 겹치는 경우 이하 구문을 생략할 수도 있습니다.
또한 if문에서 언급했던 패턴 매칭은 동일한 방법으로 switch에도 적용할 수 있습니다.
object o = "3";
switch(o)
{
case int i:
Console.WriteLine($"o의 값은 {i}입니다.");
break;
case string s:
Console.WriteLine($"o의 값은 문자열 {s}입니다.");
break;
default:
Console.WriteLine("그 외");
break;
}
//o의 값은 문자열 3입니다.
예제에서 case는 실제값을 부여하지 않고 패턴 매칭을 구현하였습니다. 참고로 패턴 매칭에서 case는 when을 사용해 추가적인 조건을 붙여 주는 것도 가능합니다.
object o = 4;
switch(o)
{
case int i when i == 3:
Console.WriteLine("o의 값은 3입니다.");
break;
case int i when i == 4:
Console.WriteLine("o의 값은 4입니다.");
break;
case string s:
Console.WriteLine($"o의 값은 문자열 {s}입니다.");
break;
default:
Console.WriteLine("그 외");
break;
}
//o의 값은 4입니다.
따라서 위 예제는 o가 int로서 취급될 수 있는지를 판단함과 동시에 할당된 값을 확인하여 개별적으로 분기 처리를 수행하도록 합니다.
C# 8.0에 와서는 switch식이 도입되어 switch를 좀 더 간소화하는 방법으로 구현할 수 있게 되었습니다. 직전의 예제와 똑같은 동작을 실행하는 switch구문을 switch 식으로 대신하면 다음과 같이 구현할 수 있습니다.
string msg = o switch
{
int i when i == 3 => "o의 값은 3입니다.",
int i when i == 4 => "o의 값은 4입니다.",
string s => $"o의 값은 문자열 {s}입니다.",
_ => "그 외"
};
Console.WriteLine(msg);
//o의 값은 4입니다.
switch 식에서는 case와 break와 같은 구문이 사용되지 않으며 또한 default로 사용되던 부분은 _로 대체되었습니다.
3. 반복문
반복문은 통상 조건의 결과가 True이거나 Collection과 같은 다수의 item을 순회하는 동안 반복하는 구문을 말합니다.
● while
while문은 Boolean 식을 평가하여 이 결과가 True인 동안은 계속해서 반복을 수행합니다.
int i = 0;
while(i <= 10)
{
Console.WriteLine($"{i}");
++i;
}
/*
0
1
2
3
4
5
6
7
8
9
10
*/
예제에서 while은 i가 10과 같거나 10보다 작은 경우 내부의 구문을 반복하여 실행합니다.
● do while
while문과 동작 방식은 비슷하지만 while문이 시작부터 조건을 판단하는 반면 do while문은 최초 한 번은 조건과 무관하게 내부 구문을 실행한 뒤 그다음부터 조건을 판단한다는 차이가 있습니다.
int i = 0;
do
{
Console.WriteLine($"{i}");
++i;
}
while(i <= 10);
위 예제는 이전 예제와 결과는 동일합니다.
● for
for에서는 다음과 같은 식을 포함하므로 반복 처리를 좀 더 세분화하여 제어할 수 있습니다.
- 초기화 식 : 반복이 시작될 때 단 한번 실행되는 부분입니다.
- 조건 식 : 새로운 반복 처리를 시작할 때마다 반복을 계속 진행할지를 판단하기 위해 실행되는 부분입니다. 해당 조건이 False라면 반복을 중지합니다.
- 반복 식 : 매회 반복 처리가 종료될 때마다 실행되는 부분입니다.
for (int i = 0; i <= 10; i++)
{
Console.WriteLine(i);
}
이전 while예제와 실행결과는 완전히 동일합니다. 맨 먼저 'int i = 0'을 실행해 변수 i값을 초기화하고 그다음 'i <= 10'을 실행하여 내부 구문을 실행할지를 판단합니다. 내부 구문을 한번 실행하고 나면 'i++'를 실행해 변수 i값을 경신하게 되고 다시 'i <= 10'에서 조건을 판단하고 구문을 실행하고 나면 'i++'실행하는 순서로 for문이 작동하게 됩니다.
● foreach
foreach는 array나 list와 같은 collection의 item을 순회하는 데 사용되는 반복문입니다.
List<string> names = new() { "홍길동", "홍길순", "홍길영" };
foreach (var name in names)
{
Console.WriteLine(name);
}
/*
홍길동
홍길순
홍길영
*/
하지만 이때 순회대상이 되는 array나 collection은 읽기 전용이 됩니다. foreach로 순회되는 과정에서 새로운 요소가 추가되거나 기존 요소가 삭제되는 경우 예외를 일으킬 수 있으므로 주의가 필요합니다.
참고로 foreach에서 순회 가능한 형식은 아래 규칙을 따르는 형식이며
- 요소의 객체를 반환하는 GetEnumerator() 메서드를 가짐
- 반환된 객체는 Current라는 속성과 MoveNext라는 메서드를 가짐 (MoveNext는 다음 반환 가능한 요소가 있는 경우 true를 그렇지 않으면 false를 반환)
위의 속성과 메서드는 IEnumerable이나 IEnumerable <T> 인터페이스에서 구현하고 있습니다. 실제 compiler는 위와 같은 예제를 아래와 유사한 형태로 변환하여 처리하고 있습니다.
IEnumerator<string> e = names.GetEnumerator();
while(e.MoveNext())
{
string name = (string)e.Current;
Console.WriteLine(name);
}
'.NET > C#' 카테고리의 다른 글
[C#] 예외처리 (0) | 2022.06.24 |
---|---|
[C#] 형변환 (0) | 2022.06.24 |
[C#] 연산자 (0) | 2022.06.24 |
[C#] C# 개요 - 3. 기타 Console Application 관련 (0) | 2022.06.24 |
[C#] C# 개요 - 2. 변수 (0) | 2022.06.24 |