반복 문 -
반복 문은 문 또는 문 블록을 반복적으로 실행합니다. 지정된 Boolean 표현식이 for
으로 계산되는 동안 문은 본문을 실행합니다.
이 문은foreach
컬렉션의 요소를 열거하고 컬렉션의 각 요소에 대해 해당 본문을 실행합니다.
do
문은 조건에 따라 본문을 한 번 이상 실행합니다.
이 문은while
조건부로 본문을 0번 이상 실행합니다.
반복 문의 본문 내의 어느 지점에서든 문을 사용하여 break
루프를 중단할 수 있습니다.
continue
명령문을 사용하여 루프에서 다음 반복으로 넘어갈 수 있습니다.
for
선언문
지정된 부울 식이 for
로 평가되는 동안 true
문 또는 문 블록이 실행됩니다. 다음 예제는 정수 카운터가 3보다 작은 동안 본문을 실행하는 for
문을 보여줍니다.
for (int i = 0; i < 3; i++)
{
Console.Write(i);
}
// Output:
// 012
for
문의 요소를 앞의 예제에서 보여줍니다.
루프를 입력하기 전에 한 번만 실행되는 이니셜라이저 섹션입니다. 일반적으로 해당 섹션에서 로컬 루프 변수를 선언하고 초기화합니다. 선언된 변수는
for
문장 외부에서 접근할 수 없습니다.앞의 예제에서 이니셜라이저 섹션은 정수 카운터 변수를 선언하고 초기화합니다.
int i = 0
루프의 다음 반복을 실행해야 하는지 여부를 결정하는 조건 섹션입니다.
true
로 평가되거나 존재하지 않으면 다음 반복이 실행되고, 그렇지 않으면 루프가 종료됩니다. 조건 섹션은 부울 식이어야 합니다.앞의 예제의 조건 섹션에서는 카운터 값이 3보다 작은지 확인합니다.
i < 3
루프 본문을 실행할 때마다 발생하는 일을 정의하는 반복기 섹션입니다.
앞의 예제에서 반복기 섹션은 카운터를 증가합니다.
i++
루프의 본문은 하나의 문장이거나 여러 문장으로 이루어진 블록이어야 합니다.
반복기 섹션에는 쉼표로 구분된 다음 문 식이 0개 이상 포함될 수 있습니다.
- 접두사 또는 접미사 증분 식(예:
++i
또는i++
). - 접두사 또는 접미사 감소 식(예:
--i
또는i--
) - 숙제
- 메서드 호출
-
await
표현 - 연산자를 사용하여
new
개체 만들기
이니셜라이저 섹션에서 루프 변수를 선언하지 않으면 이니셜라이저 섹션의 이전 목록에서 0개 이상의 식을 사용할 수 있습니다. 다음 예제에서는 이니셜라이저 및 반복기 섹션의 몇 가지 덜 일반적인 사용법을 보여 줍니다. 이니셜라이저 섹션의 외부 변수에 값을 할당하고, 이니셜라이저와 반복기 섹션 모두에서 메서드를 호출하고, 반복기 섹션에서 두 변수의 값을 변경합니다.
int i;
int j = 3;
for (i = 0, Console.WriteLine($"Start: i={i}, j={j}"); i < j; i++, j--, Console.WriteLine($"Step: i={i}, j={j}"))
{
//...
}
// Output:
// Start: i=0, j=3
// Step: i=1, j=2
// Step: i=2, j=1
명령문의 모든 섹션은 for
선택 사항입니다. 예를 들어 다음 코드는 무한 for
루프를 정의합니다.
for ( ; ; )
{
//...
}
foreach
선언문
foreach
문은 System.Collections.IEnumerable 또는 System.Collections.Generic.IEnumerable<T> 인터페이스를 구현하는 형식의 인스턴스를 사용할 때 각 요소에 대해 문 또는 문 블록을 실행하며, 다음 예제는 이를 보여줍니다.
List<int> fibNumbers = new() { 0, 1, 1, 2, 3, 5, 8, 13 };
foreach (int element in fibNumbers)
{
Console.Write($"{element} ");
}
// Output:
// 0 1 1 2 3 5 8 13
진술은 foreach
해당 유형으로 제한되지 않습니다. 다음 조건을 충족하는 모든 형식의 인스턴스와 함께 사용할 수 있습니다.
- 형식에는 public 매개 변수 없는
GetEnumerator
메서드가 있습니다. 메서드는GetEnumerator
형식의 확장 메서드일 수 있습니다. - 메서드의
GetEnumerator
반환 형식에는 publicCurrent
속성과 반환 형식이MoveNext
인 public 매개 변수가 없는bool
메서드가 있습니다.
다음 예제에서는 어떤 인터페이스도 구현하지 않는 foreach
형식의 인스턴스와 함께 System.Span<T> 문을 사용합니다.
Span<int> numbers = [3, 14, 15, 92, 6];
foreach (int number in numbers)
{
Console.Write($"{number} ");
}
// Output:
// 3 14 15 92 6
열거자의 Current
속성이 참조 반환 값 (ref T
컬렉션 T
요소의 형식)을 반환하는 경우 다음 예제와 같이 반복 변수를 ref
또는 ref readonly
한정자로 선언할 수 있습니다.
Span<int> storage = stackalloc int[10];
int num = 0;
foreach (ref int item in storage)
{
item = num++;
}
foreach (ref readonly var item in storage)
{
Console.Write($"{item} ");
}
// Output:
// 0 1 2 3 4 5 6 7 8 9
원본 컬렉션 foreach
이 비어 있는 경우, foreach
문의 본문은 실행되지 않고 건너뜁니다.
foreach
문이 null
에 적용되면 NullReferenceException가 발생합니다.
비동기 반복문 await foreach
비동기 데이터 스트림, 즉 await foreach
인터페이스를 구현하는 컬렉션 형식을 소비하기 위해 IAsyncEnumerable<T> 문을 사용할 수 있습니다. 루프의 각 반복은 다음 요소가 비동기적으로 검색되는 동안 일시 중단될 수 있습니다. 다음 예제에서는 await foreach
구문을 사용하는 방법을 보여줍니다.
await foreach (var item in GenerateSequenceAsync())
{
Console.WriteLine(item);
}
await foreach
명령문은 다음 조건을 충족하는 모든 형식의 인스턴스와 함께 사용할 수 있습니다.
- 형식에는 public 매개 변수 없는
GetAsyncEnumerator
메서드가 있습니다. 이 메서드는 형식의 확장 메서드일 수 있습니다. - 메서드의
GetAsyncEnumerator
반환 형식에는 publicCurrent
속성과 반환 형식이MoveNextAsync
또는Task<bool>
이며 다른 대기 가능한 형식이 어떤 경우에도 있을 수 있는 public 매개변수 없는ValueTask<bool>
메서드가 포함되어 있습니다. 이 대기 가능한 형식의 awaiterGetResult
메서드는bool
값을 반환합니다.
기본적으로 스트림 요소는 캡처된 컨텍스트에서 처리됩니다. 컨텍스트 캡처를 사용하지 않도록 설정하려면 확장 메서드를 TaskAsyncEnumerableExtensions.ConfigureAwait 사용합니다. 동기화 컨텍스트 및 현재 컨텍스트 캡처에 대한 자세한 내용은 작업 기반 비동기 패턴 소비를 참조하세요. 비동기 스트림에 대한 자세한 내용은 비동기 스트림 자습서를 참조하세요.
반복 변수의 형식
다음 코드에서 보여주는 것처럼 컴파일러가 var
문에서 반복 변수의 형식을 를 사용하여 유추할 수 있습니다.
foreach (var item in collection) { }
비고
nullable 인식 컨텍스트가 사용되는지 여부 및 초기화 식의 var
형식이 참조 형식인지 여부에 따라 컴파일러에서 형식을 null 허용 참조 형식으로 유추할 수 있습니다.
자세한 내용은 암시적으로 형식화된 지역 변수를 참조하세요.
다음 코드와 같이 반복 변수의 형식을 명시적으로 지정할 수도 있습니다.
IEnumerable<T> collection = new T[5];
foreach (V item in collection) { }
이전 양식에서 컬렉션 요소의 형식 T
은 반복 변수의 형식 V
으로 암시적 또는 명시적으로 변환할 수 있어야 합니다. 런타임에 T
에서 V
로의 명시적 변환이 실패할 경우, foreach
문은 InvalidCastException를 throw합니다. 예를 들어, T
가 봉인되지 않은 클래스 유형인 경우 V
은 T
이(가) 구현하지 않는 인터페이스 유형일 수도 있습니다. 런타임 시, 컬렉션 요소의 형식은 T
에서 파생된 것이며 실제로 V
를 구현한 요소일 수 있습니다. 그렇지 않은 경우 InvalidCastException 발생됩니다.
do
선언문
지정된 부울 식이 do
로 평가되는 동안 true
문 또는 문 블록이 실행됩니다. 해당 식은 루프를 실행할 때마다 평가되므로 루프는 do
하나 이상 실행됩니다.
do
루프는 while
루프와 다르며, 해당 루프는 0회 이상 실행됩니다.
다음 예는 do
문의 사용 사례를 보여 줍니다.
int n = 0;
do
{
Console.Write(n);
n++;
} while (n < 5);
// Output:
// 01234
while
선언문
지정된 부울 식이 while
로 평가되는 동안 true
문 또는 문 블록이 실행됩니다. 해당 식은 루프의 각 실행 전에 평가되므로 루프는 while
0회 이상 실행됩니다. 루프는 while
루프와do
다르며 한 번 이상 실행됩니다.
다음 예는 while
문의 사용 사례를 보여 줍니다.
int n = 0;
while (n < 5)
{
Console.Write(n);
n++;
}
// Output:
// 01234
C# 언어 사양
자세한 내용은 C# 언어 사양의 다음 섹션을 참조하세요.
이러한 기능에 대한 자세한 내용은 다음 기능 제안 정보를 참조하세요.
참고하십시오
- 선언
- 반복기
.NET