개요
PowerShell 배열은 @()로 만드는 고정 크기 컬렉션으로, 16장에서 Group-Object가 그룹별로 만들어 준 컬렉션이나 12장 Where-Object가 걸러낸 결과가 실제로는 대부분 배열이었다. 이 장은 그 배열 자체를 직접 만들고 인덱싱하고 순회하는 법을 정리한다.
정신 모델은 “배열은 객체를 순서대로 담는 상자이고, 각 상자에는 0부터 시작하는 번호(인덱스)가 붙어 있다"는 것이다. 파이프라인이 객체를 한 번에 하나씩 흘려보내는 것과 달리, 배열은 이미 메모리에 다 올라온 상태에서 번호로 즉시 접근할 수 있다는 점이 다르다.
사용법
| |
종류
| 개념 | 설명 |
|---|---|
| 단일 차원 배열 | 가장 일반적인 형태, @(1,2,3) |
| 다차원 배열(Multidimensional) | New-Object 'object[,]' 4,3처럼 고정된 사각형 구조 |
| 재정렬 배열(Jagged Array) | 배열의 배열, 각 하위 배열 길이가 서로 달라도 됨(@(@(1,2), @(1,2,3))) |
.ForEach() / .Where() 메서드 | PowerShell 4.0+, ForEach-Object/Where-Object보다 빠른 배열 전용 메서드 |
Count/Length 속성 | 요소 개수(둘은 동의어) |
예시
| |
주의사항·함정
배열은 크기가 고정돼 있어, +=로 요소를 추가할 때마다 사실은 새 배열이 통째로 다시 만들어진다: $a += ,84는 언뜻 배열 끝에 요소 하나를 붙이는 것처럼 보이지만, 실제로는 기존 배열 전체를 복사해 새 배열을 만드는 연산이다. 반복문 안에서 배열에 계속 +=를 쓰면 요소가 늘어날수록 매번 전체를 복사하므로 성능이 급격히 나빠진다 — 크기가 자주 바뀌는 컬렉션이 필요하다면 43장에서 다룰 ArrayList나 List<T>가 훨씬 적합하다.
단일 요소 배열을 만들 때 쉼표를 빠뜨리면 배열이 아니게 된다: $single = "딱 하나"는 문자열 변수일 뿐이고, 배열로 만들려면 $single = ,"딱 하나"처럼 앞에 쉼표(단항 배열 연산자)를 붙여야 한다. 함수가 항상 배열을 반환하도록 보장해야 하는 상황에서 이 차이를 놓치면, 요소가 하나일 때만 호출 코드가 예상과 다르게 동작하는 버그가 생긴다.
다차원 배열과 재정렬 배열은 인덱싱 문법이 다르다: 다차원 배열은 $matrix[0,0]처럼 쉼표로 구분한 인덱스 하나로 접근하지만, 재정렬 배열(배열의 배열)은 $jagged[1][2]처럼 대괄호를 연달아 써야 한다. 겉보기에 비슷해 보여도 내부 구조가 다르므로 혼용하면 인덱스 오류가 난다.
이식성: Bash 배열(arr=(1 2 3), ${arr[0]})은 문자열 값만 담는 얕은 컬렉션이고, CMD는 배열 자체가 없어 지연 확장 변수나 FOR 루프로 흉내 낸다. PowerShell 배열은 어떤 .NET 객체든 담을 수 있고 음수 인덱스·범위 슬라이싱을 기본 문법으로 지원한다는 점에서 표현력이 훨씬 넓다.
![Featured image of post [PowerShell] 42. 배열과 컬렉션 기초](/post/powershell/arrays-collections-powershell/wordcloud_hu_ad570a8e89c36a5c.webp)
![[PowerShell] 40. 레지스트리 프로바이더(Registry:) 다루기](/post/powershell/registry-provider-hklm-hkcu-powershell/wordcloud_hu_cf90c98823ba3b1c.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)
![[PowerShell] 12. Where-Object — 필터링](/post/powershell/where-object-command-filter-pipeline-powershell/wordcloud_hu_75843f29a19f2cc5.webp)
![[PowerShell] 15. ForEach-Object — 파이프라인 반복 처리](/post/powershell/foreach-object-command-pipeline-loop-powershell/wordcloud_hu_b76415f4d50f87a3.webp)
![[PowerShell] 20. 비교 연산자 — -eq/-like/-contains/-in](/post/powershell/comparison-operators-eq-like-contains-in-powershell/wordcloud_hu_e39e3d06b7800d57.webp)
![[PowerShell] 21. 논리 연산자와 조건식 조합 — -and/-or/-not](/post/powershell/logical-operators-and-or-not-powershell/wordcloud_hu_751168d59de9154c.webp)