continue 문법

continue 문법 (about_Continue)

continue 문은 프로그램 흐름을 루프, switch, trap 문의 맨 위로 즉시 되돌려 보내는 방법을 설명해요.

출처: Microsoft Learn — about_Continue

본문

간단한 설명 (Short description)

continue 문은 프로그램 흐름을 루프, switch 문, 또는 trap 문의 맨 위로 즉시 되돌려 주는 역할을 해요.

자세한 설명 (Long description)

continue 문은 현재 제어 블록을 완전히 빠져나가는 대신, 블록을 빠져나가되 실행은 계속 이어가는 방법을 제공해요. 이 문은 레이블(label)을 지원해요. 레이블은 스크립트에서 특정 문에 붙여 주는 이름이에요.

루프에서 continue 사용하기

레이블이 없는 continue 문은 for, foreach, do, 혹은 while 문이 제어하는 가장 안쪽 루프의 맨 위로 프로그램 흐름을 즉시 되돌려 줘요. 루프의 현재 반복(iteration)은 종료되고, 루프는 다음 반복부터 이어서 진행돼요.

아래 예시에서는 $ctr 변수 값이 5일 때 프로그램 흐름이 while 루프의 맨 위로 돌아가요. 그 결과 1부터 10까지의 숫자 중 5만 제외하고 모두 화면에 출력돼요:

while ($ctr -lt 10)
{
    $ctr += 1
    if ($ctr -eq 5)
    {
        continue
    }

    Write-Host -Object $ctr
}

for 루프를 사용할 때는 <Repeat> 문 다음에 <Condition> 검사로 실행이 이어져요. 아래 예시에서는 continue 키워드 뒤에서 $i를 감소시키기 때문에 무한 루프가 생기지 않아요:

#   <Init>  <Condition> <Repeat>
for ($i = 0; $i -lt 10; $i++)
{
    Write-Host -Object $i
    if ($i -eq 5)
    {
        continue
        # Will not result in an infinite loop.
        $i--
    }
}

루프에서 레이블이 붙은 continue 사용하기

레이블이 붙은 continue 문은 해당 반복의 실행을 종료하고, 대상으로 지정한 바깥쪽 반복이나 switch 문의 레이블로 제어권을 옮겨 줘요.

아래 예시에서는 $conditionTrue일 때 가장 안쪽 for 루프가 종료되고, labelB에서 두 번째 for 루프로 반복이 이어져요:

:labelA for ($i = 1; $i -le 10; $i++) {
    :labelB for ($j = 1; $j -le 10; $j++) {
        :labelC for ($k = 1; $k -le 10; $k++) {
            if ($condition) {
                continue labelB
            } else {
                $condition = Update-Condition
            }
        }
    }
}

switch 문에서 continue 사용하기

switch 안의 레이블이 없는 continue 문은 현재 switch 반복의 실행을 종료하고, 다음 입력 항목을 받기 위해 switch의 맨 위로 제어권을 옮겨 줘요.

입력 항목이 하나뿐이면 continueswitch 문 전체를 빠져나가요. switch 입력이 컬렉션이면, switch는 컬렉션의 각 요소를 하나씩 검사해요. 이때 continue는 현재 반복을 종료하고 switch는 다음 요소로 이어서 진행돼요:

switch (1,2,3) {
  2 { continue }  # moves on to the next element, 3
  default { $_ }
}
1
3

trap 문에서 continue 사용하기

trap 문 본문에서 마지막으로 실행된 문이 continue라면, 잡힌 오류는 조용히 무시되고, trap을 발생시킨 문 바로 다음에 오는 문부터 실행이 이어져요.

루프, switch, trap 밖에서는 continue를 사용하지 마세요

continue를 직접 지원하는 구조(루프, switch, trap) 밖에서 continue를 사용하면, PowerShell은 호출 스택을 거슬러 올라가며 감싸고 있는 구조를 찾아봐요. 그런 구조를 찾지 못하면 현재 runspace가 조용히 종료돼 버려요.

즉, 실수로 continue를 지원하는 구조 밖에서 continue를 사용한 함수나 스크립트는, 자신의 호출자까지 의도치 않게 종료시킬 수 있어요.

ForEach-Object 스크립트블록 같은 파이프라인 안에서 continue를 사용하면 파이프라인만 종료되는 게 아니라 runspace 전체가 종료될 수도 있어요.

더 알아보기