function
이번에 알아볼 것은 함수다. 조금 문법이 생소할 수도 있기 때문에 주의깊게 봤으면 한다.
Introduction
함수는 특정 작업을 수행하는 코드를 포함하는 독립적인 덩어리(chunk)이다. 함수에 무엇을 하는지 식별할 수 있는 이름을 지정하고, 이름을 지정한 함수는 필요할 때 함수를 호출하여 해당 작업을 수행하는데 사용된다.
함수를 정의할 때, 함수에 입력으로 사용하는 하나 또는 여러 개의 type 값들(매개변수)을 마음대로 정의할 수 있다. 또한, 함수가 끝날 때 결과를 반환할 값의 type을 선택적으로 정의할 수 있다. 이것을 리턴타입이라고 한다.
Examples
우선 쉽게 이해하기 위해서 예제가 필요하다.
아래의 코드는 파라미터와 리턴타입이 존재하는 함수다.
// 함수명 : greet >> func greet
// 매개변수 : String 형인 변수 person >> person : String
// 리턴타입 : String >> -> String
func greet(person : String) -> String {
let greeting = "Hello, " + person + "!";
return greeting;
}
// 아래의 코드와 같이 함수를 호출하려면 정의된 함수의 (매개변수 이름:넣을 값) 으로 해서 호출해야 한다.
print(greet(person: "KJH")); // Hello, KJH!
print(greet(person: "AAA")); // Hello, AAA!
아래의 코드는 리턴타입은 존재하지만 파라미터가 존재하지 않을 때의 함수이다.
func sayHelloWorld() -> String {
return "Hello, World";
}
print(sayHelloWorld()); // Hello, World
아래의 코드는 파라미터는 존재하지만 리턴타입이 없을 때의 함수이다.
하지만 리턴타입이 없다고 해서 리턴되는 값이 없는 것은 아니다. Void
를 리턴한다.
func greet(person : String) {
print("Hello, \(person)");
}
greet(person : "KJH"); // Hello, KJH
Function Argument Labels and Parameter Names
조금 헷갈리는 개념이 나온다. Argument Label과 Parameter Name 이란 개념이 나오는데, 알고보면 간단한하다.
우선 argument Label은 함수를 호출 할 때 사용되며, parameter name 은 함수 안에서 사용된다.
위에서 예제로 작성한 함수들은 argument label 을 지정해줬지 않았기 때문에, parameter name 과 argument label 을 같이 사용한 것이다.
아래의 코드를 보면 각각 어떤 역할을 하는지 알 수 있을 것이다.
func someFunction(argumentLabel parameterName: Int) {
print(parameterName);
}
someFunction(argumentLabel: 1); // 1
또한, 매개변수를 입력할 때 앞에 argument label 을 입력하기 싫으면 _
를 매개변수를 정의할 때 설정해주면 된다.
아래 코드에서 확인해보자.
func someFunction(_ firstParam : Int, secondParam: Int) {
......
}
someFunction(1, secondParam : 2);
Default Parameter Values
아래의 코드는 매개변수에 default 값을 설정하는 코드이다.
func someFunction(param : Int, temp : Int = 11) {
.....
}
someFunction(param: 1, temp : 2); // param = 1, temp = 2
someFunction(param: 1); // param = 1, temp = 11;
Variadic Paramters
여러 값을 넣을 수도 있다.
func arithmeticMean(_ numbers: Double...) -> Double {
var total : Dobule = 0;
for number in numbers {
total += number;
}
return total / Dobule(numbers.count);
}
arithmeticMean(1, 2, 3, 4, 5); // 3.0
arithmeticMean(3, 8.25, 18.75); // 10.0
function
//: Playground - noun: a place where people can play
import UIKit
// 리턴타입과 매개변수가 없는 함수
func sayHello() {
print("Hello");
}
sayHello(); // Hello
// 매개변수만 존재하는 함수
func sayHello2(name: String) {
print("Hello \(name)");
}
sayHello2(name: "kjh"); // Hello kjh
// 매개변수와 리턴타입이 존재하는 함수
func sayHello3(name:String) -> String {
return "Hello " + name;
}
var temp = sayHello3(name: "test");
print(sayHello3(name: "hojak")); // Hello hojak
print(temp); // hello test
// default 값이 존재하는 함수
func sayHello4(name: String = "default") -> String{
return "Hello " + name;
}
print(sayHello4()); // Hello default
print(sayHello4(name: "hojak")); // Hello hojak
// argument label 과 parameter name 이 존재하는 함수
func sayHello5(insertYourName name:String, internationalAge age: Int) {
print("\(name) is \(age) years old");
}
sayHello5(insertYourName: "hojak", internationalAge: 20); // hojak is 20 years old
// argument label 를 입력하지 않아도 되도록 셋팅한 함수
func sayHello6(_ name: String, _ age: Int) {
print("\(name) is \(age) years old");
}
sayHello6("hojak", 5); // hojak is 5 years old