[Swift]함수

한상욱·2024년 7월 25일

Swift문법

목록 보기
7/12
post-thumbnail

들어가며

이 글은 Swift 문법 정리글입니다.

기본적인 함수형식

Swift의 함수에 대해서 알아보도록 하겠습니다. 함수는 기본적으로 함수의 매개변수와 매개변수의 타입으로 표현할 수 있습니다.

func someFunc(a : Int, b : Int) -> Int {
	return a + b
}

그리고 함수에 반환 타입은 ->을 이용해서 표현할 수 있습니다. 반환타입이 없다면 어떻게 표현할 수 있을까요?

func someFunc() -> Void {
	print("Hello"!)
}
// 동일한 표현
func someFunc() {
	print("Hello!")
}

Void라는 키워드를 이용할 수 있습니다. Void는 반환타입이 존재하지 않다는 의미에 typealiase입니다. 그리고 Void 타입의 함수에서는 return 키워드를 통해 함수를 종료시킬 수 있습니다. 하지만 명시하지 않더라도 함수는 종료됩니다. 그리고 Void는 생략이 가능합니다.

다만, 매개변수가 존재하지 않다면 ()는 생략할 수 없습니다.

매개변수의 기본값

함수의 매개변수에는 기본값을 정의할 수 있습니다. 이러한 경우 매개변수를 생략하면 기본값으로 함수를 실행하게 됩니다.

func someFunc(target : String = "Swift") {
	print("\(target) 최고")
}

someFunc()
>> Swift 최고
someFunc(target : "Apple")
>> Apple 최고

만약 함수의 매개변수의 기본값을 지정해야 되는 경우가 있다면 매개변수들 중 가장 마지막에 위치하는 것이 좋습니다.

전달인자 레이블

매개변수들은 전달인자 레이블을 통해서 표현할 수 있습니다.

func hello(to friend : String, from me : String) {
	print("Hello! \(friend)! I am \(me)")
}

hello(to: "Swift", from: "SangWook")
>> Hello Swift! I am SangWook

이러한 전달인자 레이블은 함수를 호출하는 경우에 사용됩니다. 그리고 실질적으로 함수 내부에서는 매개변수를 통해서 로직을 작성하게 됩니다. 이러한 경우 함수의 역할을 좀 더 명확하게 하거나 사용자의 입장에서 표현하고자 할 경우 사용할 수 있습니다.

func hello(_ friend : String, _ me : String) {
	print("Hello! \(friend)! I am \(me)")
}

hello("Swift", "SangWook")
>> Hello Swift! I am SangWook

위처럼 전달인자 레이블을 "_"로 표현하면 전달인자 레이블을 생략할 수도 있습니다.

가변 매개변수

가변 매개변수는 전달 받을 값의 개수를 알기 어려운 경우 사용하는 방법입니다. 가변 매개변수는 함수당 하나만 가질 수 있습니다.

func hello(from me : String, to friend : String...) {
	print("Hello! \(friend)! I am \(me)")
}

hello(from: "SangWook", to: "Swift", "Kotlin", "Dart")
>> Hello ["Swift", "Kotlin", "Dart"]! I am SangWook

가변 매개변수는 생략할 수는 있지만, nil이나 값을 전달하지 않으면 에러가 발생합니다.

데이터 타입으로서의 함수

Swift는 함수형 프로그래밍 패러다임도 지원합니다. 함수는 1급 객체로 변수나 상수에 저장이 가능하고, 매개변수로 전달 또한 가능합니다.

(a : Int, b : Int) -> Int

위는 a, b를 매개변수로 받아 Int 타입을 반환하는 함수를 데이터 타입으로 표현한 것입니다. ()안에 매개변수를 넣고, 반환타입을 -> 뒤에 명시하면 됩니다. 반환타입은 생략 가능합니다.

func someFunc(a : Int, b : Int) -> Int {
	return a + b
}

var someVar : (Int, Int) -> (Int) = someFunc(a:b:)

someFunc(1, 2)
>> 3
someVar(1, 2)
>> 3

이렇게 someVar에 someFunc를 지정하면 변수에 함수를 전달하게 된 것입니다.


func runAnother(a : Int, b : Int, operation: (Int, Int) -> Int) -> Int {
	return operation(a, b)
}

runAnother(a, b) { $0 + $1 }

함수를 매개변수로 전달할 수도 있습니다. 위에 경우에는 클로져 표현으로 표현된 함수가 매개변수로 전달되어 연산을 수행합니다.

profile
자기주도적, 지속 성장하는 모바일앱 개발자의 기록

0개의 댓글