about_Return — return 키워드

about_Return — return 키워드

함수를 짜다 보면 "여기까지만 하고 그만 나가고 싶다" 하는 순간이 있어요. 그럴 때 쓰는 키워드가 바로 return이예요. 현재 스코프(scope)를 빠져나가는 역할을 하는데, 함수·스크립트·스크립트블록 어디에서든 동작해요. 스코프를 나가는 방법이 왜 필요하고, PowerShell에서 return이 정확히 무슨 일을 하는지 차근차근 볼게요.

출처: https://learn.microsoft.com/en-us/powershell/module/microsoft.powershell.core/about/about_return

본문

간단히 말하면

return 키워드는 함수, 스크립트, 스크립트블록을 빠져나가요. 특정 지점에서 스코프를 나가거나, 값을 돌려주거나, 스코프의 끝에 도달했음을 알리는 데 쓸 수 있어요.

C나 C# 같은 언어에 익숙한 분이라면 return으로 "나는 여기서 나간다"는 논리를 명시적으로 만들어 두고 싶을 거예요. 그런데 PowerShell은 조금 다르다는 점을 먼저 짚어둘게요.

PowerShell에서는 return 키워드가 없어도 각 문(statement)의 실행 결과가 그대로 출력으로 반환돼요. C나 C#은 return 키워드로 지정한 값만 돌려주는 것과는 대조적이죠.

참고 — PowerShell 5.0부터는 공식 문법을 이용해 클래스를 정의할 수 있는 언어가 추가됐어요. 클래스 메서드 안에서는 return 문으로 지정한 것 외에는 아무것도 출력되지 않아요. PowerShell 클래스에 대해 더 알고 싶다면 about_Classes를 참고하세요.

문법

return 키워드의 문법은 다음과 같아요.

return [<expression>]

return은 단독으로 쓰일 수도 있고, 뒤에 값이나 식을 붙일 수도 있어요.

return
return $a
return (2 + $a)

예제

조건을 만족하면 특정 지점에서 함수를 빠져나가도록 하는 예제를 볼게요. 짝수만 곱해주는 함수가 있다고 해볼게요. 홀수는 return 문이 그 아래 문장보다 먼저 실행되면서 빠져나가므로 곱해지지 않아요.

function MultiplyEven
{
    param($Number)

    if ($Number % 2) { return "$Number is not even" }
    $Number * 2
}

1..10 | ForEach-Object {MultiplyEven -Number $_}

실행 결과는 이렇게 나와요.

1 is not even
4
3 is not even
8
5 is not even
12
7 is not even
16
9 is not even
20

PowerShell에서는 return 키워드를 쓰지 않아도 값이 반환될 수 있어요. 각 문의 결과가 반환되기 때문이죠. 예를 들어 다음 문장들은 $a 변수의 값을 반환해요.

$a
return

다음 문장도 $a의 값을 반환해요.

return $a

함수가 계산을 수행하고 있다는 걸 사용자에게 알려주려는 문장이 포함된 다음 예제를 볼게요.

function Calculation {
    param ($Value)

    "Please wait. Working on calculation..."
    $Value += 73
    return $Value
}

$a = Calculation 14

여기서 "Please wait. Working on calculation..." 문자열은 화면에 표시되지 않아요. 대신 아래처럼 $a 변수에 할당돼요.

PS> $a
Please wait. Working on calculation...
87

안내용 문자열과 계산 결과가 모두 함수에서 반환되어 $a 변수에 담긴 거예요.

함수 안에서 메시지를 화면에 보여주고 싶다면, PowerShell 5.0부터는 Information 스트림을 사용할 수 있어요. 아래 코드는 위 예제를 Write-Information cmdlet과 -InformationAction Continue를 이용해 고친 버전이에요.

function Calculation {
    param ($Value)

    Write-Information "Please wait. Working on calculation..." -InformationAction Continue
    $Value += 73
    return $Value
}

이제 정보 메시지는 호스트(host)에 표시되고 변수에는 할당되지 않아요.

PS> $a = Calculation 14
Please wait. Working on calculation...
PS> $a
87

반환 값과 파이프라인

스크립트블록이나 함수에서 컬렉션(collection)을 반환하면, PowerShell은 자동으로 멤버를 펼쳐서(unroll) 파이프라인으로 하나씩 내려보내요. PowerShell이 한 번에 하나씩 처리하기 때문이죠. 자세한 내용은 about_Pipelines를 참고하세요.

이 개념은 숫자 배열을 반환하는 다음 예제 함수로 확인할 수 있어요. 함수의 출력은 파이프라인의 개체 수를 세는 Measure-Object cmdlet으로 전달돼요.

function Test-Return
{
    $array = 1,2,3
    return $array
}
Test-Return | Measure-Object

실행 결과:

Count    : 3
Average  :
Sum      :
Maximum  :
Minimum  :
Property :

스크립트블록이나 함수가 컬렉션을 하나의 개체로 파이프라인에 내려보내고 싶다면 다음 두 방법 중 하나를 써요.

  • 단항 배열 식(Unary array expression) — 단항 식을 이용하면 반환 값을 파이프라인으로 단일 개체로 보낼 수 있어요.
function Test-Return
{
    $array = 1,2,3
    return (, $array)
}
Test-Return | Measure-Object

실행 결과:

Count    : 1
Average  :
Sum      :
Maximum  :
Minimum  :
Property :
  • Write-OutputNoEnumerate 매개 변수Write-Output cmdlet을 NoEnumerate 매개 변수와 함께 쓸 수도 있어요. 아래 예제는 Measure-Object cmdlet으로 return 키워드가 파이프라인으로 보낸 개체 수를 세는 모습이에요.
function Test-Return
{
    $array = 1, 2, 3
    return Write-Output -NoEnumerate $array
}

Test-Return | Measure-Object

실행 결과:

Count    : 1
Average  :
Sum      :
Maximum  :
Minimum  :
Property :

더 알아보기