about_Ref
간단한 설명
참조 형식 변수를 만들고 사용하는 방법을 설명합니다.
자세한 설명
참조 또는 값으로 함수에 변수를 전달할 수 있습니다. 변수 를 값으로 전달하면 데이터 복사본이 전달됩니다. 변수 를 참조로 전달하면, 원래 값에 대한 참조를 전달하는 것입니다.
이렇게 하면 함수가 전달된 변수의 값을 변경할 수 있습니다. 참조 형식은 [ref]
형식의 형식 가속기인 [System.Management.Automation.PSReference]
사용하여 만들어집니다.
[ref]
주요 목적은 ref
, out
또는 in
표시된 .NET 메서드 매개 변수를 참조하여 PowerShell 변수를 전달할 수 있도록 하는 것입니다.
[ref]
형식 매개 변수를 사용하는 고유한 PowerShell 함수를 정의할 수도 있습니다. 이 사용에서는 [ref]
변수적용되며 결과 [ref]
인스턴스를 사용하여 해당 변수의 값을 간접적으로 수정할 수 있습니다.
다음 예제에서 함수는 전달된 변수의 값을 변경합니다. PowerShell에서 정수는 값 형식이므로 값으로 전달됩니다.
따라서 값 $var
은 함수 범위 외부에서 변경되지 않습니다.
Function Test($data)
{
$data = 3
}
$var = 10
Test -data $var
$var
10
다음 예제에서는 a를 포함하는 변수가 Hashtable
함수에 전달됩니다.
참조로 변수를 전달할 때 함수는 데이터를 변경할 수 있으며 함수가 실행된 후에도 해당 변경 내용이 유지됩니다.
Function Test($data)
{
$data.Test = "New Text"
}
$var = @{}
Test -data $var
$var
Name Value
---- -----
Test New Text
함수는 함수 범위 외부에 유지되는 새 키-값 쌍을 추가합니다.
참조 매개 변수를 허용하는 함수 작성
전달된 데이터 형식에 관계없이 매개 변수를 참조로 사용하도록 함수를 코딩할 수 있습니다. 이렇게 하려면 매개 변수 형식을 [ref]
지정해야 합니다.
참조를 사용할 때는 형식의 Value
[ref]
속성을 사용하여 데이터에 액세스해야 합니다.
function Test {
param([ref]$data)
$data.Value = 3
}
참조가 예상되는 매개 변수에 변수를 전달하려면 변수를 참조로 캐스팅하도록 입력해야 합니다.
중요하다
대괄호와 괄호는 모두 필요합니다.
$var = 10
Test -data ([ref]$var)
$var
3
.NET 메서드에 참조 전달
일부 .NET 메서드는 변수를 참조로 전달해야 할 수 있습니다. 메서드의 정의에서 키워드 또는 in
out
ref
매개 변수를 사용하는 경우 참조가 예상됩니다.
[int] | Get-Member -Static -Name TryParse
Name MemberType Definition
---- ---------- ----------
TryParse Method static bool TryParse(string s, [ref] int result)
메서드는 TryParse
문자열을 정수로 구문 분석하려고 시도합니다. 메서드가 성공하면 반환$true
되고 결과는 참조로 전달한 변수에 저장됩니다.
PS> $number = 0
PS> [int]::TryParse("15", ([ref]$number))
True
PS> $number
15
참조 및 범위
참조를 사용하면 부모 범위의 변수 값을 자식 범위 내에서 변경할 수 있습니다.
# Create a value type variable.
$i = 0
# Create a reference type variable.
$iRef = [ref]0
# Invoke a scriptblock to attempt to change both values.
&{$i++;$iRef.Value++}
# Output the results.
"`$i = $i;`$iRef = $($iRef.Value)"
$i = 0;$iRef = 1
참조 형식의 변수만 변경되었습니다.
범용 객체 보관용으로 [ref]
사용
[ref]
를 범용 개체 보관함으로도 사용할 수 있습니다. 이 사용에서 [ref]
은 변수 대신 값에 적용됩니다. 일반적으로 값은 숫자와 같이
예를 들어 스크립트 블록 매개 변수 값을 사용하여 cmdlet의 Rename-Item
매개 변수 값을 계산할 수 있습니다.
Rename-Item
cmdlet을 사용하면 항목을 파이프로 전달할 수 있습니다. 이 명령은 파이프라인의 각 항목에 전달된 스크립트 블록을 NewName 명령을 통해 실행합니다. 스크립트 블록은 자식 범위에서 실행됩니다. 호출자의 범위에서 변수를 직접 수정하는 것은 도움이 되지 않으며 이 컨텍스트에서 스크립트 블록에 인수를 전달할 수 없습니다.
이 예제에서 NewName 매개 변수에 전달된 스크립트 블록은 파이프라인의 각 항목에 대한 $iRef
값을 증가합니다. 스크립트 블록은 파일 이름의 시작 부분에 숫자를 추가하여 새 이름을 만듭니다.
$iRef = [ref] 0
Get-ChildItem -File $setPath |
Rename-Item -NewName { '{0} - {1}' -f $iRef.Value++,$_.Name }
[ref]
[System.Management.Automation.PSReference]
간의 차이
참조 형식 변수는 [ref]
형식 가속기를 사용하거나 [System.Management.Automation.PSReference]
형식을 직접 지정하여 생성됩니다.
[ref]
는 [System.Management.Automation.PSReference]
의 타입 가속기이지만, 서로 다르게 작동합니다.
-
[ref]
사용하여 변수를 캐스팅하는 경우 PowerShell은 변수의 원래 인스턴스에 대한 참조를 포함하는 참조 개체를 만듭니다. -
[System.Management.Automation.PSReference]
사용하여 변수를 캐스팅하는 경우 PowerShell은 원래 인스턴스에 대한 참조가 아닌 변수의 복사본을 포함하는 참조 개체를 만듭니다.
예를 들어 다음 스크립트는 변수 $x
두 개의 참조 개체를 만듭니다.
PS> $int = 1
PS> $aRef = [ref] $int
PS> $bRef = [System.Management.Automation.PSReference] $int
PS> $int
1
PS> $aRef, $bRef
Value
-----
1
1
이 시점에서 두 참조 개체는 $int
과 동일한 값을 가집니다. 참조 개체에 다른 값을 추가하면, $aRef
을 사용하여 생성된 [ref]
가 $int
의 원래 인스턴스에 대한 참조임을 알 수 있습니다.
$bRef
은 [System.Management.Automation.PSReference]
을 사용하여 만든 변수의 복사본입니다.
PS> $aRef.Value+=2
PS> $bRef.Value+=5
PS> $int
3
PS> $aRef, $bRef
Value
-----
3
6
참고 항목
PowerShell