다음을 통해 공유


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 메서드는 변수를 참조로 전달해야 할 수 있습니다. 메서드의 정의에서 키워드 또는 inoutref 매개 변수를 사용하는 경우 참조가 예상됩니다.

[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

참고 항목