이 포스트는 야곰님의 Swift 프로그래밍 2판을 보고 스스로 공부한 내용을 정리한 포스트 입니다.


예제 코드


참고 자료


매개변수 기본값 (Default Parameter Value)

  • 스위프트의 함수에서는 매개변수(Parameter)마다 기본값(Default Value)을 지정할 수 있다.

    • 즉, 매개변수가 전달되지 않으면 기본값을 사용한다.
  • 매개변수 기본값이 있는 함수는 함수를 중복 정의(Overload)한 것처럼 사용 할 수 있다.


매개변수 기본값이 있는 함수의 정의와 사용

defaultParameterValuesImage-1

  • 기본값이 없는 매개변수를 기본값이 있는 매개변수 앞에 사용.

    • 기본값이 없는 매개변수는 대체로 함수를 사용함에 있어 중요한 값을 전달할 가능성이 높다.

    • 무엇보다 기본값이 있는지와 없는지 상관 없이 중요한 매개변수는 앞쪽에 배치하는 것이 좋다.


가변 매개변수와 입출력 매개변수 (Variadic Parameters and In-Out Parameters)

  • 매개변수로 몇 개의 값이 들어올지 모를 때, 가변 매개변수(Variadic Parameter)을 사용할 수 있다.

  • 가변 매개변수(Variadic Parameter)는 0개 이상(0개 포함)의 값을 받아올 수 있다.

  • 가변 매개변수로 들어온 인자 값은 배열처럼 사용이 가능하다.

  • 함수마다 가변 매개변수는 하나만 가질 수 있다.


가변 매개변수를 가지는 함수의 정의와 사용

variadicParameterImage-1


입출력 매개변수(In-Out Parameter)

  • 함수의 전달인자(Argument)로 값을 전달할 때는 보통 값을 복사해서 전달한다.

  • 값이 아닌 참조를 전달하려면 입출력 매개변수(In-Out Parameter)를 사용한다.

  • 값 타입 데이터의 참조를 전달인자(Argument)로 보내면 함수 내부에서 참조하여 원래 값을 변경한다.

    • C 언어의 포인터와 유사하다.

    • 이 방법은 함수 외부의 값에 어떤 영향을 줄지 모르기 때문에 함수형 프로그래밍 패러다임에서는 지양하는 패턴이다.

    • 객체지향 프로그래밍 패러다임을 사용하는 애플의 프레임워크(iOS, macOS등)에서는 유용할 수 있지만, 애플 프레임워크를 벗어난 다른 환경에서 함수형 프로그래밍 패러다임을 사용할 때는 입출력 매개변수(In-Out Parameter)를 사용하지 않는 것이 좋다.

  • 입출력 매개변수의 전달 순서는 다음과 같다.

    • 1), 함수를 호출할 때, 전달인자의 값을 복사한다.

    • 2), 해당 전달인자의 값을 변경하면 1에서 복사한 것을 함수 내부에서 변경한다.

    • 3), 함수를 반환하는 시점에 2에서 변경된 값을 원래의 매개변수에 할당한다.

  • `연산 프로퍼티 또는 감시자가 있는 프로퍼티가 입출력 매개변수(In-Out Parameter)로 전달된다면, 함수 호출 시점에 그 프로퍼티의 접근자가 호출되고 함수의 반환 시점에 프로퍼티의 설정자가 호출된다.

    • 위의 명시된 '입출력 매개변수의 전달 순서'와 '연산 프로퍼티와 프로퍼티 감시자의 접근자, 설정자 호출 순서' 이 두 가지를 함께 생각하면 이해하기 쉽다.
  • 참조는 inout 매개변수로 전달될 변수 또는 상수 앞에 앰퍼샌드(&)를 붙여서 표현한다.

  • 입출력 매개변수는 매개변수 기본값을 가질 수 없으며, 가변 매개변수로 사용될 수 없다.

  • 또한, 상수는 변경될 수 없으므로 입출력 매개변수의 전달인자로 사용될 수 없다.


inout 매개변수의 활용

inoutParameterImage-1

class Person {
    var height: Float = 0.0
    var weight: Float = 0.0
}

var jun: Person = Person()

// 참조 타임의 inout 매개변수 사용은 더욱 주의해야 한다.
// C 언어의 이중 포인터와 유사하게 동작한다.
func reference(_ person: inout Person) {
    person.height = 130 // 이렇게 사용하면 기존 참조 매개변수처럼 동작하지만
    print(jun.height) // 130
    person = Person() // 이렇게 다른 인스턴스를 할당하면 참조 자체가 변경되어 버린다.
}

reference(&jun)
jun.height // 0 - 함수 안에서 새로운 인스턴스가 할당되었기 때문에 위 jun과 다른 참조를 갖는다.