티스토리 뷰

iOS

[Swift] 함수 (Functions) (2)

Peppo 2022. 1. 21. 23:17
728x90

함수 형 (Function Types)

 

모든 함수는 매개변수(parameter)타입과 반환(return)타입으로 구성된 특정 타입을 갖고 있습니다. 

 

아래 함수는 Int 타입을 받아 Int 타입을 반환하는 함수 입니다.

func addTwoInts(_ a: Int, _ b: Int) -> Int {
    return a + b
}

func multiplyTwoInts(_ a: Int, _ b: Int) -> Int {
    return a * b
}

 

아래함수는 파라미터와 반환 값이 없는 함수입니다.

func printHelloWorld() {
    print("hello, world")
}

 

 

함수 형의 사용 (Using Function Types)

 

함수를 상수, 변수처럼 정의해서 사용할 수 있습니다.

func addTwoInts(_ a: Int, _ b: Int) -> Int {
    return a + b
}

var mathFunction: (Int, Int) -> Int = addTwoInts
print("result: ",mathFunction(3,5))
// result: 8

 

Swift의 타입 추론(Type Infered)으로 변수, 상수에 함수를 할당할 때 직접 함수 타입을 지정해주지 않아도 됩니다.

이미 addTwoInts가 (Int, Int) -> Int 인걸 Swift에서 타입 추론을 합니다. 

 

파라미터 타입으로서의 함수 타입 (Function Types as Parameter Types)

파라미터에 함수를 사용할 수 있습니다.

func multiplyTwoInts(_ a: Int, _ b: Int) -> Int {
    return a * b
}

func printMathResult(_ mathFunction: (Int, Int) -> Int, _ a: Int, _ b: Int) {
    print("result: \(mathFunction(a, b))")
}

printMathResult(multiplyTwoInts, 3, 2)
// result: 6

위 예제에는 3가지 파라미터가 들어가는데, 

첫번째 파라미터는 mathFunction(Int, Int) -> Int : Int 두개를 파라미터로 받아 Int를 리턴하는 함수타입의 파라미터,

두번째, 세번째는 Int를 받는 파라미터 입니다. 

 

printMathResult 함수에 인자로 multiplyTwoInts (Int, Int) -> Int를 반환하는 함수 파라미터를 넣고

a에는 Int값 3을, b에는 Int값 2를 넣어 printMathResult 함수를 호출하게 되면 

 

multiplyTwoInts함수의 인자값에는 3과 2가 들어가서 서로를 곱한값 6이 나오며

result: 6 이라는 프린트 결과 값이 나옵니다. 

 

 

반환 타입으로서의 함수 타입 (Functions Types as Return Types)

함수를 반환하는 함수를 만들수도 있습니다.

func stepForward(_ input: Int) -> Int {
    return input + 1
}
func stepBackward(_ input: Int) -> Int {
    return input - 1
}

위 두개의 함수는 Int 파라미터를 한개 받아, 파라미터 + 1 또는 -1 을 연산하는 함수입니다.

 

func chooseStepFunction(backward: Bool) -> (Int) -> Int {
    return backward ? stepBackward : stepForward
}

 

함수 형태가 기존과 다르게 보인다면 끊어서 읽으면 보기가 좀 편해집니다.

앞부분은 파라미터 뒤에는 리턴타입

chooseStepFunction함수는 파라미터로 Bool값을 받아 (Int) -> Int를 반환 합니다.

위 함수를 활용해서 예시를 들어보면

 

var currentValue = 3
let moveNearerToZero = chooseStepFunction(backward: currentValue > 0)

moveNearerToZero에서 backward를 보면 currentValue가 0보다 크니 true 


true는 stepBackward() 함수를 가르키고 있습니다.

즉, currentValue (intput)값을 -1씩 빼는거죠.

 

 

위 내용을 이어서 좀 더 응용을 해보자면 

아래는 currentValue가 0이 될때 까지 while 반복문을 사용한 예 입니다. 

// 전체 로직

func stepForward(_ input: Int) -> Int {
    return input + 1
}

func stepBackward(_ input: Int) -> Int {
    return input - 1   
}

func chooseStepFunction(backward: Bool) -> (Int) -> Int {
    return backward ? stepBackward : stepForward
}

var currentValue = 3
let moveNearerToZero = chooseStepFunction(backward: currentValue > 0)
print(chooseStepFunction(backward: currentValue > 0) )
print("Counting to zero:")

while currentValue != 0 {
        print("\(currentValue)..")
        currentValue = moveNearerToZero(currentValue)
}

print("zero!")

 

while이 0이 아니면 반복문을 돌립니다. 

 

moveNearerToZero는 아까 뭐였죠? 

stepBackward를 반환하고 

stepBackward는 Int를 받아서 Int 반환하는 함수였습니다.

 

다시 정리하면

이건 이렇게 풀어 쓸수 있겠네요.

 

currentValue = stepBackward(3)

근데 stepBackward는 Int를 받은값에 -1 한 값을 반환 하므로 이런모양 이겠죠. (3 - 1) -> 2

반환값은 2 

즉 currentValue = 2 

 

하지만 while != 0 조건에 걸려 계속 뺑뺑이 

돌고 돌아 0까지 가서야 

print("zero!")

를 뱉는겁니다.

 

 

 

중첩 함수 (Nested Functions)

Swift는 함수 내부에 또 다른 함수를 생성할 수 있습니다.

위에서 사용했던 chooseStepFunction을 아래와 같이 사용할 수도 있습니다.

 

func stepForward(_ input: Int) -> Int {
    return input + 1
}
func stepBackward(_ input: Int) -> Int {
    return input - 1
}

func chooseStepFunction(backward: Bool) -> (Int) -> Int {
    return backward ? stepBackward : stepForward
}

//  ----------- 중첩 함수 사용 -----------------


func chooseStepFunction(backward: Bool) -> (Int) -> Int {
    func stepForward(input: Int) -> Int { return input + 1 }
    func stepBackward(input: Int) -> Int { return input -1 }
    return backward ? stepBackward : stepForward
}

 

 

func chooseStepFunction(backward: Bool) -> (Int) -> Int {
    func stepForward(input: Int) -> Int { return input + 1 }
    func stepBackward(input: Int) -> Int { return input - 1 }
    return backward ? stepBackward : stepForward
}
var currentValue = -4
let moveNearerToZero = chooseStepFunction(backward: currentValue > 0)
// moveNearerToZero는 stepForward() 함수를 가르킵니다.
while currentValue != 0 {
    print("\(currentValue)... ")
    currentValue = moveNearerToZero(currentValue)
}
print("zero!")
// -4...
// -3...
// -2...
// -1...
// zero!
  • currentValue가 0보다 작음으로 (false)
    -> moveNearerToZero = stepForward(input: Int) -> Int

  • (while문) currentValue가 0이 아니면 반복문으로 진입

  • currentValue = moveNearerToZero(currentValue) 는 아래와 같음 
    - currentValue = stepForward(-4) -> -3 ( currentValue가 0이 아니므로 반복)
    - currentValue = stepForward(-4) -> -2 ( currentValue가 0이 아니므로 반복)
    - currentValue = stepForward(-4) -> -1 ( currentValue가 0이 아니므로 반복)
    - stop
  • print "zero!"
728x90

'iOS' 카테고리의 다른 글

ModerRIBs_tutorial 2 - 2  (0) 2022.01.26
ModernRIBs_tutorial2 - 1  (0) 2022.01.23
[Swift] 함수 (Functions) (1)  (0) 2022.01.19
[Swift] 프로토콜 (Protocol)  (0) 2022.01.16
[iOS] #available(platform name version, *)  (0) 2022.01.14