함수 타입

Swift에는 수많은 함수들이 존재한다. 수많은 함수들을 분류하는 기준이 존재할까? 존재하다면 어떤 기준일까?
아래의 코드를 통해 분류 기준을 짐작할 수 있다.

func noParamsNoReturn() {}

func OneParamsNoReturn(param: String) {}

func noParamsHaveReturn() -> Int {
	return 1
}

func oneParamsHaveReturn(param: String) -> String {
	return param
}

func twoParamsHaveReturn(param1: Int, param2: Int) -> Int {
	return param1 + param2
}

함수는 다음과 같은 분류 기준을 가지고 있다.

  • 파라미터가 있냐 없냐
  • 있다면 어떤 타입의 파라미터인가
  • 또한 파라미터의 개수는 몇개인가
  • 함수의 리턴값이 있냐 없냐
  • 있다면 어떤 타입의 리턴타입인가

또한 위의 분류 기준을 통해 함수의 타입을 정의할 수 있며, 호출될 때 함수타입을 명시해야 한다.

Swift는 함수 타입이라는 것이 존재하며 (파라미터 타입, ...) -> 반환값 과 같이 나타낼 수 있다.

위의 함수들은 다음과 같은 타입을 가진다.

noParamsNoReturn() : () -> Void
OneParamsNoReturn(param:) : (String) -> Void
noParamsHaveReturn() : () -> Int
oneParamsHaveReturn(param:) : (Range<Int>) -> Void
twoParamsHaveReturn(param1:param2:) : (Int, Int) -> Int

일급 시민이란?

일급시민은 다음을 만족하는 친구를 뜻한다.

  • 변수나 상수에 할당될 수 있다.
  • 함수의 파라미터로 전달할 수 있다.
  • 함수의 반환값이 될 수 있다.

기본적으로 변수나 상수는 위의 조건을 만족하므로 일급시민이라 할 수 있다.
함수 또한 위의 조건을 만족하며, 일급시민이다.

고차함수란?

  • 고차함수는 함수를 파라미터로 받거나, 함수를 반환값으로 내보내는 함수이다.

Swift에 익숙하다면 고차함수 3대장 map, reduce, filter를 알 것이다.
하지만 3대장의 내부 구현을 본 사람은 적을 것이다. 간단하게 map을 구현해보자.

extension Array {
	func myMap<T>(_ transform: (Element) -> T) -> [T] {
    	var result: [T] = []
        
        self.forEach {
            result.append(transform($0))
        }
        
        return result
    }
}

print([1, 2, 3].myMap({ $0 + 5 })) // [6, 7, 8]

myMap 함수는 "Element라는 타입을 파라미터로 받아서 특정 타입 T로 반환하는 함수 ((Element) -> T)"를 파라미터(그 파라미터의 이름은 transform이다.)로 받으며, T 타입의 배열을 리턴하는 함수이다.

내부적으로는 자기 자신, 즉 Array를 순회하며 각각의 요소에 "어떤 동작"을 해주고, 반환될 배열에 추가하는 방식이다. 그 어떤 동작은 transform에 정의하면 된다. 위 예시에서는 "각 요소에 5를 더해라" 라는 동작을 수행한다.

profile
iOS 개발자가 되고싶어요

0개의 댓글