티스토리 뷰
swift는 객체지향, 함수지향 패러다임을 고루 채용하고 있기 때문에 객체지향적으로 프로그래밍을 할 수도 있고, 함수지향적으로도 프로그래밍을 할 수도 있게 강력한 함수 문법을 제공한다.기본적으로 swift의 함수는 1급 객체로 분류된다.
1급 객체(first class object) 또는 1급 시민(first class citizen) 다음 조건을 충족하는 객체를 1급 객체라고 한다. 1. 변수에 담을 수 있다. 2. parameter로 전달할 수 있다. 3. return type으로 사용할 수 있다. 일반적인 객체지향 언어는 숫자, 문자열 등이 이에 속하지만 함수형 언어에서는 함수 또한 같은 방식으로 다룰 수 있다. |
함수는 특정한 연산을 수행하는 코드블록을 말하며, swift 에서는 함수 또한 1급 객체이므로 함수형 언어에서 사용할 수 있는 여러 기법들을 사용할 수 있다. 기본적으로 함수는 어떤 값을 받고, 그 값을 가공하여 반환하는 형태를 취한다. 객체지향 언어에서는 멤버함수이고, 맴버 변수의 값을 정해진 형태로 가공하는 역할을 하는 함수의 경우 파라미터가 필요 없기도 했지만 함수형 언어는 파라미터와 반환값을 둘 다 가지도록 구현하는 것이 바람직하다.
func foo(age param: Int) {
// can't use age
print(param)
}
// call foo
foo(age: 10)
// 10
함수를 정의할 때 파라미터의 이름을 2개까지 지정할 수 있다. 순서대로 호출 시 이름, 함수 내부에서 사용하는 이름이다.
return type을 가지는 함수는 명시된 자료형으로 값을 반환한다. 위 함수는 반환할 값이 없기 때문에 return type을 정의하지 않았고, 함수 내부에서도 굳이 return으로 값을 반환하지 않는다.
func foo(number: Int) -> Int {
return number + 10
}
print(foo(number: 10))
// 20
다중 반환
tuple을 배울 때 함수에서 tuple로 값을 묶어서 반환할 수 있다고 했다. 배열을 전달 받아서 배열의 최소값, 최대값을 반환하는 함수를 만들어 보자.
func MinMax(arr: [Int]) -> (min: Int, max: Int) {
var min = arr[0]
var max = arr[0]
for i in arr {
if min > arr[i] {
min = arr[i]
}
if max < arr[i] {
max = arr[i]
}
}
return (min, max)
}
let ret = MinMax(arr: [1, 2, 3, 4, 5])
// ret.min = 1
// ret.max = 5
swift는 함수를 사용할 때 프로그래머가 실수하는 것을 방지하기 위해 기본적으로 전달할 파라미터의 이름을 꼭 명시하도록 했다. 위 코드에서 볼 수 있듯이 arr로 전달하기 위해 함수 호출부에서 arr: 이라고 명시해주고 있다. 이처럼 이름을 하나만 지정하면 호출할 때도, 함수 내부에서도 그 이름으로 쓸 수 있다. 프로그래머의 재량에 따라 아예 호출할 때 이름을 생략하도록 할 수 있는데 함수 선언부에서 이름 앞에 _ 를 적어주면 된다. 이름: 값, 이름: 값 이렇게 나열하면 코드가 너무 길어지거나 오히려 가독성을 해치는 경우가 있는데 이름을 생략할 수 있도록 해서 코드를 더 간결하게 만들 수 있다.
func foo(_ age: Int) {
print(age)
}
// call without parameter name
foo(10)
// 10
default parameter
다른 언어들 같이 swift도 default parameter를 선언할 수 있다. 함수를 호출할 때 값을 전달하면 그 값으로 대체되지만 생략할 경우 default값으로 함수를 실행한다. default 파라미터는 순서상 어디에 있어도 상관은 없지만 호출할 때 값이 앞에서부터 채워지기 보통 마지막에 들어간다.
func foo(a arg1: Int, b arg2: Int, c arg3: Int = 3) {
print(arg1, arg2, arg3)
}
foo(a: 1, b: 2, c: 3) // good :)
foo(a: 1, b: 2) // good :)
가변 parameter
함수의 파라미터로 동일한 자료형의 값을 가변적인 갯수만큼 전달할 수 있다. 배열을 전달하는 것과는 좀 다르므로 주의하자.
func sum(numbers: Int...) -> Int {
var total = 0
for number in numbers {
total += number
}
return total
}
print(sum(1, 2, 3, 4, 5)) // 15
print(sum(6, 7, 8)) // 21
전달되는 파라미터의 갯수에 상관없이 동작하지만 배열을 전달하는 것과는 문법적으로 조금 차이가 있다.
inout
c-style 함수를 만들어 봤다면 반환값이 여러개 필요할 경우 call by reference로 만들어서 구현한 기억이 있을 것이다. 대표적으로 두 값을 치환하는 swap함수를 만들 때 그렇다. swift도 inout이라는 키워드를 사용해서 비슷한 함수를 만들 수 있다. swift로 swap을 구현해 보자.
func swap(a: inout Int, b: inout: Int) {
let temp = a
a = b
b = temp
}
var a = 3
var b = 5
print("initial a = \(a), initial b = \(b)") // initial a = 3, initial b = 5
swap(a: &a, b: &b)
print("a = \(a), b = \(b)") // a = 5, b = 3
c++의 call by reference 함수를 호출할 때와 동일하게 &연산자를 사용하는 것을 볼 수 있다.
swift는 함수도 1급 객체라서 파라미터로 전달하거나 변수에 담을 수 있다고 했는데 이 내용까지 설명하면 너무 길어질 것 같으니까 swift의 함수지향적 문법은 다음 글에서 알아보도록 하자.
'Programming > Swift' 카테고리의 다른 글
Swift Beginner | Closure (0) | 2020.11.18 |
---|---|
Swift Beginner | 함수(2) (0) | 2020.11.18 |
Swift Beginner | 반복문 (0) | 2020.11.18 |
Swift Beginner | 조건문 (0) | 2020.11.18 |
Swift Expert | nil이 될 수 있는 변수 optional (0) | 2020.11.18 |
- Total
- Today
- Yesterday
- 데이터베이스
- ue4
- JSP
- 자료구조
- DesignPattern
- Cocos2d-x
- SwiftUI
- machine learing
- 국내여행
- winsock
- SHADER
- database
- C/C++
- game
- 알고리즘
- OS
- mongoDB
- C++
- 드라마
- SOCKET
- Java
- rxswift
- 수학
- ios
- Git
- C
- scala
- swift
- Spring
- 운영체제
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 |