about_Assignment_Operators

about_Assignment_Operators

할당 연산자(Assignment Operators)는 PowerShell에서 변수에 값을 넣는 가장 기본적인 도구예요. 단순히 =로 값을 넣는 것부터, +=, -=, ++, ??= 같은 복합 연산자까지, 어떤 상황에서 어떤 연산자를 써야 하는지 하나씩 짚어 드릴게요.

출처: about_Assignment_Operators - PowerShell (Microsoft Learn)

본문

Short description (짧은 설명)

변수에 값을 할당할 때 사용하는 연산자에 대해 설명해요.

Long description (자세한 설명)

할당 연산자는 변수에 값을 하나 또는 여러 개 할당하는 연산자예요. 등호(=)가 PowerShell의 기본 할당 연산자고, PowerShell에는 그 외에도 +=, -=, *=, %=, ++, --, ??= 같은 복합 할당 연산자가 있어요. 복합 할당 연산자는 할당을 하기 전에 값에 어떤 연산을 먼저 수행해요.

Syntax (구문)

할당 연산자의 구문은 다음과 같아요.

<assignable-expression> <assignment-operator> <value>

할당 가능한 표현식(assignable expression)에는 변수와 속성이 포함돼요. 값은 단일 값일 수도, 값의 배열일 수도, 명령·식·문(statement)일 수도 있어요.

증가/감소 연산자(++, --)는 단항 연산자예요. 각각 전위(prefix) 버전과 후위(postfix) 버전을 가지고 있어요.

<assignable-expression><operator>
<operator><assignable-expression>

할당 가능한 표현식의 값은 숫자여야 하거나, 숫자로 변환할 수 있어야 해요.

Using the assignment operator (할당 연산자 사용하기)

변수는 값을 저장하는 이름 붙은 메모리 공간이에요. 할당 연산자 =를 써서 변수에 값을 저장해요. 새 값이 변수의 기존 값을 대체할 수도 있고, 기존 값 뒤에 새 값을 이어 붙일 수도 있어요. 예를 들어 다음 문은 $MyShell 변수에 PowerShell이라는 값을 할당해요.

$MyShell = "PowerShell"

PowerShell에서 변수에 값을 할당하면, 그 변수가 아직 없었다면 해당 시점에 변수가 새로 생성돼요. 예를 들어 아래 두 할당 문 중 첫 번째 문은 $a 변수를 만들면서 $a에 6을 할당하고, 두 번째 문은 $a에 12를 할당해요. 첫 번째 문은 새 변수를 만드는 반면, 두 번째 문은 값을 바꿀 뿐이에요.

$a = 6
$a = 12

PowerShell 변수는 캐스트(cast)하지 않는 한 특정한 데이터 형식을 가지지 않아요. 변수에 객체 하나만 들어 있으면 그 객체의 데이터 형식을 따르고, 객체 컬렉션이 들어 있으면 System.Object 형식을 가져요. 그래서 컬렉션에는 어떤 형식의 객체든 넣을 수 있어요. 아래 예시에서는 프로세스 객체·서비스 객체·문자열·정수를 오류 없이 한 변수에 넣는 걸 보여 줘요.

$a = Get-Process
$a += Get-Service
$a += "string"
$a += 12

할당 연산자 =는 파이프라인 연산자 |보다 우선순위가 낮아서, 명령 파이프라인의 결과를 변수에 할당할 때 괄호를 붙이지 않아도 돼요. 예를 들어 다음 명령은 컴퓨터의 서비스들을 정렬한 뒤 그 결과를 $a 변수에 할당해요.

$a = Get-Service | Sort-Object -Property Name

문(statement)이 만들어 낸 값을 변수에 할당할 수도 있어요. 다음 예시처럼요.

$a = if ($b -lt 0) { 0 } else { $b }

이 예시는 $b의 값이 0보다 작으면 $a에 0을 할당하고, 0보다 작지 않으면 $b의 값을 $a에 할당해요.

배열(값이 여러 개)을 변수에 할당하려면 값들을 쉼표로 구분해요.

$a = "apple", "orange", "lemon", "grape"

해시 테이블을 변수에 할당하려면 PowerShell의 표준 해시 테이블 표기법을 사용해요. 골뱅이(@)를 쓰고, 세미콜론(;)으로 구분된 키/값 쌍을 중괄호({ })로 감싸면 돼요. 예를 들어 $a 변수에 해시 테이블을 할당하려면 다음처럼 입력해요.

$a = @{one=1; two=2; three=3}

16진수 값을 변수에 할당하려면 값 앞에 0x를 붙여요. PowerShell은 16진수 값(0x10)을 10진수 값(여기서는 16)으로 변환해 $a 변수에 할당해요. 예를 들어 $a0x10을 할당하려면 다음처럼 입력해요.

$a = 0x10

지수(exponential) 값을 변수에 할당하려면 밑(base)이 되는 숫자, 문자 e, 그리고 10의 배수를 나타내는 숫자를 차례로 입력해요. 예를 들어 $a에 3.1415의 1,000승 값을 할당하려면 다음처럼 입력해요.

$a = 3.1415e3

PowerShell은 킬로바이트(KB), 메가바이트(MB), 기가바이트(GB)도 바이트로 변환할 수 있어요. 예를 들어 $a에 10킬로바이트 값을 할당하려면 다음처럼 입력해요.

$a = 10kb

Using compound assignment operators (복합 할당 연산자 사용하기)

복합 할당 연산자는 할당을 하기 전에 값에 대해 숫자 연산을 수행해요.

중요 — 복합 할당 연산자는 동적 스코프(dynamic scoping)를 사용하지 않아요. 변수는 항상 현재 스코프에 있어요.

다음 예시에서 $x 변수는 전역(global) 스코프에 정의돼요. 중괄호는 새 스코프를 만들어요. 중괄호 안의 $x 변수는 전역 변수의 복사본이 아니라 새로운 인스턴스예요.

$x = 1 # Global scope
& { $x += 1; $x }
1

일반 할당 연산자를 쓰면 부모 스코프에서 변수의 복사본을 가져와요. 그런데 이때 부모 스코프의 $x는 바뀌지 않는 점을 눈여겨봐 주세요.

$x = 1 # Global scope
& { $x = $x + 1; $x }
"Global `$x = $x"
2
Global $x = 1

The assignment by addition operator (+= 덧셈 할당 연산자)

+= 연산자는 변수의 값을 증가시키거나 지정된 값을 기존 값에 이어 붙여요. 어떤 동작이 일어나는지는 변수가 숫자 형식인지 문자열 형식인지, 또 변수에 단일 값(스칼라)이 들어 있는지 여러 값(컬렉션)이 들어 있는지에 따라 달라져요.

+= 연산자는 두 가지 연산을 합쳐 놓은 거예요. 먼저 더하고, 그다음에 할당해요. 그래서 다음 두 문은 서로 같아요.

$a += 2
$a = ($a + 2)

변수에 숫자 값이 하나 들어 있으면, += 연산자는 연산자 오른쪽의 값만큼 기존 값을 증가시키고 그 결과를 변수에 할당해요. 다음 예시는 += 연산자로 변수 값을 증가시키는 방법을 보여 줘요.

$a = 4
$a += 2
$a
6

변수 값이 문자열이면 연산자 오른쪽의 값이 문자열에 이어 붙어요.

$a = "Windows"
$a += " PowerShell"
$a
Windows PowerShell

변수 값이 배열이면 += 연산자는 연산자 오른쪽의 값을 배열에 추가해요. 배열을 캐스트로 명시적으로 형식화하지 않는 한, 어떤 형식의 값이든 배열에 추가할 수 있어요.

$a = 1,2,3
$a += 2
$a
1
2
3
2

그리고

$a += "String"
$a
1
2
3
2
String

변수 값이 해시 테이블이면, += 연산자는 연산자 오른쪽의 값을 해시 테이블에 추가해요. 그런데 해시 테이블에 추가할 수 있는 유일한 형식이 또 다른 해시 테이블뿐이라서, 그 외의 할당은 모두 실패해요.

예를 들어 다음 명령은 $a 변수에 해시 테이블을 할당하고, 그다음에 += 연산자로 또 다른 해시 테이블을 기존 해시 테이블에 추가해요. 즉 기존 해시 테이블에 새 키/값 쌍을 효과적으로 더하는 셈이에요. 이 명령은 출력에서 보듯 성공해요.

$a = @{a = 1; b = 2; c = 3}
$a += @{mode = "write"}
$a
Name                           Value
----                           -----
a                              1
b                              2
mode                           write
c                              3

다음 명령은 정수 "1"을 $a 변수의 해시 테이블에 추가하려고 시도하는데, 이 명령은 실패해요.

$a = @{a = 1; b = 2; c = 3}
$a += 1
InvalidOperation:
Line |
   2 |  $a += 1
     |  ~~~~~~~
     | A hash table can only be added to another hash table.

The assignment by subtraction operator (-= 뺄셈 할당 연산자)

-= 연산자는 연산자 오른쪽에 지정된 값만큼 변수의 값을 감소시켜요. 이 연산자는 문자열 변수에는 쓸 수 없고, 컬렉션에서 요소를 제거하는 데도 쓸 수 없어요.

-= 연산자도 두 연산을 합친 거예요. 먼저 빼고, 그다음에 할당해요. 그래서 다음 두 문은 서로 같아요.

$a -= 2
$a = ($a - 2)

다음 예시는 -= 연산자로 변수 값을 줄이는 방법을 보여 줘요.

$a = 8
$a -= 2
$a
6

-= 연산자를 사용해 숫자 배열의 요소 값을 줄일 수도 있어요. 그러려면 바꾸려는 배열 요소의 인덱스를 지정해요. 다음 예시에서는 배열의 세 번째 요소(요소 2)의 값을 1만큼 줄여요.

$a = 1,2,3
$a[2] -= 1
$a
1
2
2

-= 연산자로 변수의 값을 삭제할 수는 없어요. 변수에 할당된 값을 모두 지우려면 Clear-Item 또는 Clear-Variable cmdlet을 사용해서 변수에 $null이나 "" 값을 할당해요.

$a = $null

배열에서 특정 값을 삭제하려면 배열 표기법을 사용해 해당 항목에 $null 값을 할당해요. 예를 들어 다음 문은 배열에서 두 번째 값(인덱스 위치 1)을 삭제해요.

$a = 1,2,3
$a
1
2
3
$a[1] = $null
$a
1
3

변수 자체를 삭제하려면 Remove-Variable cmdlet을 사용해요. 이 방법은 변수가 특정 데이터 형식으로 명시적으로 캐스트되어 있고, 형식이 지정되지 않은 변수를 원할 때 유용해요. 다음 명령은 $a 변수를 삭제해요.

Remove-Variable -Name a

The assignment by multiplication operator (*= 곱셈 할당 연산자)

*= 연산자는 숫자 값을 곱하거나, 변수의 문자열 값을 지정된 횟수만큼 이어 붙여요.

변수에 숫자 값이 하나 들어 있으면, 그 값에 연산자 오른쪽의 값을 곱해요. 예를 들어 다음 예시는 *= 연산자로 변수 값을 곱하는 방법을 보여 줘요.

$a = 3
$a *= 4
$a
12

이 경우에도 *= 연산자는 두 연산을 합친 거예요. 먼저 곱하고, 그다음에 할당해요. 그래서 다음 두 문은 서로 같아요.

$a *= 2
$a = ($a * 2)

변수에 문자열 값이 들어 있으면, PowerShell이 지정된 횟수만큼 문자열을 값에 이어 붙여요.

$a = "file"
$a *= 4
$a
filefilefilefile

배열의 요소를 곱하려면 인덱스를 사용해 곱할 요소를 지정해요. 예를 들어 다음 명령은 배열의 첫 번째 요소(인덱스 위치 0)를 2로 곱해요.

$a[0] *= 2

The assignment by division operator (/= 나눗셈 할당 연산자)

/= 연산자는 연산자 오른쪽에 지정된 값으로 숫자 값을 나눠요. 이 연산자는 문자열 변수에는 쓸 수 없어요.

/= 연산자는 두 연산을 합친 거예요. 먼저 나누고, 그다음에 할당해요. 그래서 다음 두 문은 서로 같아요.

$a /= 2
$a = ($a / 2)

예를 들어 다음 명령은 /= 연산자로 변수 값을 나눠요.

$a = 8
$a /=2
$a
4

배열의 요소를 나누려면 인덱스를 사용해 바꾸려는 요소를 지정해요. 예를 들어 다음 명령은 배열의 두 번째 요소(인덱스 위치 1)를 2로 나눠요.

$a[1] /= 2

The assignment by modulus operator (%= 나머지 할당 연산자)

%= 연산자는 변수 값을 연산자 오른쪽의 값으로 나눠요. 그런 다음 %= 연산자는 나머지(모듈러스라고도 불러요)를 변수에 할당해요. 이 연산자는 변수에 숫자 값이 하나 들어 있을 때만 사용할 수 있고, 문자열 변수나 배열에는 쓸 수 없어요.

%= 연산자는 두 연산을 합친 거예요. 먼저 나눠서 나머지를 구하고, 그다음에 나머지를 변수에 할당해요. 그래서 다음 두 문은 서로 같아요.

$a %= 2
$a = ($a % 2)

다음 예시는 %= 연산자로 몫의 나머지를 저장하는 방법을 보여 줘요.

$a = 7
$a %= 4
$a
3

The increment and decrement operators (++, -- 증가·감소 연산자)

증가 연산자(++)는 변수의 값을 1 증가시켜요. 단순한 문에서 증가 연산자를 사용하면 값이 반환되지 않아요. 결과를 보려면 다음처럼 변수의 값을 표시해요.

$a = 7
++$a
$a
8

값이 반환되도록 강제하려면 변수와 연산자를 괄호로 감싸요.

$a = 7
(++$a)
8

증가 연산자는 변수 앞(전위)이나 뒤(후위)에 놓을 수 있어요. 전위 버전은 문에서 변수 값이 사용되기 전에 변수를 증가시켜요.

$a = 7
$c = ++$a
$a
8
$c
8

후위 버전은 문에서 변수 값이 사용된 후에 변수를 증가시켜요. 다음 예시에서 $c$a 변수는 값이 다른데, 그 이유는 $a가 바뀌기 전에 값이 $c에 할당되기 때문이에요.

$a = 7
$c = $a++
$a
8
$c
7

감소 연산자(--)는 변수의 값을 1 감소시켜요. 증가 연산자와 마찬가지로 단순한 문에서 사용하면 값이 반환되지 않아요. 값을 반환하려면 괄호를 사용해요.

$a = 7
--$a
$a
6
(--$a)
5

전위 버전은 문에서 변수 값이 사용되기 전에 변수를 감소시켜요.

$a = 7
$c = --$a
$a
6
$c
6

후위 버전은 문에서 변수 값이 사용된 후에 변수를 감소시켜요. 다음 예시에서 $d$a 변수는 값이 다른데, 그 이유는 $a가 바뀌기 전에 값이 $d에 할당되기 때문이에요.

$a = 7
$d = $a--
$a
6
$d
7

Null-coalescing assignment operator (??= 널 병합 할당 연산자)

널 병합 할당 연산자(??=)는 왼쪽 피연산자가 null로 평가될 때만 오른쪽 피연산자의 값을 왼쪽 피연산자에 할당해요. ??= 연산자는 왼쪽 피연산자가 null이 아닌 값으로 평가되면 오른쪽 피연산자를 아예 평가하지 않아요.

$x = $null
$x ??= 100
$x
100

자세한 내용은 Null-coalescing operator 문서를 참고해요.

Microsoft .NET types (.NET 형식)

기본적으로 변수에 값이 하나만 들어 있으면, 변수에 할당된 값이 변수의 데이터 형식을 결정해요. 예를 들어 다음 명령은 System.Int32 형식을 가진 변수를 만들어요.

$a = 6

변수의 .NET 형식을 확인하려면 GetType 메서드와 FullName 속성을 사용해요. GetType 메서드 이름 뒤에는 괄호를 꼭 붙여야 해요. 메서드 호출에 인자가 없더라도 마찬가지예요.

$a = 6
$a.GetType().FullName
System.Int32

문자열을 담는 변수를 만들려면 변수에 문자열 값을 할당해요. 그 값이 문자열임을 나타내려면 다음처럼 값을 따옴표로 감싸요.

$a = "6"
$a.GetType().FullName
System.String

변수에 처음 할당된 값이 문자열이면, PowerShell은 모든 연산을 문자열 연산으로 처리하고 새 값을 문자열로 캐스트해요. 이런 일은 다음 예시에서 일어나요.

$a = "file"
$a += 3
$a
file3

첫 값이 정수면, PowerShell은 모든 연산을 정수 연산으로 처리하고 새 값을 정수로 캐스트해요. 이런 일은 다음 예시에서 일어나요.

$a = 6
$a += "3"
$a
9

새 스칼라 변수는 변수 이름 앞이나 첫 할당 값 앞에 대괄호 안에 형식 이름을 넣으면 어떤 .NET 형식으로든 캐스트할 수 있어요. 변수를 캐스트하면 그 변수에 저장할 수 있는 데이터 형식이 정해지는 셈이에요.

예를 들어 다음 명령은 변수를 문자열 형식으로 캐스트해요.

[string]$a = 27
$a += 3
$a
273

다음 예시는 변수가 아니라 첫 값을 캐스트해요.

$a = [string]27

기존 변수의 값을 새 데이터 형식으로 변환할 수 없으면 그 변수의 데이터 형식을 다시 캐스트할 수 없어요.

$a = "string"
[int]$a
InvalidArgument: Cannot convert value "string" to type "System.Int32". Error:
"The input string 'string' was not in a correct format."

데이터 형식을 바꾸려면 그 값을 교체해야 해요.

[int]$a = 3

추가로, 변수 이름 앞에 데이터 형식을 붙이면 그 변수의 형식이 잠겨요. 다른 데이터 형식을 지정해 명시적으로 덮어쓰지 않는 한 말이에요. 기존 형식과 호환되지 않는 값을 할당하려고 하는데 형식을 명시적으로 덮어쓰지 않으면, PowerShell이 다음 예시처럼 오류를 보여 줘요.

$a = 3
$a = "string"
[int]$a = 3
$a = "string"
MetadataError:
Line |
   2 |  $a = "string"
     |  ~~~~~~~~~~~~~
     | Cannot convert value "string" to type "System.Int32". Error: "The input
string 'string' was not in a correct format."
[string]$a = "string"

PowerShell에서 배열에 여러 항목을 담는 변수의 데이터 형식은 단일 항목을 담는 변수의 데이터 형식과 다르게 취급돼요. 배열 변수에 데이터 형식이 명시적으로 할당되지 않으면 데이터 형식은 항상 System.Object []예요. 이 형식은 배열에만 있는 특수한 형식이에요.

때로는 다른 형식을 지정해 기본 형식을 덮어쓸 수 있어요. 예를 들어 다음 명령은 변수를 string [] 배열 형식으로 캐스트해요.

[string []] $a = "one", "two", "three"

PowerShell 변수는 어떤 .NET 데이터 형식이든 될 수 있어요. 게다가 현재 프로세스에서 사용 가능한 완전한(fully qualified) .NET 데이터 형식도 아무거나 할당할 수 있어요. 예를 들어 다음 명령은 System.DateTime 데이터 형식을 지정해요.

[System.DateTime]$a = "5/31/2005"

그러면 변수에는 System.DateTime 데이터 형식에 맞는 값이 할당돼요. $a 변수의 값은 다음과 같게 돼요.

Tuesday, May 31, 2005 12:00:00 AM

Assigning multiple variables (여러 변수에 할당하기)

PowerShell에서는 단일 명령으로 여러 변수에 값을 할당할 수 있어요. 할당 값의 첫 번째 요소는 첫 번째 변수에, 두 번째 요소는 두 번째 변수에, 세 번째 요소는 세 번째 변수에 할당돼요. 이를 다중 할당(multiple assignment)이라고 불러요.

예를 들어 다음 명령은 $a 변수에 값 1을, $b 변수에 값 2를, $c 변수에 값 3을 할당해요.

$a, $b, $c = 1, 2, 3

할당 값이 변수보다 더 많은 요소를 포함하면, 나머지 값은 모두 마지막 변수에 할당돼요. 예를 들어 다음 명령은 변수 3개와 값 5개를 담고 있어요.

$a, $b, $c = 1, 2, 3, 4, 5

그래서 PowerShell은 $a 변수에 값 1을, $b 변수에 값 2를 할당해요. 그리고 값 3, 4, 5를 $c 변수에 할당해요. $c 변수의 값들을 다른 변수 3개에 할당하려면 다음 형식을 사용해요.

$d, $e, $f = $c

이 명령은 $d 변수에 값 3을, $e 변수에 값 4를, $f 변수에 값 5를 할당해요.

할당 값이 변수보다 더 적은 요소를 포함하면, 남은 변수에는 $null 값이 할당돼요. 예를 들어 다음 명령은 변수 3개와 값 2개를 담고 있어요.

$a, $b, $c = 1, 2

그래서 PowerShell은 $a 변수에 값 1을, $b 변수에 값 2를 할당해요. $c 변수는 $null이 돼요.

변수를 연결(chain)하면 여러 변수에 단일 값을 할당할 수도 있어요. 예를 들어 다음 명령은 네 변수 모두에 "three"라는 값을 할당해요.

$a = $b = $c = $d = "three"

할당 연산으로 변수 값을 설정하는 것 외에도 Set-Variable cmdlet을 사용할 수 있어요. 예를 들어 다음 명령은 Set-Variable을 사용해 1, 2, 3 배열을 $a 변수에 할당해요.

Set-Variable -Name a -Value 1, 2, 3

See also (더 보기)

더 알아보기