HashTable

blimeyoops·2023년 7월 12일

powershell

목록 보기
6/8

HashTable

HashTable은 키/값의 저장소이다. PowerShell에서 해시테이블을 만들기 위해서는 중괄호를 사용해 @{ } 처럼 정의한다.

## 빈 해시테이블
$emptyHash = @{}

해시테이블에 키/값 추가

해시테이블에 키와 값을 추가하기 위한 여러가지 방법이 있다.

  • Add 메서드 이용
  • 해시테이블 생성시 키/값 추가
  • 해시테이블 생성시 인라인 방법으로 키/값 추가
  • 속성명을 이용해 키/값 추가
## 해시테이블에 키/값 추가
$hash = @{}
$hash.Add('월요일', 'Monday')
$hash.Add('화요일', 'Tuesday')
$hash.Add('수요일', 'Wednesday')
$hash.Add('목요일', 'Thursday')
$hash.Add('금요일', 'Friday')
$hash.Add('토요일', 'Saturday')
$hash.Add('일요일', 'Sunday')
$hash

## 해시테이블 생성시 키/값 추가
$hash = @{
    '월요일' = 'Monday'
    '화요일' = 'Tuesday'
    '수요일' = 'Wednesday'
    '목요일' = 'Thursday'
    '금요일' = 'Friday'
    '토요일' = 'Saturday'
    '일요일' = 'Sunday'
}
$hash

## 해시테이블 생성시 인라인 키/값 추가
$hash = @{ '월요일' = 'Monday'; '화요일' = 'Tuesday'; '수요일' = 'Wednesday'; '목요일' = 'Thursday'; '금요일' = 'Friday'; '토요일' = 'Saturday'; '일요일' = 'Sunday'}
$hash

## 해시테이블 키/값 추가
$hash = @{}
$hash.'월요일' = 'Monday'
$hash.'화요일' = 'Tuesday'
$hash.'수요일' = 'Wednesday'
$hash.'목요일' = 'Thursday'
$hash.'금요일' = 'Friday'
$hash.'토요일' = 'Saturday'
$hash.'일요일' = 'Sunday'
$hash

## Output
## Name                           Value
## ----                           -----
## 토요일                          Saturday
## 목요일                          hursday
## ....

위 스크립트의 결과를 보면 해시테이블의 값을 추가했는데 추가한 순서대로 해시테이블에 저장되지 않는것을 알 수 있다. 추가 순서대로 해시테이블에 저장하기 위해서는 다음과 같이 한다.

## 해시테이블 순서 지정 키/값 추가
$hash = [ordered]@{
    '월요일' = 'Monday'
    '화요일' = 'Tuesday'
    '수요일' = 'Wednesday'
    '목요일' = 'Thursday'
    '금요일' = 'Friday'
    '토요일' = 'Saturday'
    '일요일' = 'Sunday'
}
$hash
## Output
## Name                           Value
## ----                           -----
## 월요일                          Monday
## 화요일                          Tuesday
## ....

해시테이블 액세스

해시테이블에서 값을 가져오기 위해서는 대괄호를 사용해 조회한다.

## 해시테이블 액세스
$hash['월요일']

## Output
## Monday

일반적으로 해시 테이블은 키 하나를 제공하여 값 하나를 얻는 키/값 쌍으로 간주되지만 PowerShell을 사용하면 여러 값을 가져오는 키 배열을 제공할 수 있다.

## 해시테이블 다중 액세스
$hash['월요일', '화요일']
$hash[('월요일', '화요일')]
$hash[@('월요일', '화요일')]

## Output
## Monday
## Tuesday

해시테이블 반복

해시테이블의 키를 열거하고 이러한 키를 사용하여 값에 액세스하는 방법을 사용할 수 있다.

## 해시테이블 반복
$hash.Keys | ForEach-Object {
    $msg = '{0} : {1}' -f $_, $hash[$_]
    Write-Output $msg
}

foreach($key in $hash.Keys)
{
    $msg = '{0} : {1}' -f $key, $hash[$key]
    Write-Output $msg
}

## Output
## 토요일 : Saturday
## 목요일 : Thursday
## 일요일 : Sunday
## 금요일 : Friday
## 화요일 : Tuesday
## 수요일 : Wednesday
## 월요일 : Monday

GetEnumerator를 사용하는 방법도 있고 이 열거자는 키/값 쌍을 하나씩 제공한다.

## GetEnumerator를 사용한 해시테이블 반복
$hash.GetEnumerator() | ForEach-Object {
    $msg = '{0} : {1}' -f $_.Key, $_.Value
    Write-Output $msg
}

## Output
## 토요일 : Saturday
## 목요일 : Thursday
## 일요일 : Sunday
## 금요일 : Friday
## 화요일 : Tuesday
## 수요일 : Wednesday
## 월요일 : Monday

Splatting

Splatting이란 매개 변수 값 컬렉션을 단위로 명령에 전달하는 방법으로 컬렉션의 각 값을 명령 매개 변수와 연결한다. At 기호(@)는 단일 값 대신 값 컬렉션을 전달한다는 것을 PowerShell에 알릴 수 있다.
예를들어 다음과 같은 함수가 있다가 가정하자.

function Write-Splatting {
    Param($monday, $tuesday, $wednesday, $thursday, $friday, $saturday, $sunday)

    $msg = '{0} {1} {2} {3} {4} {5} {6}' -f $monday, $tuesday, $wednesday, $thursday, $friday, $saturday, $sunday
    Write-Output $msg
}

Write-Splatting 함수 매개변수에 값을 전달하기 위해서는 일반적으로 다음과 같은 방식을 사용한다.

## 일반 호출
Write-Splatting -monday '월요일' -tuesday '화요일' -wednesday '수요일' -thursday '목요일' -friday '금요일' -saturday '토요일' -sunday '일요일'

Splatting을 사용하면 매개변수에 전달할 값을 해시테이블로 만들어 전달할 수 있다.

## Splatting 호출
$days = @{
    monday = '월요일'
    tuesday = '화요일'
    wednesday = '수요일'
    thursday = '목요일'
    friday = '금요일'
    saturday = '토요일'
    sunday = '일요일'
}
Write-Splatting @days

## Output
## 월요일 화요일 수요일 목요일 금요일 토요일 일요일

또한 Splatting을 사용하면 여러 해시테이블을 전달할 수도 있다.

## Multiple Splatting 호출
$commonDays = @{
    monday = '월요일'
    tuesday = '화요일'
    wednesday = '수요일'
    thursday = '목요일'
}

$days = @{
    friday = '금요일'
    saturday = '토요일'
    sunday = '일요일'
}

Write-Splatting @commonDays @days
Write-Splatting @days @commonDays

## Output
## 월요일 화요일 수요일 목요일 금요일 토요일 일요일

참고
해시 테이블에 대해 알고 싶은 모든 것

0개의 댓글