🔥 함수 인자 레이블과 매개변수 이름

812자
10분

Swift에서 함수를 정의할 때, 각 매개변수는 인자 레이블(argument label)매개변수 이름(parameter name)을 가지고 있습니다. Argument label은 함수를 호출할 때 사용되며, parameter name은 함수의 구현 내에서 사용됩니다. 기본적으로 매개변수는 자신의 매개변수 이름을 인자 레이블로 사용합니다.

func someFunction(firstParameterName: Int, secondParameterName: Int) {
    // 함수 내부에서 firstParameterName과 secondParameterName은
    // 첫 번째와 두 번째 매개변수의 값을 참조합니다.
}
someFunction(firstParameterName: 1, secondParameterName: 2)
swift

모든 매개변수는 고유한 이름을 가져야 합니다. 여러 매개변수가 동일한 인자 레이블을 가질 수는 있지만, 고유한 인자 레이블을 사용하면 코드의 가독성이 향상됩니다.

인자 레이블 지정하기

매개변수 이름 앞에 공백으로 구분하여 인자 레이블을 작성할 수 있습니다.

func someFunction(argumentLabel parameterName: Int) {
    // 함수 내부에서 parameterName은 해당 매개변수의 값을 참조합니다.
}
swift

다음은 사람의 이름과 고향을 받아 인사말을 반환하는 greet(person:from:) 함수의 변형입니다.

func greet(person: String, from hometown: String) -> String {
    return "Hello \(person)!  Glad you could visit from \(hometown)."
}
print(greet(person: "Bill", from: "Cupertino"))
// "Hello Bill!  Glad you could visit from Cupertino."를 출력합니다.
swift

인자 레이블을 사용하면 함수를 호출할 때 표현력 있고 문장과 유사한 방식으로 호출할 수 있으며, 동시에 함수 내부의 코드는 읽기 쉽고 의도가 명확하게 유지됩니다.

인자 레이블 생략하기

매개변수에 대해 인자 레이블을 사용하고 싶지 않다면, 해당 매개변수의 인자 레이블 대신 underscore(_)를 작성하면 됩니다.

func someFunction(_ firstParameterName: Int, secondParameterName: Int) {
    // 함수 내부에서 firstParameterName과 secondParameterName은
    // 첫 번째와 두 번째 매개변수의 값을 참조합니다.
}
someFunction(1, secondParameterName: 2)
swift

매개변수에 인자 레이블이 있다면, 함수를 호출할 때 반드시 해당 인자 레이블을 사용해야 합니다.

기본 매개변수 값

함수의 매개변수에 대해 default value를 정의할 수 있습니다. 매개변수의 타입 뒤에 값을 할당하여 기본값을 정의합니다. 기본값이 정의되어 있다면, 함수를 호출할 때 해당 매개변수를 생략할 수 있습니다.

func someFunction(parameterWithoutDefault: Int, parameterWithDefault: Int = 12) {
    // 함수를 호출할 때 두 번째 인자를 생략하면,
    // 함수 내부에서 parameterWithDefault의 값은 12가 됩니다.
}
someFunction(parameterWithoutDefault: 3, parameterWithDefault: 6) // parameterWithDefault는 6
someFunction(parameterWithoutDefault: 4) // parameterWithDefault는 12
swift

기본값이 없는 매개변수는 함수의 매개변수 목록 앞쪽에, 기본값이 있는 매개변수보다 먼저 위치시키는 것이 좋습니다. 기본값이 없는 매개변수는 보통 함수의 의미에 더 중요하므로, 이를 먼저 작성하면 기본 매개변수가 생략되더라도 동일한 함수가 호출되고 있음을 쉽게 인식할 수 있습니다.

가변 매개변수

Variadic parameter는 지정된 타입의 값을 0개 이상 받아들입니다. Variadic parameter를 사용하면 함수를 호출할 때 가변적인 수의 입력값을 전달할 수 있습니다. Variadic parameter는 매개변수의 타입 이름 뒤에 세 개의 점(...)을 삽입하여 작성합니다.

Variadic parameter로 전달된 값들은 함수 내부에서 적절한 타입의 배열로 사용할 수 있습니다. 예를 들어, numbers라는 이름의 Double... 타입의 variadic parameter는 함수 내부에서 [Double] 타입의 상수 배열 numbers로 사용할 수 있습니다.

다음 예제는 길이에 상관없이 숫자 목록의 산술 평균(arithmetic mean)을 계산합니다.

func arithmeticMean(_ numbers: Double...) -> Double {
    var total: Double = 0
    for number in numbers {
        total += number
    }
    return total / Double(numbers.count)
}
arithmeticMean(1, 2, 3, 4, 5)
// 이 다섯 개의 숫자에 대한 산술 평균인 3.0을 반환합니다.
arithmeticMean(3, 8.25, 18.75)
// 이 세 개의 숫자에 대한 산술 평균인 10.0을 반환합니다.
swift

함수는 여러 개의 variadic parameter를 가질 수 있습니다. Variadic parameter 다음에 오는 첫 번째 매개변수는 반드시 인자 레이블을 가져야 합니다. 인자 레이블은 어떤 인자가 variadic parameter로 전달되고, 어떤 인자가 variadic parameter 다음에 오는 매개변수로 전달되는지 명확하게 해줍니다.

In-Out 매개변수

함수의 매개변수는 기본적으로 상수입니다. 함수 내부에서 매개변수의 값을 변경하려고 하면 컴파일 타임 오류가 발생합니다. 이는 실수로 매개변수의 값을 변경하는 것을 방지해줍니다. 함수가 매개변수의 값을 수정하고, 함수 호출이 끝난 후에도 그 변경사항이 유지되기를 원한다면, 해당 매개변수를 in-out parameter로 정의하면 됩니다.

In-out parameter는 매개변수의 타입 바로 앞에 inout 키워드를 작성하여 정의합니다. In-out parameter는 함수로 전달된 값을 가지며, 함수에 의해 수정되고, 함수에서 반환되어 원래의 값을 대체합니다. In-out parameter의 동작과 관련된 컴파일러 최적화에 대한 자세한 내용은 In-Out Parameters를 참조하세요.

In-out parameter의 인자로는 변수만 전달할 수 있습니다. 상수나 리터럴 값은 인자로 전달할 수 없는데, 이는 상수와 리터럴은 수정할 수 없기 때문입니다. In-out parameter에 인자로 변수를 전달할 때는, 함수에 의해 수정될 수 있음을 나타내기 위해 변수 이름 바로 앞에 앰퍼샌드(&)를 붙입니다.

다음은 ab라는 두 개의 in-out 정수 매개변수를 가진 swapTwoInts(_:_:) 함수의 예시입니다.

func swapTwoInts(_ a: inout Int, _ b: inout Int) {
    let temporaryA = a
    a = b
    b = temporaryA
}
swift

swapTwoInts(_:_:) 함수는 단순히 b의 값을 a에, a의 값을 b에 교환합니다. 이 함수는 a의 값을 임시 상수 temporaryA에 저장하고, b의 값을 a에 할당한 다음, temporaryAb에 할당하는 방식으로 교환을 수행합니다.

Int 타입의 두 변수로 swapTwoInts(_:_:) 함수를 호출하여 값을 교환할 수 있습니다. someIntanotherInt의 이름 앞에 앰퍼샌드가 붙어 있는 것에 주목하세요. 이는 swapTwoInts(_:_:) 함수에 전달될 때 해당 변수들이 수정될 수 있음을 나타냅니다.

var someInt = 3
var anotherInt = 107
swapTwoInts(&someInt, &anotherInt)
print("someInt is now \(someInt), and anotherInt is now \(anotherInt)")
// "someInt is now 107, and anotherInt is now 3"을 출력합니다.
swift

위 예제는 원래 함수 외부에서 정의되었던 someIntanotherInt의 원래 값이 swapTwoInts(_:_:) 함수에 의해 수정되었음을 보여줍니다.

이렇게 Swift에서는 다양한 방식으로 함수의 매개변수를 정의하고 사용할 수 있습니다. 인자 레이블과 매개변수 이름을 적절히 활용하면 함수의 의도를 명확히 표현하면서도 가독성 높은 코드를 작성할 수 있어요. 또한 기본값을 가진 매개변수, variadic parameter, in-out parameter 등을 통해 함수의 유연성과 활용성을 높일 수 있습니다.