[Swift] 가변 매개변수, call by address 구현

2023. 10. 12. 14:49·Apple/Swift
728x90
반응형

가변 매개변수(variadic parameter)

Swift에서 가변 매개변수(variadic parameter)는 함수에 동적인 개수의 인자를 전달하기 위해 사용되는 특별한 매개변수입니다. 가변 매개변수를 사용하면 함수를 호출할 때 인자의 개수를 유연하게 조정할 수 있습니다.

 

가변 매개변수의 특징에 대해서 알아보도록 하겠습니다.

  1. 문법 : 가변 매개변수는 타입 뒤에 세 개의 점(...)을 사용하여 정의됩니다. 예를 들어, func sum(numbers: Int...)과 같이 선언할 수 있습니다.
  2. 타입 : 가변 매개변수는 배열로 처리됩니다. 따라서 함수 내부에서 해당 매개변수에 접근할 때 배열 형태로 다루어야 합니다.
  3. 호출 시 인자 전달 : 가변 매개변수를 사용하는 함수를 호출할 때, 여러 개의 인자 값을 콤마(,)로 구분하여 전달합니다.
  4. 인자 개수 제한 : 가변 매개변수는 하나만 선언할 수 있으며, 일반적인 (가능한 한 명시적인) 매개 변수와 함께 사용될 수 있습니다.

2가지의 소스 코드와 함께 보도록 하겠습니다.

func sum(numbers: Int...) -> Int {
    var total = 0
    for number in numbers {
        total += number
    }
    return total
}

let result = sum(numbers: 1, 2, 3, 4)
print(result) // 출력: 10

 

func printNames(prefix: String, names: String...) {
    for name in names {
        print("\(prefix) \(name)")
    }
}

printNames(prefix: "Hello", names: "Alice", "Bob", "Charlie")
// 출력:
// Hello Alice
// Hello Bob
// Hello Charlie

inout 매개변수 : call by address 구현

Swift에서 inout 매개변수는 함수 내에서 전달된 변수의 값을 수정하고, 이를 호출한 곳으로 변경된 값을 다시 전달하는 데 사용됩니다. 이를 통해 "참조에 의한 호출" 또는 "call by address" 방식을 구현할 수 있습니다.

 

함수가 값을 반환한 후에도 매개변수에 일어난 변화를 유지하려면, 함수의 선언부에서매개변수를 입출력 매개변수(in-out parameter)로 선언해야 합니다.

 

소스 코드를 보겠습니다.

func swapValues(a: inout Int, b: inout Int) {
    let temp = a
    a = b
    b = temp
}

var x = 10
var y = 20

swapValues(a: &x, b: &y)
print("x =", x) // 출력: x = 20
print("y =", y) // 출력: y = 10

위 코드에서 swapValues 함수는 두 개의 정수 값을 받아서 서로의 값을 교환합니다. 이때 x, y와 같은 가변 변수들을 인자로 넘기기 위해 앰퍼샌드(&) 기호가 사용됩니다.

함수 내부에서 값이 교환되면 원래의 변수(x, y)도 영향을 받아 결과적으로 출력 결과가 변경됩니다.

주의사항

  • 일반적으로 Swift에서는 참조 타입(클래스 등)을 사용하여 참조에 의한 호출(call by reference)을 구현하므로 대부분 상황에서 직접적인 필요성은 없습니다.
  • 잘못된 사용으로 인해 충돌이나 부작용이 발생하지 않도록 주의해야 합니다.
  • 가능하다면 다른 방법(반환값 등)을 고려하여 코드를 작성하는 것이 좋습니다.

 

감사합니다.


틀린 부분이 있거나 더 좋은 내용 훈수 환영합니다!

공감과 댓글 부탁드립니다.

728x90
반응형

'Apple > Swift' 카테고리의 다른 글

[Swift] 클로저(Closure)  (0) 2023.10.16
[Swift] 1급 객체 (first class object), 1급 시민 (first class citizen)  (0) 2023.10.13
[Swift] guard~let, 디폴트 매개변수 정의, 함수 응용  (2) 2023.10.11
[Swift] Raw Values (원시 값)  (0) 2023.10.10
[Swift] 델리게이트 패턴(Delegate Pattern)  (4) 2023.10.08
'Apple/Swift' 카테고리의 다른 글
  • [Swift] 클로저(Closure)
  • [Swift] 1급 객체 (first class object), 1급 시민 (first class citizen)
  • [Swift] guard~let, 디폴트 매개변수 정의, 함수 응용
  • [Swift] Raw Values (원시 값)
P_Piano
P_Piano
Apple 생태계 개발자가 되기 위한 학습과 경험의 기록
    반응형
    250x250
  • P_Piano
    피피아노의 개발 일지
    P_Piano
  • 전체
    오늘
    어제
    • 분류 전체보기 (214)
      • Apple (132)
        • iOS (23)
        • visionOS (5)
        • Swift (70)
        • UIKit (2)
        • SwiftUI (24)
        • RxSwift (2)
        • Xcode (5)
      • C언어 (5)
      • C++ (8)
      • Dart (1)
      • Python (3)
      • JavaScript (17)
      • Git (1)
      • CS (39)
        • 디자인 패턴 (6)
        • 네트워크 (20)
        • 운영체제 (8)
        • Database (5)
        • 자료구조 (0)
      • IT 지식 (2)
      • IT 뉴스 (4)
      • 출처 표기 (1)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    디자인패턴
    함수
    Apple
    프로그래머스
    옵셔널
    프로퍼티 래퍼
    코딩테스트
    클래스
    ios
    combine
    배열
    visionOS
    프로세스
    SWIFT
    swiftUI
    연산자
    제어문
    비동기
    Vision Pro
    변수
    운영체제
    티스토리챌린지
    오블완
    자바스크립트
    네트워크
    UIKit
    이니셜라이저
    스위프트
    Xcode
    Initializers
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.1
P_Piano
[Swift] 가변 매개변수, call by address 구현
상단으로

티스토리툴바