* 이 글은 "스위프트 프로그래밍 (3판)" 및 야곰닷넷의 "스위프트 기초 강의"를 들으며 정리한 내용입니다.
함수
스위프트의 함수는 자유도가 굉장히 높은 문법 중 하나입니다. 기본적으로 함수의 이름과 매개변수(Parameter), 반환 타입(Return Type) 등을 사용하여 함수를 정의합니다. 기본적인 함수 선언의 형태와 호출은 다음과 같습니다.
func name(parameter1: type, parameter2: type...) -> Type {
// 함수 구현부분
return 반환 값
}
// 예시
func sum(a:Int, b:Int) -> Int {
return a+b
}
/*
함수이름 - sum
매개변수(parameter) - a,b
반환 타입(return type) - Int
*/
// 함수의 호출
sum(a:10,b:5)
// 위의 경우 a,b를 매개변수(parameter)라 하고, 10과 5는 전달인자(argument)라고 한다.
return 값을 생략하여 함수를 작성할 수도 있습니다.
// 함수 내부 코드의 결과값의 타입이 함수의 반환 타입과 일치한다면 return 키워드를 생략 가능
func hello(name:String) -> String {
" My name is " + name
}
func printName(name:String) -> Void {
print(name)
}
// 혹은 반환 값이 없는 경우 반환 타입(Void)을 생략 가능
func printName(name:String) {
print(name)
}
혹은 매개변수를 생략하거나, 반환 값과 매개변수를 모두 생략한 함수를 작성할 수도 있습니다.
func greeting() -> String {
return "Hello"
}
print(greeting()) // "Hello"
func bye() -> Void { print("Bye") }
// Void 생략
func bye() { print("Bye") }
매개변수에 기본 값을 지정할 수 있습니다.
func music(artist:String,title:String,genre:String = "hip-hop") {
print("가수 : \(artist), 제목 : \(title), 장르 : \(genre)")
}
// 매개변수 기본값을 가지는 매개변수는 호출시 생략 가능
music(artist: "Epik High", title: "Face ID") // "가수 : Epik High, 제목 : Face ID, 장르 : hip-hop"
music(artist: "Hisaishi Joe", title: "Summer",genre: "Classic") // 가수 : Hisaishi Joe, 제목 : Summer, 장르 : Classic
매개변수의 이름과 전달인자 레이블(Argument Label)을 지정해줄 수 있습니다. 다음과 같이 표현합니다.
func funcName (argumentLabel parameterName1: Type, argumentLabel parameterName1: Type...) -> Type {
// 함수 구현부
return // 반환 값
}
// 예시
// from, to -> 전달인자 레이블
// myName,name -> 매개변수 이름
// 함수 내부에서 전달인자를 사용할때는 매개변수 이름을 사용함
func sayHello(from myName:String, to name:String) -> String {
return "Hello \(name)! I'm \(myName)"
}
// 호출시에 전달인자 레이블을 사용해야 함
print(sayHello(from:"Jegyun", to:"Bruno")) // "Hello Bruno! I'm Jegyun"
// 전달인자 레이블을 사용하고 싶지 않은 경우 와일드카드 식별자(_)를 사용
func sayName(_ Name:String, _ times:Int) -> String {
var res: String = ""
for _ in 0..<times{
res += "\(Name)" + " "
}
return res
}
sayName("Jegyun", 3) // Jegyun Jegyun Jegyun
매개변수로 몇 개의 값이 들어올지 알 수 없을 때, 가변 매개변수를 사용할 수 있습니다.
func name(param1:Type, param2:Type...) -> Type {
// 함수 구현부
return
}
// 예시
func sayHelloToPlayers(me: String, players names:String...) -> String {
var result : String = ""
// 가변 매개변수로 들어온 인자 값은 배열처럼 사용 가능
for player in names {
result += "Hello \(player)!" + " "
}
result += "I'm " + me + "!"
return result
}
print(sayHelloToPlayers(me: "Jegyun", players: "Bruno","Christiano","Luke"))
// "Hello Bruno! Hello Christiano! Hello Luke! I'm Jegyun!"
print(sayHelloToPlayers(me: "JG"))
// "I'm JG!"
이처럼 함수의 다양한 모양은 모두 함께 사용이 가능합니다.
데이터 타입으로서의 함수
스위프트의 함수는 일급 객체임으로 하나의 데이터 타입으로 사용할 수 있습니다. 또한 함수를 변수, 상수 등에 할당이 가능하고 매개변수를 통해 전달할 수 있습니다. 함수를 전달인자로 받을 수도, 반환 값으로 돌려주는 것 또한 가능합니다. 함수를 하나의 데이터 타입으로 나타내는 표현은 다음과 같습니다.
(매개변수 타입의 나열) -> 반환 타입
다음은 간단한 예제입니다.
typealias CalculateTwoInts = (Int,Int) -> Int
func addTwoInts (_ a : Int,_ b : Int) -> Int {
return a+b
}
func multiplyTwoInts(_ a:Int, _ b:Int) -> Int {
return a*b
}
var mathFunction : CalculateTwoInts = addTwoInts
// 같은 표현 (typealias 로 선언)
// var mathFunction : (Int,Int) -> Int = addTwoInts()
print(mathFunction(2,2)) // 4
mathFunction = multiplyTwoInts
print(mathFunction(2,5)) // 10
// 전달인자로 함수를 넘겨주기
func printMathResult(_ mathFunction: CalculateTwoInts, _ a:Int, _ b:Int){
print("Result: \(mathFunction(a,b))")
}
printMathResult(addTwoInts, 2, 2) // Result: 4
// 특정 조건에 따라 적절한 함수를 반환
func chooseMathFunction(_ toAdd:Bool) -> CalculateTwoInts {
return toAdd ? addTwoInts : multiplyTwoInts
}
printMathResult(chooseMathFunction(true), 3, 5) // Result: 8
printMathResult(chooseMathFunction(false), 3, 5) // Result: 15
'개발🧑💻 > Swift' 카테고리의 다른 글
[Swift] 구조체와 클래스, 열거형 - 사용자 정의 타입 (0) | 2021.11.17 |
---|---|
[Swift] 옵셔널 (0) | 2021.11.12 |
[Swift] 데이터 타입 (1) - 기본 (0) | 2021.10.20 |
[Swift] 데이터 타입 (2) - 데이터 타입 안심, 컬렉션 타입 (0) | 2021.09.19 |
[Swift] 기본 (0) | 2021.09.08 |