함수

  • 특정 작업을 수행하는 독립적인 코드 덩어리다.
  • 함수가 하는 일을 식별하는 이름을 지정하며, 필요할 때 이 이름을 호출하여 작업을 수행한다.

함수 키워드

// num1, num2: Argument Label(파라미터를 외부에서 볼 때, 함수 호출 시 사용하려는 이름)
// a, b: parameter
// _(Argumant Label 생략하고 싶을 때) : 와일드카드 패턴
func plusFunc(num1 a: Int, num2: b: Int) -> Int {

}

// Int...: 가변 파라미터(Variadic Parameters)로 정해지지 않은 여러개의 파라미터를 받을 때
// num: Int = 5: 기본값 설정
func plusFunc(numbers: Int..., num: Int = 5) -> Int {

}

함수 오버로딩

func do(value: Int) {}
func do(value: Double) {}
func do(value: String) {}
  • swift는 1) 함수 이름, 2) 파라미터수/타입, 3) Argument Label, 4) 리턴타입을 모두 포함해서 함수를 식별하는 Overloading을 지원한다.
  • 하나의 함수 이름에 여러개의 함수를 대응 시킬 수 있다.

inout

var first = 10
var second = 20

func swap(_ a: inout Int, _ b: inout Int) {
    // 2. 함수 내부에서 복사된 값을 변경
    let temp = a
    a = b
    b = temp
}

// 1. copy-in: first, second의 값이 함수 내부로 복사됨
swap(&first, &second)

// 3. copy-out: 함수 내부에서 변경된 값이 다시 first, second에 반영됨
print("firstInt is now \(first), and secondInt is now \(second)")
  • 함수의 파라미터는 기본적으로 값처럼 전달되며, 함수 내부에서는 상수처럼 취급되기 때문에 직접 변경할 수 없다.
  • inout은 함수 내부에서 외부 변수의 값을 변경할 수 있도록 해주는 키워드이다. 호출할 때는 &를 사용해 해당 변수를 전달한다.
  • inout은 참조 전달과 완전히 같은 개념은 아니다. 즉, 단순히 변수의 주소를 직접 넘겨서 수정하는 방식으로만 이해하면 정확하지 않다.
  • Swift의 inout은 개념적으로 copy-in copy-out 방식으로 이해할 수 있다.
  • 즉, 함수 호출 시 원래 값을 함수 내부로 복사해 오고(copy-in), 함수 내부에서 값을 변경한 뒤, 함수가 끝날 때 변경된 값을 다시 원래 변수에 반영한다(copy-out).
  • 단, 실제 실행 시에는 성능 최적화를 통해 복사가 생략되고 참조처럼 동작할 수 있지만, 개념적으로는 항상 copy-in copy-out으로 이해하는 것이 안전하다.

Reference

  • https://docs.swift.org/swift-book/ReferenceManual/Declarations.html#ID545
  • https://jud00.tistory.com/entry/오늘의-Swift-지식-In-Out이란-무엇일까
  • https://velog.io/@juseojo/TIL-Swift의-inout-파라미터-정말-참조를-전달할까-Copy-In-Copy-Out-파헤치기
  • https://hyunsikwon.github.io/swift/Swift-Inout-01/