개발🧑‍💻/Swift

[Swift] 함수

* 이 글은 "스위프트 프로그래밍 (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