about_Arithmetic_Operators
간단한 설명
PowerShell에서 산술 연산을 수행하는 연산자를 설명합니다.
자세한 설명
산술 연산자는 숫자 값을 계산합니다. 하나 이상의 산술 연산자를 사용하여 값을 추가하고, 빼고, 곱하고, 나누고, 나누기 연산의 re기본der(모듈러스)를 계산할 수 있습니다.
더하기 연산자(+
) 및 곱하기 연산자()도*
문자열, 배열 및 해시 테이블에서 작동합니다. 더하기 연산자는 입력을 연결합니다.
곱하기 연산자는 입력의 여러 복사본을 반환합니다. 산술 문에서 개체 형식을 혼합할 수도 있습니다. 문을 평가하는 데 사용되는 메서드는 식에서 가장 왼쪽 개체의 형식에 따라 결정됩니다.
PowerShell 2.0부터 모든 산술 연산자는 64비트 숫자에서 작동합니다.
PowerShell 3.0 -shr
부터 PowerShell에서 비트 산술 연산을 지원하기 위해 (shift-right) 및 -shl
(shift-left)가 추가됩니다. 비트 연산자는 정수 형식에서만 작동합니다.
PowerShell은 다음과 같은 산술 연산자를 지원합니다.
더하기(
+
) - 숫자를 추가하고 문자열, 배열 및 해시 테이블을 연결합니다.6 + 2 # result = 8 "file" + "name" # result = "filename" @(1, "one") + @(2.0, "two") # result = @(1, "one", 2.0, "two") @{"one" = 1} + @{"two" = 2} # result = @{"one" = 1; "two" = 2}
빼기(
-
) - 숫자를 빼거나 부정합니다.6 - 2 # result = 4 - -6 # result = 6 (Get-Date).AddDays(-1) # Yesterday's date
곱하기(
*
) - 지정된 횟수만큼 숫자를 곱하거나 문자열 및 배열을 복사합니다.6 * 2 # result = 12 @("!") * 4 # result = @("!","!","!","!") "!" * 3 # result = "!!!"
나누기(
/
) - 숫자 나누기6 / 2 # result = 3
모듈러스(
%
) - 나누기 연산의 re기본der를 반환합니다.7 % 2 # result = 1
비트 AND(
-band
)5 -band 3 # result = 1
비트 NOT(
-bnot
)-bnot 5 # result = -6
비트 OR(
-bor
)5 -bor 0x03 # result = 7
비트 XOR(
-bxor
)5 -bxor 3 # result = 6
비트를 왼쪽으로 이동(
-shl
)102 -shl 2 # result = 408
비트를 오른쪽으로 이동(
-shr
)102 -shr 2 # result = 25
연산자 우선 순위
PowerShell은 다음과 같은 순서로 산술 연산자를 처리합니다.
우선 순위 | Operator | 설명 |
---|---|---|
1 | () |
괄호 |
2 | - |
음수 또는 단항 연산자 |
3 | * , , / % |
곱하기 및 나누기 |
4 | + , - |
추가 및 빼기 |
5 | -band , -bnot |
비트 연산의 경우 |
5 | -bor , -bxor |
비트 연산의 경우 |
5 | -shr , -shl |
비트 연산의 경우 |
PowerShell은 선행 규칙에 따라 왼쪽에서 오른쪽으로 식을 처리합니다. 다음 예제에서는 우선 순위 규칙의 효과를 보여 줍니다.
3+6/3*4 # result = 11
3+6/(3*4) # result = 3.5
(3+6)/3*4 # result = 12
PowerShell에서 식을 평가하는 순서는 사용한 다른 프로그래밍 및 스크립팅 언어와 다를 수 있습니다. 다음 예제에서는 복잡한 대입 문을 보여 있습니다.
$a = 0
$b = @(1,2)
$c = @(-1,-2)
$b[$a] = $c[$a++]
이 예제에서 식 $a++
은 앞에 $b[$a]
계산됩니다. 계산하면 $a++
문$c[$a++]
에 사용된 후의 값이 변경되지만 이 값이 사용되기 전의 값 $a
이 변경됩니다$b[$a]
. 변수 $a
$b[$a]
는 같지 않고 0
같음입니다1
. 따라서 문은 값이 아닌 $b[0]
값을 $b[1]
할당합니다.
위의 코드는 다음과 같습니다.
$a = 0
$b = @(1,2)
$c = @(-1,-2)
$tmp = $c[$a]
$a = $a + 1
$b[$a] = $tmp
나누기 및 반올림
나누기 작업의 몫이 정수이면 PowerShell은 값을 가장 가까운 정수로 반올림합니다. 값이면 .5
가장 가까운 짝수 정수로 반올림됩니다.
다음 예제에서는 가장 가까운 짝수로 반올림하는 효과를 보여 있습니다.
PS> [int]( 5 / 2 ) # Result is rounded down
2
PS> [int]( 7 / 2 ) # Result is rounded up
4
클래스를 [Math]
사용하여 다른 반올림 동작을 가져올 수 있습니다.
PS> [int][Math]::Round(5 / 2,[MidpointRounding]::AwayFromZero)
3
PS> [int][Math]::Ceiling(5 / 2)
3
PS> [int][Math]::Floor(5 / 2)
2
자세한 내용은 Math.Round 메서드를 참조하세요.
결과를 수용하기 위한 형식 변환
PowerShell은 정밀도를 잃지 않고 결과를 가장 잘 표현하는 .NET 숫자 형식을 자동으로 선택합니다. 예시:
2 + 3.1
(2).GetType().FullName
(2 + 3.1).GetType().FullName
5.1
System.Int32
System.Double
작업의 결과가 형식에 비해 너무 크면 다음 예제와 같이 결과의 형식이 결과에 맞게 확장됩니다.
(512MB).GetType().FullName
(512MB * 512MB).GetType().FullName
System.Int32
System.Double
결과의 형식이 피연산자 중 하나와 항상 동일하지는 않습니다. 다음 예제에서는 음수 값을 부호 없는 정수로 캐스팅할 수 없으며 부호 없는 정수가 너무 커서 캐스팅할 Int32
수 없습니다.
([int32]::minvalue + [uint32]::maxvalue).gettype().fullname
System.Int64
이 예제에서는 Int64
두 형식을 모두 수용할 수 있습니다.
형식은 System.Decimal
예외입니다. 두 피연산자 중 하나에 10진수 형식이 있으면 결과는 10진수 형식입니다. 10진수 값에 대해 너무 큰 결과는 오류입니다.
PS> [Decimal]::maxvalue
79228162514264337593543950335
PS> [Decimal]::maxvalue + 1
RuntimeException: Value was either too large or too small for a Decimal.
전체 자릿수의 잠재적 손실
형식 범위를 초과하는 결과가 있을 때마다 형식 변환으로 인해 정밀도가 손실될 위험이 있습니다. 예를 들어 충분히 큰 [long]
[int]
피연산자를 추가하면 피연산자는 변환됩니다 [double]
. 이 예제에서는 9223372036854775807
정수의 최대값입니다 [long]
.
값에 추가하면 범위 [long]
가 오버플로됩니다.
PS> (9223372036854775807 + 2).GetType().FullName
System.Double
피연산자를 먼저 강제 [double]
변환했기 때문에 결과를 캐스팅하여 [ulong]
부정확한 결과를 생성합니다.
PS> [ulong](9223372036854775807 + 2)
9223372036854775808
먼저 더 큰 값을 [ulong]
정의하면 문제가 방지되고 올바른 결과가 생성됩니다.
PS> 9223372036854775807ul + 2
9223372036854775809
그러나 결과의 [double]
범위를 [ulong]
초과하면
PS> ([ulong]::MaxValue + 1).GetType().FullName
System.Double
Bigint 산술 연산
숫자에 대한 [bigint]
산술 연산을 수행할 때 PowerShell은 모든 피연산자를 변환하여 [bigint]
정수가 아닌 값이 잘리는 결과를 가져옵니다. 예를 들어 값은 [double]
변환[bigint]
될 때로 1
잘립니다.1.9
PS> [bigint]1 / 1.9
1
PS> 1 / [bigint]1.9
1
이 동작은 다른 숫자 형식의 동작과 다릅니다. 이 예제에서는 [int]
결과를 [double]
으로 [double]
나눕니다. 값으로 캐스팅 1.9
하면 [int]
값을 최대로 반올림합니다 2
.
PS> 1 / 1.9
0.526315789473684
PS> 1 / [int]1.9
0.5
숫자가 아닌 형식 추가 및 곱하기
숫자, 문자열, 배열 및 해시 테이블을 추가할 수 있습니다. 또한 숫자, 문자열 및 배열을 곱할 수 있습니다. 그러나 해시 테이블을 곱할 수는 없습니다.
문자열, 배열 또는 해시 테이블을 추가하면 요소가 연결됩니다. 배열 또는 해시 테이블과 같은 컬렉션을 연결할 때 두 컬렉션의 개체를 포함하는 새 개체가 만들어집니다. 키가 같은 해시 테이블을 연결하려고 하면 작업이 실패합니다.
예를 들어 다음 명령은 두 개의 배열을 만든 다음 추가합니다.
$a = 1,2,3
$b = "A","B","C"
$a + $b
1
2
3
A
B
C
다른 형식의 개체에 대해 산술 연산을 수행할 수도 있습니다. PowerShell이 수행하는 작업은 작업에서 가장 왼쪽 개체의 Microsoft .NET 형식에 의해 결정됩니다. PowerShell은 작업의 모든 개체를 첫 번째 개체의 .NET 형식으로 변환하려고 합니다. 개체를 변환하는 데 성공하면 첫 번째 개체의 .NET 형식에 적합한 작업을 수행합니다. 개체를 변환하지 못하면 작업이 실패합니다.
다음 예제에서는 다른 개체 형식을 포함하는 연산에서 더하기 및 곱하기 연산자를 사용하는 방법을 보여 줍니다.
$array = 1,2,3
$red = [ConsoleColor]::Red
$blue = [ConsoleColor]::Blue
"file" + 16 # result = "file16"
$array + 16 # result = 1,2,3,16
$array + "file" # result = 1,2,3,"file"
$array * 2 # result = 1,2,3,1,2,3
"file" * 3 # result = "filefilefile"
$blue + 3 # result = Red
$red - 3 # result = Blue
$blue - $red # result = -3
+ '123' # result = 123
문을 평가하는 데 사용되는 메서드는 맨 왼쪽 개체에 의해 결정되기 때문에 PowerShell의 추가 및 곱하기는 엄격하게 커밋되지 않습니다. 예를 들어 항상 (a + b)
같지 (b + a)
(ab)
는 않으며 항상 같지(ba)
는 않습니다.
다음 예제에서는 이 원칙을 보여 줍니다.
PS> "file" + 16
file16
PS> 16 + "file"
InvalidArgument: can't convert value "file" to type "System.Int32". Error:
"Input string wasn't in a correct format."
해시 테이블은 약간 다른 경우입니다. 추가된 해시 테이블에 중복 키가 없는 한 다른 해시 테이블에 해시 테이블을 추가할 수 있습니다.
다음 예제에서는 서로 해시 테이블을 추가하는 방법을 보여 줍니다.
$hash1 = @{a=1; b=2; c=3}
$hash2 = @{c1="Server01"; c2="Server02"}
$hash1 + $hash2
Name Value
---- -----
c2 Server02
a 1
b 2
c1 Server01
c 3
다음 예제에서는 두 해시 테이블에서 키 중 하나가 중복되어 오류를 throw합니다.
$hash1 = @{a=1; b=2; c=3}
$hash2 = @{c1="Server01"; c="Server02"}
$hash1 + $hash2
OperationStopped:
Line |
3 | $hash1 + $hash2
| ~~~~~~~~~~~~~~~
| Item has already been added. Key in dictionary: 'c' Key being added: 'c'
또한 배열에 해시 테이블을 추가할 수 있습니다. 및 전체 해시 테이블이 배열의 항목이 됩니다.
$array1 = @(0, "Hello World", [datetime]::Now)
$hash1 = @{a=1; b=2}
$array2 = $array1 + $hash1
$array2
0
Hello World
Monday, June 12, 2017 3:05:46 PM
Key : a
Value : 1
Name : a
Key : b
Value : 2
Name : b
그러나 해시 테이블에 다른 형식을 추가할 수는 없습니다.
$hash1 + 2
InvalidOperation: A hash table can only be added to another hash table.
더하기 연산자는 매우 유용하지만 할당 연산자를 사용하여 해시 테이블 및 배열에 요소를 추가합니다. 자세한 내용은 about_assignment_operators 참조하세요. 다음 예제에서는 대입 연산자를 +=
사용하여 배열에 항목을 추가합니다.
$array = @()
(0..2).foreach{ $array += $_ }
$array
0
1
2
산술 연산자 및 변수
산술 연산자를 변수와 함께 사용할 수도 있습니다. 연산자는 변수의 값에 따라 작동합니다. 다음 예제에서는 변수와 함께 산술 연산자를 사용하는 방법을 보여 줍니다.
PS> $intA = 6
PS> $intB = 4
PS> $intA + $intB
10
PS> $a = "Power"
PS> $b = "Shell"
PS> $a + $b
PowerShell
산술 연산자 및 명령
일반적으로 숫자, 문자열 및 배열이 있는 식에서 산술 연산자를 사용합니다. 그러나 명령이 반환하는 개체와 해당 개체의 속성과 함께 산술 연산자를 사용할 수도 있습니다.
다음 예제에서는 PowerShell 명령을 사용하여 식에서 산술 연산자를 사용하는 방법을 보여 줍니다.
(Get-Date) + (New-TimeSpan -day 1)
괄호 연산자는 cmdlet의 Get-Date
계산과 cmdlet 식의 New-TimeSpan -Day 1
계산을 해당 순서대로 강제합니다. 그런 다음 두 결과가 연산자를 사용하여 추가됩니다 +
.
Get-Process | Where-Object { ($_.ws * 2) -gt 50mb }
Handles NPM(K) PM(K) WS(K) VM(M) CPU(s) Id ProcessName
------- ------ ----- ----- ----- ------ -- -----------
1896 39 50968 30620 264 1,572.55 1104 explorer
12802 78 188468 81032 753 3,676.39 5676 OUTLOOK
660 9 36168 26956 143 12.20 988 PowerShell
561 14 6592 28144 110 1,010.09 496 services
3476 80 34664 26092 234 ...45.69 876 svchost
967 30 58804 59496 416 930.97 2508 WINWORD
위의 식에서 각 프로세스 작업 공간($_.ws
)은 곱하고 2
, 결과는 그보다 큰지 확인하기 위해 비교 50mb
됩니다.
비트 연산자
PowerShell은 비트 AND(), 포함 및 배타적 비트 OR 연산자(-band
-bor
및) 및 -bxor
bitwise-NOT(-bnot
)을 비롯한 표준 비트 연산자를 지원합니다.
PowerShell 2.0부터 모든 비트 연산자는 64비트 정수로 작동합니다.
PowerShell 3.0 -shr
부터 PowerShell에서 비트 산술 연산을 지원하기 위해 (shift-right) 및 -shl
(shift-left)가 도입되었습니다.
PowerShell은 다음 비트 연산자를 지원합니다.
Operator | 설명 | 식 | 결과 |
---|---|---|---|
-band |
비트 AND | 10 -band 3 |
2 |
-bor |
비트 OR(포함) | 10 -bor 3 |
11 |
-bxor |
비트 OR(배타적) | 10 -bxor 3 |
9 |
-bnot |
비트 NOT | -bNot 10 |
-11 |
-shl |
왼쪽으로 이동 | 102 -shl 2 |
408 |
-shr |
오른쪽으로 이동 | 102 -shr 1 |
51 |
비트 연산자는 값의 이진 형식에 따라 작동합니다. 예를 들어 숫자 10의 비트 구조는 00001010(1 바이트 기준)이고 숫자 3의 비트 구조는 00000011. 비트 연산자를 사용하여 10~3을 비교하면 각 바이트의 개별 비트가 비교됩니다.
비트 AND 연산에서는 두 입력 비트가 모두 1인 경우에만 결과 비트가 1로 설정됩니다.
1010 (10)
0011 ( 3)
-------------- bAND
0010 ( 2)
비트 OR(포함) 연산에서는 입력 비트 중 하나 또는 둘 다 1일 때 결과 비트가 1로 설정됩니다. 결과 비트는 두 입력 비트가 모두 0으로 설정된 경우에만 0으로 설정됩니다.
1010 (10)
0011 ( 3)
-------------- bOR (inclusive)
1011 (11)
비트 OR(배타적) 작업에서 결과 비트는 입력 비트가 1일 때만 1로 설정됩니다.
1010 (10)
0011 ( 3)
-------------- bXOR (exclusive)
1001 ( 9)
비트 NOT 연산자는 값의 이진 보수를 생성하는 단항 연산자입니다. 비트 1은 0으로 설정되고 비트 0은 1로 설정됩니다.
예를 들어 0의 이진 보수는 -1, 부호 없는 최대 정수(0xFFFFFFFF) 및 -1의 이진 보수는 0입니다.
-bNot 10
-11
0000 0000 0000 1010 (10)
------------------------- bNOT
1111 1111 1111 0101 (-11, 0xFFFFFFF5)
비트 시프트-왼쪽 작업에서 모든 비트는 "n" 위치를 왼쪽으로 이동하며 여기서 "n"은 오른쪽 피연산자의 값입니다. 0은 해당 위치에 삽입됩니다.
식 | 결과 | 이진 결과 |
---|---|---|
21 -shl 0 |
21 | 0001 0101 |
21 -shl 1 |
42 | 0010 1010 |
21 -shl 2 |
84 | 0101 0100 |
비트 시프트 오른쪽 작업에서 모든 비트는 오른쪽 피연산자에서 "n"을 지정하는 "n" 위치로 이동합니다. 시프트-오른쪽 연산자(-shr
)는 부호 있는 값을 이동할 때 가장 왼쪽에 있는 위치에 부호 비트를 복사합니다. 부호 없는 값의 경우 맨 왼쪽 위치에 0이 삽입됩니다.
식 | 결과 | 이진 | 16진수 |
---|---|---|---|
21 -shr 0 |
21 | 00010101 | 0x15 |
21 -shr 1 |
10 | 00001010 | 0x0A |
21 -shr 2 |
5 | 00000101 | 0x05 |
21 -shr 31 |
0 | 00000000 | 0x00 |
21 -shr 32 |
21 | 00010101 | 0x15 |
21 -shr 64 |
21 | 00010101 | 0x15 |
21 -shr 65 |
10 | 00001010 | 0x0A |
21 -shr 66 |
5 | 00000101 | 0x05 |
[int]::MaxValue -shr 1 |
1073741823 | 00111111111111111111111111111111 | 0x3FFFFFFF |
[int]::MinValue -shr 1 |
-1073741824 | 11000000000000000000000000000000 | 0xC0000000 |
-1 -shr 1 |
-1 | 11111111111111111111111111111111 | 0xFFFFFFFF |
(-21 -shr 1) |
-11 | 11111111111111111111111111110101 | 0xFFFFFFF5 |
(-21 -shr 2) |
-6 | 11111111111111111111111111111010 | 0xFFFFFFF4 |
참고 항목
PowerShell
피드백
https://aka.ms/ContentUserFeedback
출시 예정: 2024년 내내 콘텐츠에 대한 피드백 메커니즘으로 GitHub 문제를 단계적으로 폐지하고 이를 새로운 피드백 시스템으로 바꿀 예정입니다. 자세한 내용은 다음을 참조하세요.다음에 대한 사용자 의견 제출 및 보기