Swift #12: 함수
Source: Dev.to
함수 정의
함수는 중괄호({)로 구분되는 코드 블록이며 이름으로 식별됩니다. 반복문이나 조건문에서 사용하는 코드 블록과 달리, 함수는 동작하기 위해 어떤 조건을 만족할 필요가 없습니다; 함수의 코드 라인은 호출될 때마다 실행됩니다.
함수가 호출되면 프로그램 실행은 함수 내부로 이동하고, 함수가 끝나면 호출한 위치로 돌아가 이전 실행을 계속합니다.
func f1() { // 선언 및 정의
let x = 1 + 2 // 3
}
f1() // 호출
var counter = 0
while counter // (원본에 코드가 누락됨)
Swift에서는 -> 뒤에 반환 타입을 명시하고 return 키워드를 사용하여 값을 반환할 수 있습니다. 반환문이 유일한 경우 return을 생략할 수 있습니다.
func f2(a: Int, b: Int) -> Int {
return a + b
}
let x1 = f2(a: 1, b: 2) // 3
let x2 = f2(a: 2, b: 5) // 7
func f3(a: Int, b: Int) -> Int {
a + b
}
함수 오버로드
매개변수의 개수나 타입이 다르면 같은 이름의 함수를 여러 개 정의할 수 있습니다.
func f(value: Int) -> Int {
value + 1
}
func f(value: String) -> Int {
value.count
}
print(f(value: "Hola")) // 4
print(f(value: 1)) // 2
반환 타입만 다르게 오버로드하면 모호성이 발생할 수 있습니다:
func f(value: Int) -> Int {
value + 1
}
func f(value: Int) -> Double {
Double(value) + 1.0
}
let result = f(value: 1) // Error: Ambiguous use of 'f(value:)'
이를 해결하려면 컴파일러에 추가 정보를 제공해야 합니다:
let result: Double = f(value: 1) // ✅
print(result) // 2.0
제네릭 함수
여러 함수가 동일한 로직을 공유하지만 매개변수 타입만 다를 때 제네릭 함수를 사용할 수 있습니다:
func f<T>(value: T) -> String {
"Valor: \(value)"
}
let r1 = f(value: 1) // "Valor: 1"
let r2 = f(value: "Hola") // "Valor: Hola"
여러 제네릭 타입을 동시에 사용할 수도 있습니다:
func f<T, U>(value1: T, value2: U) -> String {
"Valores: \(value1) \(value2)"
}
let r1 = f(value1: 1, value2: 0.5) // "Valores: 1 0.5"
let r2 = f(value1: "Hola", value2: "Chao") // "Valores: Hola Chao"
표준 라이브러리
Swift에 미리 정의된 일부 함수와 연산자:
print(_:)– 콘솔에 값을 출력합니다.abs(_:)– 정수의 절대값을 반환합니다.max(_:_:)– 두 값 중 큰 값을 반환합니다.min(_:_:)– 두 값 중 작은 값을 반환합니다.
프로그램 실행을 중단하는 함수
(내용이 아직 채워지지 않은 섹션)