이전 예제에서 우리는 실행될 C# code를 결정하는 논리표현식을 구현해 보았습니다. 물론 조건문과 결이 다르긴 하지만 흐름제어의 또 다른 측면으로 loop문을 정의하는 것을 포함할 수 있는데 loop문을 간단하게 정의하자면 특정 조건이 만족될 때까지 반복적으로 실행되는 일련의 C#문이라고 할 수 있습니다.
1. loop가 왜 필요할까?
Computer는 반복적인 작업을 연속해서, 그것도 아주 빠르게 수행할 수 있지만 Program을 통해 Computer가 무엇을 할지 알려주지 않으면 역으로 아무것도 하지 않을 것입니다. Loop문은 Computer에게 일련의 작업이 반복되어야 함을 말해줄 수 있는 주요 mechanism에 해당하는데 예를 들어 특정 정수형변수가 단순하게 10번 정도의 덧셈이 스스로에게 수행돼야 한다면 이를 수행하기 위해 다음과 같은 C# code를 작성할 수 있을 것입니다.
int i = 1;
i += i;
i += i;
i += i;
i += i;
i += i;
i += i;
i += i;
i += i;
i += i;
i += i;
위 예제는 다소 지루하기는 하지만 어쨌건 잘 작동하기는 할것입니다. 하지만 만약 이 과정이 100번 정도, 아니면 1000번 정도 반복되어야 한다면 그때는 어떻까요? 위와 같은 방식으로 C# code를 구현하는 것은 아마도 불가능할 것입니다. 바로 이러한 상황이 for loop문이 필요한 상황일 수 있습니다.
for문의 문법은 다음과 같습니다.
for (초기자; 조건식; loop표현식)
{
실행문;
}
초기자는 변수와 같은 것을 초기화 하는 부분이며 보통
j = 0;
과 같이 지정됩니다.
상기 code에서는 counter변수로 변수 j를 사용하고자 하며 이 변수를 0으로 초기화하고 있습니다. 그러나 변수 j가 미리 선언되어 있지 않다면 for문의 일부로서 다음과 같이 변수를 선언함과 동시에 초기화를 구현할 수 있습니다.
int j = 0;
조건식은 loop가 필요한 만큼의 수만큼 반복적으로 수행되었는지를 확인하는 부분입니다. 예를 들어 loop가 100번 정도만 수행되어야 한다면 다음과 같이 조건식을 지정할 수 있습니다.
j < 100;
초기자에서 j는 0으로 지정되었기에 조건식을 100보다 작게 지정하면 0부터 99번(100번)이 되므로 유효한 조건이라고 할 수 있습니다.
마지막으로 loop표현식은 지정한 변수에서 수행되어야 하는 동작을 지정합니다. 예를 들어 j변수가 1씩 증가되어야 한다면 다음과 같이 지정할 수 있습니다.
j++;
loop가 반복될때마다 실행되어야 하는 문은 loop의 중괄호({})안에서 작성됩니다. 이 모든 요소들을 결합하게 되면 비로로 상기 예제로 입금 된 동작을 수행하는 loop문을 아래와 같이 만들 수 있게 됩니다.
int i = 1;
for (int j = 0; i < 10; i++) {
i += i;
Console.WriteLine($"i = {i}");
}
2. loop변수의 범위
loop문에서 변수를 사용할때 기억해야 할 점은 loop문의 본문 안에서 선언되는 모든 변수는 loop문 내부에서만 사용될 수 있다는 것입니다. 예를 들어 아래 예제와 같이 x라는 변수가 for loop의 본문 안에서 정의되었다면 해당 변수의 존재는 loop문이 끝나는 순간 소멸되므로 더 이상 사용될 수 없게 됩니다.
for (int i = 0; i < 10; i++)
{
int x = 0; //for문 안에서만 유효
x += 1;
}
Console.WriteLine($"{x}");
3. 무한 loop 만들기
무한히 반복을 수행할 for문은 for(;;) 문법을 통해 만들 수 있습니다. 예를 들어 아래 예제는 사용자가 Program을 고의적으로 종료시키거나 Computer를 종료, 혹은 재시작할때까지 'Hello World C#'이라는 문구를 계속해서 출력할 것입니다.
for (;;)
{
Console.WriteLine("Hello World C#");
}
만약 위 예제의 동작을 실제로 확인하고자 한다면 아래 화면과 같이 VS Code의 Stop button을 통해 실행을 중지할 수 있습니다.
4. for loop 빠져나가기
조건문이 존재하는 for문도 마찬가지지만 특히 무한 loop를 만들때 특정 조건에 해당하는 경우 for문을 빠져나가도록 해야 하는 경우가 있습니다. 이를 테면 Program에서 Network연결을 위해 계속적으로 Network Socket의 상태를 확인하는 경우 연결이 이루어짐이 확인된다면 연결상태를 확인하는 무한처리를 빠져나올 수 있어야 하고 그 뒤에 다른 작업을 수행할 필요가 있을 것입니다.
loop문을 고의적으로 중단시키기 위해 C#에서는 break문을 제공하고 있으며 이를 통해 현재 loop를 빠져나온뒤 loop이후의 code실행을 계속 진행시킬 수 있습니다.
int i = 10;
for (int j = 0; j < 100; j++)
{
i += i;
Console.WriteLine($"i = {i.ToString()}");
if (i > 50)
break;
}
상기 예제에서 loop문은 i의 값이 50이하면 실행을 계속할 것이며 50을 초과하게 되면 loop는 실행을 중지할 것입니다.
5. for loop 중첩하기
지금까지는 단 하나의 for loop문이 사용된 경우만을 살펴봤습니다. 하지만 필요에 따라서는 아래 예제와 같이 loop내부에 다른 loop문이 존재하는 중첩된 for loop문을 사용할 수 있습니다.
for (int i = 0; i < 10; i++) {
Console.WriteLine($"i = {i}");
for (int j = 0; j < 10; j++) {
Console.WriteLine($"j = {j}");
}
}
상기 예제는 i변수에 대한 loop를 10번 반복할 것이며 그때마다 i의 값을 표시할 것입니다. 그러면서 i가 한번 반복될 때마다 j변수에 대한 loop를 10번 반복하면서 j값을 표시하게 됩니다.
예제상에서는 두번의 loop가 중첩된 수준을 보여주고 있지만 필요하다면 더 많은 수준으로 중첩이 가능합니다. 다만 중첩 수준이 너무 많으면 읽기 어려운 code가 될 수 있으므로 주의해야 합니다.
6. 중첩된 loop문 중단하기
중첩된 loop문을 중단시키고자 할때 알아야 할 중요한 것은 현재 수준에서의 loop에서만 빠져나오게 된다는 것입니다. 예를 들어 아래 예제는 j가 5가 될 때 중첩된 loop 중 현재 반복하고 있는 부분에서만 빠져나오게 되므로 외부의 중첩된 다른 loop는 계속해서 반복을 실행하게 됩니다.
for (i = 0; i < 10; i++) {
Console.WriteLine($"i = {i}");
for (int j = 0; j < 10; j++) {
if (j == 5)
break;
Console.WriteLine($"j = {j}");
}
}
7. for loop문 실행 건너뛰기
loop문을 사용할때 또 다른 유용한 구문으로 continue문이 있습니다. loop내부에서 continue문이 발견되면 뒤에 남은 code의 실행을 모두 생략하고 loop의 상단에서부터 다시 실행을 시작하게 됩니다. 이러한 방식을 통해 우리는 아래와 같은 예제처럼 1과 9 사이에 짝수만을 출력하도록 for loop문을 구성할 수 있습니다.
for (int i = 1; i < 10; i++)
{
if ((i % 2) != 0)
continue;
Console.WriteLine($"i = {i}");
}
위 예제에서는 i를 2로 나누어 0이 남지 않으면 continue문을 실행하게 되고 for loop문의 상단으로 실행시점이 이동하게 됩니다. 때문에 바로 뒤에 있는 Console.WriteLine...문은 우회되어 i값을 출력하는 부분은 실행되지 않을 것이고 결과적으로 Console에는 짝수만이 표시됩니다.
8. foreach문
foreach문은 collection에서 item을 열거하는데 사용되며 간단하게 순회처리할 수 있는 option을 제공합니다.
foreach loop의 문법은 아래와 같습니다.
foreach [item변수] in [collection]
{
//코드실행본문
}
위 문법에서 [item변수]는 loop를 열거하는 개체(collection)에서 현재 item을 포함하는 상수이름이며 loop의 본문 code에서는 loop cycle에서 현재 item을 참조하기 위해 해당 이름을 사용할 수 있습니다. [collection]은 열거하기 위한 개체자체를 나타내는데 문자열이나 숫자값으로 이루어진 단순 배열이 될 수 있고 복잡한 개체를 내장한 List가 될 수 있습니다. Collection이 되려면 item을 열거하는 특정 interface를 상속함으로써 이루어지는데 해당 관해서는 추후에 자세히 알아볼 것입니다.
아래 예제에서는 foreach문을 사용하기 위한 일반적인 방법을 나타내고 있습니다.
int[] numbers = { 1, 2, 3, 4, 5 };
foreach (int number in numbers)
{
Console.WriteLine($"{number} ");
}
loop가 시작될때 현재 item은 number라는 상수이름에 할당됩니다. 즉, numbers라는 collection의 모든 요소가 이 상수를 통해 할당이 이루어지고 동시에 순회가 시작되는 것입니다. 그리고 loop의 본문에서는 Console을 통해 number라는 상수를 통하여 할당된 현재 값을 나타냅니다.
이와 같이 foreach문은 array나 List와 처럼 collection을 순회하기에 유용한 반복문이라고 할 수 있습니다.
'.NET > C#' 카테고리의 다른 글
[C# 13과 .NET 9] C# switch문 - 9 (0) | 2025.01.08 |
---|---|
[C# 13과 .NET 9] C# 흐름제어개념과 if문 - 8 (0) | 2025.01.06 |
[C# 13과 .NET 9] C# 연산자와 표현식 - 7 (2) | 2025.01.03 |
[C# 13과 .NET 9] C# 변수와 상수 - 6 (0) | 2024.12.05 |
[C# 13과 .NET 9] VSCode에서 App생성하기 - 5 (0) | 2024.12.05 |