스위프에선 함수를 정의할 때 매개변수를 용도에 따라 두 가지로 분리할 수 있다. 바로 내부 매개변수와 외부 매개변수이다.
외부 매개변수는 함수를 호출할 때 인자값에 대한 인자 레이블(Argument Label) 역할을 하고 동시에 함수의 식별자 일부로 사용된다. 반면, 내부 매개변수는 입력된 인자값을 함수 내부에서 참조하기 위해 사용하는 변수이다.
함수의 범위 내에서는 내부 매개변수를 일반 변수처럼 사용해 인자값을 얼마든지 참조할 수 있다.별도로 외부 매개변수를 나누지 않을 경우 일반 매개변수가 인자 레이블 역할까지 겸하지만, 외부 매개변수를 명시적으로 정의하면 외부매개변수가 인자 레이블이 된다. 형식은 다음과 같다.
func 함수이름(<외부 매개변수명> <내부 매개변수명>: <타입>, <외부 매개변수명> <내부 매개변수명>: <타입>...) {
// 함수 내용
}
간단하다. 그냥 내부 매개변수명 앞에 외부 매개변수명을 넣어주기만 하면된다. 실제 예시를 살펴보자.
func printHello(name: String, msg: String) {
print("\(name)님, \(msg)")
}
외부 매개변수를 사용하지 않은 일반 함수이다. 이 함수엔 name과 msg라는 두 매개변수가 정의되어 있다. 이처럼 매개변수가 나눠있지 않을 때엔 그냥 매개변수를 다음과 같이 인자레이블로 사용하면된다.
printHello(name: "홍길동", msg: "안녕하세요")
다음은 외부 매개변수를 넣은 예시를 살펴보자.
func printHello(to name: String, welcomeMessage msg: String) {
print("\(name)님, \(msg)")
}
외부 매개변수인 to, welcomeMessage가 추가되면서 name, msg는 내부 매개변수가 되었다. 외부 매개변수가 추가된 상태이므로 함수를 호출할 때는 이를 사용해서 호출해야한다. 첫 번째 예시와 다른 것을 볼 수 있다.
printHello(to: "조제", welcomeMessage: "안녕")
외부 매개변수를 따로 지정할 경우 함수의 이름 변화에 주의해야한다. 기존 매개변수명이 아닌, 따로 지정된 외부 매개변수명이 함수 이름에 사용되기 때문이다. 다음 예시를 보며 확인해보자.
func printHello(name: String, msg: String) {
print("\(name)님, \(msg)")
}
// 함수명 : printHello(name:msg:)
func printHello(to name: String, msg: String) {
print("\(name)님, \(msg)")
}
// 함수명 : printHello(to:msg:)
func printHello(to name: String, welcomeMessage msg: String) {
print("\(name)님, \(msg)")
}
// 함수명: printHello(to:welcomeMessage
외부 매개변수는 다음과 같이 외부 매개변수명에 언더바(_)를 붙여 생략이 가능하다. 대신 외부 매개변수명 자리에 언더바를 사용하면 내부 매개변수와 외부 매개변수를 분리하지만 외부 매개변수명을 사용하지 않겠다 라는 의미가 되어 매개변수를 생략하고 호출할 수 있다.
func printHello(_ name: String, _ msg: String) {
print("\(name)님, \(msg)")
}
호출구문 : printHello("조제", "안녕")
이처럼 생략하는 경우 오히려 호출시에 매개변수명을 붙이면 오류가 발생하므로 주의해야한다.
이를 응용해보면 매개변수가 여러 개일 때엔 일부만 매개변수를 생략할 수도 있다.
func printHello(to name: String, _ msg: String) {
print("\(name)님, \(msg)")
}
호출구문 : printHello(to: "조제", "안녕")
func printHello(_ name: String, welcomeMessage msg: String) {
print("\(name)님, \(msg)")
}
호출구문 : printHello("조제", welcomeMessage:"안녕")
두 번째 예제 맨 앞의 매개변수를 생략한 이 구조는 코코아 터치 프레임워크에서 굉장히 많이 사용되는 방식이니 눈 여겨볼 필요가 있다.
매개변수가 생략될 경우, 함수의 이름에도 변화가 생긴다. 외부 매개변수 자리에 언더바가 들어갔으므로, 함수명 역시 외부 매개변수 자리에 언더바를 넣어 표시해주어야 한다.
func printHello(_ name: String, _ msg: String) { ... }
함수명 : printHello(_:_:)
func printHello(to name: String, _ msg: String) { ... }
함수명 : printHello(to:_:)
func printHello(_ name: String, welcomeMessage msg: String) { ... }
함수명 : printHello(_:welcomeMessage:)
스위프트 언어만의 특징인 외부 매개변수명은 매개변수명이 내부와 외부에서 바라보는 의미가 달라서 외부와 내부로 구분하여 사용할 필요가 있을 때, 혹은 내부 매개변수명을 외부로 공개하기 원치 않을 때 사용된다. 또 내부 매개변수명이 너무길어 호출이 불편할 때도 사용된다. 하지만 가장 큰 목적은 오브젝티브-C와의 호환성 때문이라고 할 수있다.
출처 : 꼼꼼한 재은씨의 Swift 문법편
'Swift > 문법' 카테고리의 다른 글
스위프트(Swift) - 함수(Function) Ⅳ. InOut 매개변수 (0) | 2022.05.17 |
---|---|
스위프트(Swift) - 함수(Function) Ⅲ. 가변인자, 기본값, 수정 (0) | 2022.05.16 |
스위프트(Swift) - 함수(Function) Ⅰ. 함수의 기본 개념 (0) | 2022.05.12 |
스위프트(Swift) - 옵셔널(Optional) (0) | 2022.05.11 |
스위프트(Swift) - 집단자료형(Collection Types) Ⅳ. 딕셔너리(Dictionary) (0) | 2022.05.10 |