티스토리 뷰

Programming/Swift

Swift Beginner | 함수(1)

글그리 2020. 11. 18. 16:34

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
링크
«   2024/05   »
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 29 30 31
글 보관함