함수(Fuction)은 대부분의 프로그래밍 언어에서 지원하는 개념으로, 프로그램 실행 과정 중 독립적으로 처리되는 부분을 따로 분리하여 구조화한 객체를 뜻한다.
함수는 일반 함수와 사용자 정의 함수로 나눌 수 있다. 일반 함수는 프로그래밍 언어나 프레임워크에서 제공하는 함수로 기본적인 데이터 처리나 연산 등을 수행하기 위해 사용된다. 대표적인 예로 print함수 가 있다.
하지만 프로그래밍을 하는 과정에서 일반 함수만으로 모든 것을 처리하는 것은 쉽지 않다. 이럴 때 필요한 기능들을 사용자가 직접 함수로 만들어 사용하는 것을 사용자 정의 함수라고 한다. 이제 그럼 사용자 정의 함수에 대해 알아보자.
사용자 정의 함수
스위프트에서 함수를 정의하는 형식은 다음과 같다.
func 함수이름(매개변수1: 타입, 매개변수2: 타입, ...) -> 반환타입 {
실행내용
return 반환값
}
함수명을 작성하고 나면 인자값 개수와 형태를 정의하기 위해 ( )로 영역을 표시해준다. 여기엔 함수가 호출될 때 전달되는 입력값을 대입받기 위한 변수의 이름과 타입이 정의되는데, 이를 매개변수(영어로 Parameter)라고한다. 다만 인자(입력 값)이 필요없는 경우 매개변수를 생략할 수 있다. 그 형식은 다음과 같다.
func 함수명() -> 반환 타입 {
실행내용
return 반환값
}
그냥 괄호 내부를 비워두면된다. 하지만 안에 들어 갈 내용이 없다고해서 괄호를 생략하는 것은 절대 안 된다.
다음으로 반환타입이다. 반환타입은 함수가 실행된 결과로 어떤 값을 내놓을지 즉 반환할지 하는 것이다. 함수가 값을 반환한다, 리턴한다라고 표현을 한다. 반환 타입이 지정되면 반드시 그 타입에 맞는 값을 반환해야하며 만약 nil을 반환하려하는 경우 반환 타입이 반드시 옵셔널 타입으로 정의되어야 한다.
함수에 따라 반환값이 없는 함수를 작성할 수도 있다. 이럴 땐 보통 void를 반환한다고 표현한다. 스위프트에서 반환값이 없는경우 즉 void를 반환하는 경우는 생략이 능하다. 다음 예제를 보며 형식을 이해해보자.
// 매개변수와 반환값 모두없는 경우
func prtHello() {
print("안녕")
}
// 매개변수가 없지만 반환값은 있는 경우
func sayHello() -> String {
let i = "안녕"
return i
}
// 매개변수는 있지만 반환값이 없는 경우
func prtHelloWithName(name: String) {
print("\(name)아 안녕!")
}
// 매개변수와 반환값 모두 있는 경우
func sayHelloWithName(name: String) -> String {
let j = "\(name)아 안녕~~"
return j
}
함수 호출
함수를 호출하는 방법에 대해 알아보자. 함수를 실행하는 것을 함수를 호출한다라고 보통 표현하는데 그냥 함수 이름에 괄호를 붙여주면 된다.
prtHello()
// 안녕
prtHello 뒤에 붙은 ()를 보고 함수 호출 연산자라고 보면된다.
매개변수가 없는 함수는 그냥 빈 괄호만 붙여 호출하면 되지만, 매개변수를 가지고 있는 함수는 호출할 때 괄호 안에 인자값을 반드시 넣어서 호출해야한다. 이 때 주의할점은 인자값은 앞서 정의된 매개변수의 타입과 일치해야한다는 점이다.
let inputName = "조제"
prttHelloWithName(name: inputName)
// 조제야 안녕!
// 실제값 자체(리터럴)을 넣어주는 방법도 가능하다.
prtHelloWithName(name: "조제")
여기서 스위프트의 함수가 다른 언어와 조금 다른게 있다는 것을 알 수 있을 것이다. 바로 name: 부분이다. 이 것을 인자 레이블(Argument Label)이라고 한다. 스위프트에서 인자값이 있는 함수를 호출할 때엔 인자값 앞에 기본적으로 인자 레이블을 붙여서 호출해 주어야 한다. 이 인자레이블을 생략하고 호출하면 오류가 발생한다. 다음 예를 보면서 자세히 알아보자.
func incrementBy(amount: Int, numberOfTimes: Int) {
var count = 0
count = amount * numberOfTimes
}
incrementBy 함수는 두 개의 매개변수 amount, numberOfTimes를 가진다. 스위프트는 기본적으로 이 두 매개변수를 매개변수명이자 동시에 인자 레이블(Argument Label)로 간주하기에 이 함수를 호출하려면 다음과 같이 레이블을 반드시 붙여줘야한다.
incrementBy(amount: 5, numberOfTimes: 2)
이런식으로 말이다. 사실 이 문법은 그닥 필요한지에 대한 의문이 많은 부분이지만 스위프트 공식문서에선 인자값의 목적을 분명하게 전달할 수 있다는 등의 편리함과 이점을 주장한다. 하지만 코코아 터치 프레임워크와의 오브젝티브-C의 상호관계로 인해 스위프트도 어쩔 수 없이 이 문법을 따라야했다는 이야기도 있다.
스위프트에서 함수의 인자 레이블은 단순 호출 구문에 국한되지 않고 함수를 식별하는데도 사용된다. 특히 함수명을 정의할 때 이 인자 레이블이 빠져서는 안되는 부분이다. 다음표를 보면 이해하기 쉽다.
함수정의 | 함수명 |
func incrementBy() | incrementBy() |
func incrementBy(amount: Int) | incrementBy(amount:) |
func incrementBy(amount:Int, numberOfTimes: Int) | incrementBy(amount:numberOfTimes:) |
func prtHello() | prtHello() |
func prtHello(name: String) | prtHello(name:) |
그런데 엄밀히 따지자면 위의 표에서 표현한 함수명의 경우 식별자(Signature)로 보는게 맞고 func 키워드 뒤에 들어가는 것을 함수명으로 보는게 바람직하다.
출처 : 꼼꼼한 재은씨의 Swift 문법편
'Swift > 문법' 카테고리의 다른 글
스위프트(Swift) - 함수(Function) Ⅲ. 가변인자, 기본값, 수정 (0) | 2022.05.16 |
---|---|
스위프트(Swift) - 함수(Function) Ⅱ. 내부 매개변수, 외부 매개변수 (0) | 2022.05.13 |
스위프트(Swift) - 옵셔널(Optional) (0) | 2022.05.11 |
스위프트(Swift) - 집단자료형(Collection Types) Ⅳ. 딕셔너리(Dictionary) (0) | 2022.05.10 |
스위프트(Swift) - 집단 자료형(Collection Types) Ⅲ. 튜플(Tuple) (0) | 2022.05.09 |