HOWTO · PowerShell
PowerShell에서 배열, 해시 테이블 및 사전을 만드는 방법
이 포괄적인 가이드를 통해 PowerShell에서 배열, 해시 테이블, 순서가 지정된 사전을 만들고 사용하는 방법을 알아보세요. 주요 차이점, 항목에 접근하고 추가하고 제거하는 방법, 그리고 각 데이터 구조를 언제 사용해야 하는지를 이해합니다. PowerShell 스크립팅과 데이터 조작을 효율적으로 숙달하는 데 도움이 되는 실용적인 예제, 실제 사용 사례, FAQ 섹션을 포함합니다. PowerShell에서 자동화와 데이터 구성을 향상시키고 싶은 초보자와 고급 사용자 모두에게 적합합니다.
이 페이지의 내용
값의 나열에는 배열(@())을, 키-값 조회에는 해시 테이블(@{})을, 키가 추가된 순서가 유지되어야 할 때는 순서가 지정된 사전([ordered]@{})을 선택하세요. 아래 예제는 독립적으로 실행되는 PowerShell 조각들입니다. 이 예제들에 대한 런타임 관찰 결과가 없으므로, 어떤 출력도 주장되지 않습니다.
PowerShell에서 배열 만들기
배열은 여러 값을 하나의 변수에 저장합니다. PowerShell 배열의 인덱스는 0부터 시작하고, -1은 마지막 요소를 가리킵니다. @()는 명령이 단일 값을 반환하는 경우를 포함해 결과를 명시적으로 배열로 수집합니다. 이 예제를 실행하세요.
$items = @('apple', 'banana', 'cherry')
$items[0]
$items[-1]
$items += 'date'
$items = @($items | Where-Object { $_ -ne 'banana' })
$items -join ', '
이 예제는 첫 번째와 마지막 값을 읽고, 값 하나를 추가한 다음, banana를 제외한 필터링된 배열을 할당합니다. PowerShell 배열은 크기가 고정되어 있습니다. +=는 결과 배열을 만들어 다시 할당하므로, 큰 배열에 반복해서 추가하면 반복적인 복사가 필요할 수 있습니다. 추가와 제거가 잦은 경우에는 System.Collections.Generic.List[object] 같은 변경 가능한 컬렉션이 더 적합할 수 있습니다. 배열의 형식을 검사하려면 $items.GetType().FullName을 사용하세요. 이러한 문자열 값들에 대해 @()는 Object[]를 만듭니다.
PowerShell에서 해시 테이블 사용하기
PowerShell 해시 테이블은 키를 값에 매핑합니다. @{}로 만들고, 대괄호 표기법으로 항목을 읽고, 키를 할당해 항목을 추가하거나 교체하고, .Remove()를 호출해 삭제합니다. 대괄호는 임의의 키 이름에 대해서도 안정적으로 동작합니다. 점 표기법은 키가 속성처럼 단순한 이름일 때 편리하지만, Count 같은 기본 제공 멤버와 충돌할 수 있습니다.
$inventory = @{ Fruit = 'Apple'; Color = 'Red'; Count = 5 }
$inventory['Color']
$inventory['Shape'] = 'Round'
$inventory.Remove('Color')
$inventory.GetEnumerator() | Sort-Object Name | ForEach-Object {
"{0}={1}" -f $_.Name, $_.Value
}
마지막 파이프라인은 표시를 위해 내보내진 항목들을 키 기준으로 정렬합니다. 원본 해시 테이블을 재정렬하거나 교체하지는 않습니다. PowerShell 해시 테이블의 키는 기본적으로 대소문자를 구분하지 않습니다. 키 비교 의미가 달라져야 한다면 다른 컬렉션을 사용하세요.
PowerShell에서 순서가 지정된 사전 만들기
[ordered] 리터럴은 순서가 지정된 사전을 만들고 항목이 삽입된 순서를 유지합니다. 해시 테이블에서와 마찬가지로 키를 사용해 항목에 접근하고 업데이트합니다. 삽입 순서는 알파벳순 정렬과는 다릅니다. 별도의 결과를 명시적으로 정렬하지 않는 한, 원래 순서는 삽입 순서 그대로 유지됩니다.
$settings = [ordered]@{ Name = 'Delft'; Region = 'South Holland'; Active = $true }
$settings['Region']
$settings['Timezone'] = 'Europe/Amsterdam'
$settings.GetEnumerator() | ForEach-Object {
"{0}={1}" -f $_.Key, $_.Value
}
해시 테이블과 순서가 지정된 사전: 주요 차이점
| 기능 | 해시 테이블 | 순서가 지정된 사전 |
| PowerShell 리터럴 | @{} | [ordered]@{} |
| 데이터 모델 | 키가 값에 매핑됨 | 키가 값에 매핑됨 |
| 반복 순서 | 삽입 순서에 의존하지 않음 | 삽입 순서를 유지함 |
| 항목 읽기 또는 업데이트 | $table['key'] | $dictionary['key'] |
| 가장 적합한 경우 | 표시 순서가 중요하지 않을 때 키로 조회 | 삽입 순서가 중요한 키-값 데이터 |
PowerShell 해시 테이블은 모든 .NET 사전 형식과 같은 것은 아닙니다. System.Collections.Hashtable은 PowerShell의 @{} 리터럴이 사용하는 .NET 형식이며, .NET은 자체의 순서 및 비교 동작을 가진 다른 사전 구현도 제공합니다. 코드에 필요한 구체적인 형식과 동작을 기준으로 선택하세요. 실제 작업량을 측정하지 않고 어느 컬렉션이 더 빠르다고 가정하지 마세요.
실용적인 사용 사례
출력이 선택한 순서를 따라야 할 때는 사용자 또는 구성 필드에 순서가 지정된 사전을 사용하세요. 키를 기준으로 단어를 세려면 해시 테이블을 사용하세요. 이 예제들은 두 가지 작업을 모두 보여 줍니다. 코드는 독립적으로 실행되며, 어떤 출력도 주장되지 않습니다.
$user = [ordered]@{
Name = 'John Doe'
Email = 'johndoe@example.com'
Role = 'Admin'
}
$user.GetEnumerator() | ForEach-Object { "{0}: {1}" -f $_.Key, $_.Value }
$text = 'apple banana apple orange apple banana'
$wordCount = @{}
$text.Split() | ForEach-Object {
if ($wordCount.ContainsKey($_)) {
$wordCount[$_] += 1
} else {
$wordCount[$_] = 1
}
}
$wordCount.GetEnumerator() | Sort-Object Name | ForEach-Object {
"{0}: {1}" -f $_.Name, $_.Value
}
결론
위치 기준으로 처리하는 순서 있는 나열에는 배열을, 키 기반 조회에는 해시 테이블을, 삽입 순서 자체가 제시하는 데이터의 일부일 때는 순서가 지정된 사전을 사용하세요. 배열의 +=는 새 배열을 할당하고, 필터링은 할당할 결과를 반환하며, 해시 테이블의 열거된 항목을 정렬하면 테이블 자체가 아니라 표시되는 결과가 바뀐다는 점을 기억하세요.
자주 묻는 질문(FAQ)
PowerShell에서 해시 테이블과 사전의 차이점은 무엇인가요?
일상적인 PowerShell 사용에서 ‘사전’은 일반적인 키-값 구조를 설명할 수 있고, @{}는 .NET의 System.Collections.Hashtable 형식을 기반으로 하는 PowerShell 해시 테이블을 만듭니다. .NET 클래스 라이브러리에는 별개의 사전 형식도 있으므로, API가 특정 구현을 요구할 때는 구체적인 형식을 확인하세요.
PowerShell 배열에 항목을 추가하거나 배열에서 항목을 제거하려면 어떻게 하나요?
$array += 'newItem'으로 추가한 다음 그 결과를 변수에 다시 할당하세요. 일치하는 값을 제거하려면 필터링하고 그 결과를 할당하세요. 예를 들어 $array = @($array | Where-Object { $_ -ne 'itemToRemove' })입니다. 이러한 연산은 결과로 배열을 만들어 냅니다. 기존 배열의 크기를 그 자리에서 변경하지는 않습니다.
PowerShell에서 해시 테이블을 정렬할 수 있나요?
$hash.GetEnumerator() | Sort-Object Name을 사용해 표시용으로 항목을 정렬하세요. 이는 정렬된 항목을 반환하고 $hash는 변경되지 않은 상태로 둡니다. 삽입 순서가 필요할 때는 [ordered]@{}를 사용하세요. 이는 키를 알파벳순으로 정렬하는 대신 항목이 추가된 순서를 유지합니다.