함수 (Functions) - 함수 인수 라벨과 파라미터 이름 (Function Argument Labels and Parameter Names)

00yhsp·2024년 4월 7일

각 함수 파라미터는 인수 라벨 (argument label) 과 파라미터 이름 (parameter name) 을 가지고 있다. 인수 라벨은 함수가 호출될 때 사용되고 각 인수는 함수 호출 시 인수 라벨 다음에 작성한다. 파라미터 이름은 함수를 구현할 때 사용된다. 기본적으로 파라미터는 인수 라벨로 파라미터 이름을 사용한다.

func someFunction(firstParameterName: Int, secondParameterName: Int) {
    // In the function body, firstParameterName and secondParameterName
    // refer to the argument values for the first and second parameters.
}
someFunction(firstParameterName: 1, secondParameterName: 2)

모든 파라미터는 유니크한 이름을 가져야 한다. 여러 파라미터에 동일한 인수 라벨을 가질 수 있지만 유니크한 인수 라벨은 코드를 더욱 읽기 편하게 해준다.

인수 라벨 지정 (Specifying Argument Labels)

공백으로 구분하여 파라미터 이름 앞에 인수 라벨을 작성한다.

func someFunction(argumentLabel parameterName: Int) {
    // In the function body, parameterName refers to the argument value
    // for that parameter.
}

다음은 사람의 이름과 고향을 가져와 인사말을 반환하는 greet(person:) 함수의 변형이다.

func greet(person: String, from hometown: String) -> String {
    return "Hello \(person)!  Glad you could visit from \(hometown)."
}
print(greet(person: "Bill", from: "Cupertino"))
// Prints "Hello Bill!  Glad you could visit from Cupertino."

인수 라벨을 사용하면 문장과 같은 표현방식으로 함수를 호출할 수 있는 동시에 읽기 쉽고 의도가 명확한 함수 본문을 제공할 수 있다.

인수 라벨 생략 (Omitting Argument Labels)

파라미터에 인수 라벨을 원치 않으면 명시적인 인수 라벨 대신에 언더바 (_)를 작성한다.

func someFunction(_ firstParameterName: Int, secondParameterName: Int) {
    // In the function body, firstParameterName and secondParameterName
    // refer to the argument values for the first and second parameters.
}
someFunction(1, secondParameterName: 2)

파라미터가 인수 라벨을 가지고 있다면 함수를 호출할 때 인수는 반드시 라벨을 지정해야 한다.

파라미터 기본값 (Default Parameter Values)

파라미터의 타입 뒤에 파라미터 값을 할당하여 함수의 파라미터에 기본값 (default value) 을 정의할 수 있다. 기본값이 정의되어 있다면 함수를 호출할 때 파라미터를 생략할 수 있다.

func someFunction(parameterWithoutDefault: Int, parameterWithDefault: Int = 12) {
    // If you omit the second argument when calling this function, then
    // the value of parameterWithDefault is 12 inside the function body.
}
someFunction(parameterWithoutDefault: 3, parameterWithDefault: 6) // parameterWithDefault is 6
someFunction(parameterWithoutDefault: 4) // parameterWithDefault is 12

가변 파라미터 (Variadic Parameters)

가변 파라미터 (variadic parameter) 는 0개 이상의 특정 타입의 값을 허용한다. 함수가 호출될 때 여러개의 입력값이 전달될 수 있는 특정 파라미터는 가변 파라미터를 사용한다. 가변 파라미터는 파라미터의 타입 이름 뒤에 세개의 간격 문자 (...)를 추가하여 작성한다.

가변 파라미터에 전달된 값은 함수 본문 내에서 적절한 타입의 배열로 사용할 수 있다. 예를 들어 numbers 라는 이름과 Double... 타입을 가진 가변 파라미터는 함수 본문 내에서 [Double] 타입의 numbers 라 불리는 상수 배열로 사용할 수 있다.

아래 예제는 길이에 관계없이 숫자 리스트에 대한 산술 평균 을 계산한다.

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)
// returns 3.0, which is the arithmetic mean of these five numbers
arithmeticMean(3, 8.25, 18.75)
// returns 10.0, which is the arithmetic mean of these three numbers

함수는 여러개의 가변 파라미터를 가질 수 있다. 가변 파라미터 뒤에 오는 첫번째 파라미터는 인수 라벨을 가지고 있어야 한다. 인수 라벨은 가변 파라미터에 전달되는 인수와 가변 파라미터 뒤에 오는 파라미터에 전달되는 인수를 명확하게 한다.

In-Out 파라미터 (In-Out Parameters)

함수 파라미터는 기본적으로 상수이다. 해당 함수의 본문 내에서 함수 파라미터 값을 변경하려고 하면 컴파일 타입 에러가 발생한다. 이것은 실수로 파라미터의 값을 변경할 수 없다는 것을 의미한다. 함수의 파라미터 값을 변경하고 함수 호출이 종료된 후에도 이러한 변경된 값을 유지하고 싶다면 in-out 파라미터 (in-out parameter) 로 대신 정의해야 한다.

in-out 파라미터는 파라미터의 타입 바로 전에 inout 키워드를 작성한다. in-out 파라미터는 함수로 전달하는 값을 가지고 있고 함수로 부터 이 값을 수정하고 원래 값을 대체하기위해 함수 밖으로 다시 되돌려 준다.

in-out 파라미터의 인수로 변수만 전달할 수 있다. 상수와 반복은 수정할 수 없기 때문에 인수로 상수 또는 반복 값은 전달할 수 없다. 함수에 수정가능함을 알리기 위해 in-out 파라미터에 인수로 전달할 때 변수의 이름 앞에 앰퍼샌드 (&)를 붙여 준다.

Note:
in-out 파라미터는 기본값을 가질 수 없고 가변 파라미터는 inout 으로 표기할 수 없다.

다음 예제의 함수는 a 와 b 라 하는 2개의 in-out 정수 파라미터를 가지는 swapTwoInts(::)이다.

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

swapTwoInts(::) 함수는 간단하게 b 의 값을 a 로 a 의 값을 b 로 바꾼다. 이 함수는 a 의 값을 temporaryA 라 하는 임시 상수에 저장하고 b 의 값을 a 에 할당하고 temporaryA 의 값을 b 에 할당한다.

Int 타입의 바꿀 2개의 변수를 이용하여 swapTwoInts(::) 함수를 호출할 수 있다. swapTwoInts(::) 함수에 전달할 때 someInt 와 anotherInt 의 이름 앞에 앰퍼샌드를 붙여야 한다.

var someInt = 3
var anotherInt = 107
swapTwoInts(&someInt, &anotherInt)
print("someInt is now \(someInt), and anotherInt is now \(anotherInt)")
// Prints "someInt is now 107, and anotherInt is now 3"

위의 예제는 someInt 와 anotherInt 의 기본값이 함수의 바깥에서 정의되었지만 swapTwoInts(::) 함수로 인해 원래값이 수정되는 것을 보여 준다.

Note:
in-out 파라미터는 함수에서 값을 반환하는 것과 다르다. 위의 swapTwoInts 예제는 반환 타입을 정의하거나 값을 반환하지 않지만 someInt 와 anotherInt 의 값은 여전히 수정한다. In-out 파라미터는 함수가 함수 본문의 범위를 벗어나 영향을 미치는 다른 방법이다.

profile
iOS Dev

0개의 댓글