매개변수 레이블(Parameter labels)
함수에 대한 게시글에서 매개변수에 대해 알아봤었습니다. (함수에 대해 자세히 알고 싶다면 여기를 클릭해주세요)
간단하게 매개변수에 대해 다시 집어보자면
매개변수는 함수가 정의될 때 함수가 전달받게 되는 변수(상수) 혹은 그 이름 입니다. 함수에 전송된 값을 매개 변수
라고 합니다.
자신의 함수가 매개 변수를 받아들이도록 하려면 각 매개 변수에 이름을 지정한 다음 콜론:
을 지정한 다음 Swift에 데이터 유형을 알려야 합니다.
예시를 함께 보며 알아보도록 하겠습니다.
func square(number: Int) -> Int {
return number * number
}
let result = square(number: 8) //16
파라미터의 이름이number
이고 우리는 함수 내부에 있는number
을 사용하여 참조할 수 있지만, 함수를 실행할 때에도 그 이름을 사용해야 합니다. Swift에는 각 매개 변수에 대해 두 개의 이름을 제공할 수 있습니다.
함수를 호출할 때 함수 외부에서 사용하고 하나는 함수 내부에서 사용합니다.
func sayHello(to name: String) {
print("Hello, \(name)!")
}
이 매개변수를to name
이라고 하는데, 이는 외부에서 호출된다는 뜻이지만, 내부적으로는name
이라고 불립니다. 이것을 호출하기 위해서는 아래와 같이 작성하면 됩니다.
sayHello(to: "서근")
매개변수 레이블을 사용하는 이유?
Swift를 제외한 많은 프로그래밍 언어는 매개 변수 레이블을 사용하지 않거나 선택적으로 사용합니다. 하지만 Swift는 매개변수 레이블을 광범위(?)하게 사용하고, 심지어 외부매개변수이름
과 내부매개변수이름
을 구별할 수 있게 합니다.
레이블이 유용한 이유를 알아볼게요.
isParameterLabel(true, true, false)
위에 코드는 보통 다른 언어에서 완벽하게 작동을 하지만, Swift는 매개변수 이름을 지정하는 것을 선호하기 때문에 저렇게 사용하지 않습니다. 따라서 아래와 같이 작성해야 합니다.
func isParameterLabel(primaryActive: Bool, backupActive: Bool, isEmergency: Bool) {
// code here
}
이 함수를 호출하는 방법은 아래와 같습니다.
isParameterLabel(primaryActive: true, backupActive: true, isEmergency: false)
자 이렇게 코드가 명확해졌죠? isEmergency
가 첫 번째에 오는지 마지막에 오는지 기억할 필요 없지 정확히 할 수 있게 됐습니다.
물론, Swift는 다음과 같이 레이블을 두 번 작성할 수 있고, 더 명확히 할 수 있습니다.
// (외부 매개변수이름 내부 매개변수 이름 : String)
func setAge(for person: String, to value: Int) {
print("\(person) is now \(value)")
}
이 함수를 호출하는 방법은 아래와 같습니다.
setAge(for: "서근", to: 26)
만약, (person: String, value : Int)
레이블만 사용했다면 호출하는 방법은 아래와 같습니다.
setAge(person: "서근", value: 26)
그런데 반대로 외부 매개변수 이름인 for
과 to
레이블만 사용한다면??
func setAge(for: String, to: Int) {
print("\(for) is now \(to)")
}
위 코드가 이상하다는 것을 확인하셨나요?
저렇게 작성하면 Swift는 for루프
를 사용했다고 생각하기 때문에 오류
가 생기게 됩니다!.
매개변수 레이블 TEST: 문제를 풀려면 이곳을 클릭해주세요
예시
func sayHello(to name: String) {
print("Hello, \(name)!")
}
func numberOfTims(in array: [String]) -> Int {
var count = 0
for name in array {
if name == "Tim" {
count += 1
}
}
return count
}
func increaseVolume(for device: String) -> String {
return "\(device) is now louder"
}
잘못된 예시
func drive(to: String) {
print("I'm going to \(destination) in my car.")
}
매개변수 레이블 생략(Omitting parameter labels)
print("Hello")
위에 코드처럼 Hello
를 출력할 때 우리는 아무런 매개변수이름
을 보내지 않는 것을 알고 있습니다.
print(message: "Hello")
라고 하는 것보다 더 간단하죠 :) 다음과 같이 외부매개변수이름
에 밑줄_
을 사용하여 동일한 동작을 사용할 수 있습니다.
func greet(_ person: String) {
print("Hello, \(person)!")
}
이제 함수를 호출할 때 greet(person: "서근")
처럼 사용하지 않고 간단하게 호출할 수 있습니다.
greet("서근")
이렇게 하면 일부 코드를 보다 쉽고 자연스럽게 읽을 수 있지만, 일반적으로 혼동을 피하기 위해 매개 변수에 외부 이름
을 지정하는 것이 좋습니다. 예를 들어, setAlarm(5)
이라는 호출 값이 있습니다. 이거만 두고 보면 어떤 의미인지 쉽게 파악이 가능하신가요? '5시에 알람을 설정합니다'일까요 아니면 '5시간 후에 알람을 설정합니다'일까요? :)
예시
func sumItems(_ items: [Int]) -> Int {
var total = 0
for item in items {
total += item
}
return total
}
func greet(_ name: String) {
print("Hi, \(name)!")
}
func climbMountain(_ name: String) {
print("I'm going to climb \(name).")
}
climbMountain("Everest")
잘못된 예시
func isEveryoneCanadian(_ birthCountries: [String]) {
for country in birthCountries {
if country != "Canada" {
return false
}
}
return true
}
//아무것도 반환하지 않은 값을 반환하려고 한다.
func formatLength(length length: Int) {
print("That measures \(length)cm.")
}
formatLength(95)
// formatLength(length: 90) 이렇게 매개변수 이름을 사용해야한다.
매개변수 레이블 TEST: 문제를 풀려면 이곳을 클릭해주세요.
읽어주셔서 감사합니다🤟
'SWIFT > Grammar' 카테고리의 다른 글
Swift : 기초문법 [#2 클로저를 함수로 전달] (0) | 2021.02.24 |
---|---|
Swift : 기초문법 [#1 클로저 기본 - Closure] (1) | 2021.02.24 |
Swift : 기초문법 [중첩된 루프에서 Break] (0) | 2021.02.21 |
Swift : 기초문법 [Break Loop / 항복건너뛰기(Continue)] (0) | 2021.02.21 |
Swift : 기초문법 [Repeat 루프] (0) | 2021.02.21 |