개요
PowerShell은 반복을 표현하는 네 가지 문(statement) — foreach, for, while, do— 을 제공한다. 15장에서 배운 ForEach-Object cmdlet은 파이프라인 객체를 하나씩 처리하는 도구였다면, 이 장의 foreach 문(키워드)은 언어 자체의 반복 구문으로 컬렉션 전체를 메모리에 올려놓고 순회한다는 점이 근본적으로 다르다.
정신 모델은 “컬렉션을 이미 다 갖고 있다면 foreach, 반복 횟수나 조건으로 직접 제어하고 싶다면 for/while/do“라는 것이다. 어떤 반복문이든 break(반복 전체 종료)와 continue(현재 반복만 건너뛰고 다음으로)로 흐름을 제어할 수 있다.
사용법
| |
종류
| 구문 | 조건 검사 시점 | 용도 |
|---|---|---|
foreach | — | 배열·컬렉션의 각 항목을 순회 |
for | 각 반복 시작 전 | 반복 횟수를 카운터로 직접 제어할 때 |
while | 각 반복 시작 전 | 조건이 참인 동안 반복(0번 실행될 수 있음) |
do...while | 각 반복이 끝난 뒤 | 최소 1번은 반드시 실행해야 할 때 |
do...until | 각 반복이 끝난 뒤(조건이 참이 되면 종료) | while의 반대 논리로 종료 조건을 표현할 때 |
예시
| |
주의사항·함정
foreach 문과 ForEach-Object cmdlet은 이름은 비슷해도 동작 방식이 다르다: foreach ($x in $collection)은 컬렉션 전체가 메모리에 이미 있어야 순회를 시작할 수 있는 반면, ForEach-Object는 10장에서 배운 파이프라인 방식대로 객체가 하나씩 도착하는 대로 즉시 처리한다. 매우 큰 컬렉션을 다룰 때는 ForEach-Object가 메모리를 더 적게 쓰지만, foreach 문은 반복 중간에 break로 즉시 빠져나갈 수 있다는 장점이 있다 — ForEach-Object의 스크립트 블록 안에서는 break가 예상과 다르게 동작한다.
while과 do...while은 조건 검사 시점이 달라 결과가 갈릴 수 있다: 조건이 처음부터 거짓이면 while은 블록을 한 번도 실행하지 않지만, do...while은 무조건 최소 한 번은 실행한 뒤에야 조건을 검사한다. “사용자에게 최소 한 번은 메뉴를 보여줘야 한다"처럼 최초 실행이 보장돼야 하는 로직에는 do...while이 적합하고, “조건이 맞을 때만 시작해야 한다"면 while을 써야 한다.
중첩 반복문에서 break는 기본적으로 가장 안쪽 반복만 빠져나간다: 바깥쪽 반복까지 한 번에 종료하려면 반복문에 레이블(:outer처럼 콜론으로 시작하는 이름)을 붙이고 break outer처럼 레이블을 지정해야 한다. 레이블 없이 break만 쓰면 가장 가까운 반복문만 종료된다는 점을 놓치면, 중첩 반복이 예상보다 오래 계속 도는 버그로 이어진다.
이식성: Bash의 for x in list; do ... done, while ... do ... done과 개념은 같지만 PowerShell은 조건을 항상 소괄호로 감싼다는 문법 차이가 있다. CMD의 for는 파일·목록·숫자 범위마다 옵션(/f, /l, /d)이 갈리는 하나의 명령이라, PowerShell처럼 네 가지 반복 문으로 명확히 나뉘어 있는 쪽이 각 상황의 의도를 더 분명히 드러낸다.
![Featured image of post [PowerShell] 56. foreach/for/while/do-while — 반복문](/post/powershell/foreach-for-while-loop-powershell/wordcloud_hu_118ae41817f54c0b.webp)
![[PowerShell] 54. if/elseif/else — 조건 분기](/post/powershell/if-elseif-switch-condition-powershell/wordcloud_hu_fd68a53ddac2fa5a.webp)
![[PowerShell] 55. switch 고급 모드 — 와일드카드/정규식/파일 처리](/post/powershell/switch-wildcard-regex-file-powershell/wordcloud_hu_106a3f1b500a0d85.webp)
![[PowerShell] 56. foreach/for/while/do-while — 반복문](/post/powershell/foreach-for-while-loop-powershell/wordcloud_hu_658b84b145d1a138.webp)
![[PowerShell] 57. 함수 정의와 매개변수](/post/powershell/function-parameter-definition-powershell/wordcloud_hu_77f6f557cee7aa03.webp)
![[PowerShell] 58. [CmdletBinding()]과 고급 함수](/post/powershell/cmdletbinding-advanced-function-powershell/wordcloud_hu_bb76a800ea45ec4b.webp)
![[PowerShell] 41. 변수와 데이터 타입](/post/powershell/variables-data-types-powershell/wordcloud_hu_6051f7a36d4700ee.webp)
![[PowerShell] 42. 배열과 컬렉션 기초](/post/powershell/arrays-collections-powershell/wordcloud_hu_c295cc73d4592ae5.webp)
![[PowerShell] 43. ArrayList와 Generic List(List<T>)](/post/powershell/arraylist-generic-list-powershell/wordcloud_hu_a34550a6370cee87.webp)
![[PowerShell] 44. 해시테이블(Hashtable) 다루기](/post/powershell/hash-tables-powershell/wordcloud_hu_d1fd29269ce3c32d.webp)