본 Lecture Note는 yagom.net의 '스위프트 기초' 강의를 수강하고 작성하였습니다.
Swift에서의 함수 선언, 호출, 매개변수, 매개변수 기본값, 가변매개변수, 전달인자 레이블, 함수 데이터 타입에 대해 알아보겠습니다.
함수의 선언은 아래와 같이 할 수 있습니다. 매개변수(parameter), 반환값(return value)이 없는 경우 각각 해당하는 부분을 지우고 사용하면 됩니다.
// 매개변수와 반환값이 있는 함수
func functionName(parameterName1: parameterType1, ...) -> ReturnType {
function body
return returnValue
}
// 매개변수가 없는 함수
func maximumIntegerValue() -> Int {
return Int.max
}
// 매개변수와 반환값이 없는 함수 (함수가 간단한 경우 줄바꿈을 하지 않아도 됩니다.)
func printMyName(name: String) { print(name) }
}
함수의 호출은 아래와 같이 할 수 있습니다.
sum(a: 3, b: 5) // 8
maximumIntegerValue() // Int의 최댓값
매개변수에 기본값을 정해두면 매겨변수에 값을 입력하지 않아도 자동적으로 매개변수를 갖도록 할 수 있습니다. 물론 매개변수에 입력값이 있다면 해당 값이 반영됩니다. 기본값을 갖는 매개변수는 매개변수 목록 중에 뒤쪽에 위치하도록 하는 것이 좋습니다.
func functionName(parameter1Name: parameter1Type,
parameter2Name: parameter2Type = parameter default value,
...) -> ReturnType {
function body
return returnValue
}
func greeting(friend: String, me: String = "Ryan") {
print("Hello \(friend)! I'm \(me).")
함수를 호출할 때 매개변수의 역할을 좀 더 명확하게 하거나 함수 사용자의 입장에서 매개변수가 어떤 역할을 하는지 명확하게 표현하고자 할 때 사용합니다. 전달인자 레이블은 함수의 이름의 일부로 취급되기 때문에 손쉽게 함수를 중복 정의할 수 있습니다.
func functionName(argument1Label parameter1Name: parameter1Type, ...) -> ReturnType {
function body
return returnValue
}
// 함수 내부에서 전달인자를 사용할 때에는 매개변수 이름을 사용합니다.
func greeting(to friend: String, from me: String) {
print("Hello \(friend)! I'm \(me).")
}
// 함수를 호출할 때에는 전달인자 레이블을 사용합니다.
greeting(to: "Kio", from: "Steven") // Hello Kio! I'm Steven.
전달 받을 값의 개수를 알기 어려울 때 가변 매개변수를 사용할 수 있습니다. 가변 매개변수는 함수당 하나만 가질 수 있습니다. 매개변수 타입 뒤에 마침표 세 개를 작성하여 사용할 수 있습니다.
func functionName(parameter1Name: parameter1Type,
argumentLabel parameter2Name: parameter2Type...) -> ReturnType {
function body
}
func sayHelloToFriends(me: String, friends: String...) -> String {
return "Hello \(friends)! I'm \(me)!"
}
print(sayHelloToFriends(me: "Ryan", friends: "Kio", "Steven", "Kane"))
// Hello ["Kio", "Steven", "Kane"]! I'm Ryan!
print(sayHelloToFriends(me: "Ryan"))
// Hello []! I'm Ryan!
Swift는 함수형 프로그래밍 패러다임을 포함하는 다중 패러다임 언어입니다. Swift의 함수는 일급 객체이므로 변수, 상수 등에 저장이 가능하고, 매개변수를 통해 전달도 가능합니다.
함수를 타입으로 표현하고자 할 때는 반환 타입을 생략할 수 없습니다.
(parameter1Type, parameter2Type ...) -> ReturnType
var someFunction: (String, String) -> Void = greeting(to:from:)
someFunction("Kio", "Ryan") // Hello Kio! I'm Ryan.
someFunction = greeting(friend:me:)
someFunction("Kio", "Ryan") // Hello Kio! I'm Ryan.
// 타입이 다른 함수는 할당할 수 없습니다 (아래의 경우 가변 매개변수를 가지는 함수).
someFunction = sayHelloToFriends(me: friends:)
func runAnother(function: (String, String) -> Void) {
function("Steven", "Kane")
}
runAnother(function: greeting(friend:me:)) // Hello Steven! I'm Kane.
runAnother(function: someFunction) // Hello Steven! I'm Kane.
kio swift 검색하고 들어왔는데 Ryan의 품으로 왔네요ㅎㅎㅎ