Swift 5 - 함수 1
스위프트에서 함수를 선언하는 방법
func 함수명 (매개변수 이름: 매개변수 타입, ...) -> 반환 결과 타입 {
... //함수 코드
}
스위프트에서 함수를 선언하는 방법은 여타 언어들과 다르지 않다.
- func - 함수라고 컴파일러에게 알려주는 키워드
- 함수명 - 함수의 이름
- 매개변수 이름 - 매개변수의 이름
- 매개변수 타입 - 매개변수의 타입
- 반환 결과 타입 - 해당 함수가 반환할 타입을 의미. 만약 아무 타입도 반환하지 않는다면 선언하지 않는다
- 함수 코드 - 작업을 수행할 코드
func sayHello() {
print("hello")
}
위의 함수는 아무 매개변수도 받지 않고, 아무 값도 반환하지 않고 그저 블럭 내의 코드를 실행하는 함수다
func buildHelloMessage(name : String) -> String {
return "Hello \(name)"
}
위의 함수는 매개변수를 받아서, 문자열을 반환하는 함수다
단일 표현식에서의 암묵적 반환
이전 예제의 buildHelloMessage 함수 내에서 문자열을 반환하기 위해 아주 널리 알려진 return 문이 사용되었다. 하지만 Swift 에선 Kotlin 과 마찬가지로, 단일 표현식을 가지고 있다면 return 문을 생략할 수 있다. 따라서 buildHelloMessage 는 다음과 같이 작성될 수도 있다.
func buildHelloMessage(name : String) -> String {
"Hello \(name)"
}
하지만 단일 표현식이 아니라 두 개 이상의 표현식을 가지고 있다면 위와 같이 사용할 수 없다.
func buildHelloMessage(name : String) -> String {
let ret = "Hello \(name)"
ret //Compiler 에 의해 에러가 발생한다!
}
스위프트 함수 호출하기
함수를 선언했다면 다음 구문을 이용해 함수를 호출할 수 있다.
함수명(매개변수 이름1 : 인자1,매개변수 이름2 : 인자2,...)
만약 아무 매개변수도 받지 않는 함수라면, 빈 괄호와 같이 함수를 호출할 수 있다.
func sayHello() {
print("hello")
}
sayHello()
함수의 반환값 처리하기
함수는 값을 반환할 수 있다. 이 때 반환타입을 지정해주게 되는데, 반환 타입과 타입이 일치하는 변수나 상수에 함수의 결과를 할당해줄 수 있다. 바로 다음과 같이 말이다.
func buildHelloMessage(name:String) -> String{
"Hello \(name)"
}
let helloMessage = buildHelloMessage(name:"Jong Ho")
print(helloMessage)// -> Hello Jong Ho
매개변수명을 생략하기
기본적으로 Swift 의 함수는 매개변수의 이름을 지정해줬다면 인자로 넘길 때 이름 : 인자 의 형태로 넘겨야 한다. 따라서 위의 buildHelloMessage 함수를 호출할 때 항상 아래와 같이 name 매개변수 이름을 지정해서 호출해야 한다.
func buildHelloMessage(name:String) -> String{
"Hello \(name)"
}
let helloMessage = buildHelloMessage(name:"Jong Ho")
print(helloMessage)// -> Hello Jong Ho
하지만 매번 매개변수명을 입력하기는 귀찮기 때문에, 이를 생략할 수 있는 방법이 있는데, 바로 매개변수의 이름앞에 _ 를 붙이는 것이다.
unc buildHelloMessage(_ name:String) -> String{
"Hello \(name)"
}
let helloMessage = buildHelloMessage("Jong Ho")
print(helloMessage)
매개변수 이름 앞에 _ 를 붙이면 함수를 호출할 때 매개변수 이름을 생략할 수 있다.
지역 매개변수명과 외부 매개변수명을 달리 하기
함수의 매개변수는 함수 내부에서 식별될 이름인 지역 매개변수명과 함수를 호출할 때 외부 블럭에서 식별할 이름인 외부 매개변수명을 가질 수 있다. 함수를 호출할 때 매개변수의 자세한 의미를 전달하기 위해 매개변수 이름을 길게 선언하면 함수 내부의 코드가 너무 길어질 수 있다. 이 때 외부 매개변수명을 설정해서 의미를 전달하는 동시에, 함수 내부에선 내부 매개변수명을 사용함으로써 이러한 문제를 해결할 수 있다.
//외부 매개변수명은 userName 을 설정!
func buildHelloMessage(userName name:String) -> String{
"Hello \(name)"
}
let helloMessage = buildHelloMessage(userName : "Jong Ho")
print(helloMessage)
디폴트 매개변수 값 할당하기
함수를 호출할 때 인자로 쓸 값이 들어오지 않은 경우에 사용할 매개변수 값을 지정할 수 있다.
//userName 매개변수의 기본값으로 Jong Ho 를 할당
func buildHelloMessage(userName name:String = "Jong Ho") -> String{
"Hello \(name)"
}
let helloMessage = buildHelloMessage() //userName 을 넘겨주지 않으면 기본값으로 사용된다
print(helloMessage)
여러 결과값 반환하기
결과타입을 튜플로 선언하면, 여러 개의 결과를 반환하는 함수가 될 수 있다. 다음 함수는 cm 단위를 가지는 값을 입력받아 m 와 km 로 변환한 결과를 반환하는 함수다.
func centimeterConverter(centimeter : Int) -> (meter : Double, killoMeter : Double) {
(Double(centimeter)/100, Double(centimeter) / 100000)
}
let result = centimeterConverter(centimeter:100000)
print("\(result.meter) 미터")
print("\(result.killoMeter) 킬로미터")