Swift/개념 & 응용

[Swift] Swift 문법 - 함수(3)

유정주 2021. 8. 23. 00:10
반응형

안녕하세요.

 

Swift문법 함수의 마지막 포스팅입니다.

오늘은 Swift 함수의 특이한 특징에 대해 알아보겠습니다.

 

함수 1편 보러 가기

2021.08.21 - [개발,IT,코딩] - [Swift] Swift 문법 - 함수(1)

 

함수 2편 보러 가기

2021.08.22 - [개발,IT,코딩] - [Swift] Swift 문법 - 함수(2)


참고 자료

Apple Swift Document

https://developer.apple.com/documentation/swift

 

해당 포스팅은 Smile Han님의 유튜브 영상을 참고하며 작성하였습니다.

https://www.youtube.com/channel/UCM8wseo6DkA-D7yGlCrcrwA

 

Smile Han

 

www.youtube.com


Swift 함수는 1급 객체

Swift는 함수를 데이터 타입처럼 처리할 수 있습니다.

Swift 함수는 1급 객체(first class object) 또는 1급 시민(first class citizen)으로 취급하기 때문인데요.

여기서 1급 객체란 아래 조건을 충족하는 객체를 의미합니다.

 

1급 객체의 조건

  1. 변수에 저장할 수 있다.
  2. 매개변수로 전달할 수 있다.
  3. 리턴 값으로 사용할 수 있다.

즉 Swift에서는 함수를 상수 또는 변수에 할당 가능하여 함수 이름 대신에 상수 이름을 이용하여 호출 가능하고

어떤 함수에 다른 함수를 인자로 넘겨주거나 함수의 반환 값으로 함수를 넘겨줄 있습니다.

 

세 가지 케이스에 대해 하나씩 예제를 보도록 하겠습니다.


상수, 변수에 할당하여 사용

예제 1

func printHello() {
    print("Hello")
}

let sayHello = printHello
sayHello()
//실행결과
//Hello

상수에 함수를 할당하였습니다.

함수를 할당한 상수 이름으로 함수 호출이 가능합니다.

따라서 printHello()가 아니라 sayHello()를 해도 동일한 결과가 출력되었습니다.

 

예제 2

func doubleValue(_ value: Int) -> Int {
    return value + value
}

var sayResult = doubleValue
print(type(of: sayResult))
print(sayResult(10))
//실행결과
//(Int) -> Int
//20

이번에는 변수에 할당을 하였습니다.

복습 겸 외부 매개변수 명으로 _를 써서 호출할 때 매개변수 명을 생략할 수 있게 선언했습니다.

 

이번에는 함수를 할당한 변수의 타입도 함께 출력해보았습니다.

결과는 원본 함수와 동일한 타입으로 나오네요.

 

Swift에서는 변수나 상수에 함수를 담으면 타입도 동일하다는 것을 알 수 있습니다.


함수를 매개변수로 사용

예제

func inchesToFeet (inches: Float) -> Float {
    return inches * 0.0834
}

func inchesToYards (inches: Float) -> Float {
    return inches * 0.0278
}

let toFeet = inchesToFeet //함수를 상수에 할당
let toYards = inchesToYards //함수를 상수에 할당

//매개변수 타입이 함수 타입이다.
func outputConversion(converterFunc: (Float) -> Float, value: Float) {
    //매개변수로 전달받은 함수를 호출한다.
    let result = converterFunc(value)
    print("Result = \(result)")
}

//매개변수로 함수를 전달한다.
outputConversion(converterFunc: inchesToFeet, value: 10)
outputConversion(converterFunc: inchesToYards, value: 10)

//실행 결과
//Result = 0.83400005
//Result = 0.278

모든 포스팅 통틀어 가장 긴 예제인 것 같네요.

코드가 긴 만큼 주석을 자세히 달았습니다.

 

인치를 피트로 변환하는 함수, 인치를 야드로 변환하는 함수 총 두 개를 정의하였습니다.

두 함수 모두 (Float) -> Float형입니다.

 

outputConversion()의 매개변수는 총 두 개인데요.

첫 번째 매개변수 타입은 (Float) -> Float로 함수를 전달받습니다.

 

전달받은 함수는 내부 매개변수 명으로 호출할 수 있습니다.

따라서 inchesToFeet를 전달하든, inchesToYards로 전달하든

모두 convertFunc로 호출할 수 있는 것이죠.

 

Swift의 아주 훌륭한 장점 중 하나라고 생각합니다.


함수를 리턴 값으로 사용

예제

func inchesToFeet (inches: Float) -> Float {
    return inches * 0.0834
}

func inchesToYards (inches: Float) -> Float {
    return inches * 0.0278
}

func getFeetFunc() -> (Float) -> Float {
    return inchesToFeet
}

var feetFunc = getFeetFunc()
print(feetFunc(10))
//실행 결과
//0.83400005

이번에는 함수를 return 값으로 사용하는 예시입니다.

마땅한 예시가 없어 직접 만든 예시라 퀄리티가 떨어지네요.

 

getFeetFunc()는 매개변수는 없고 return 타입이 (Float) -> Float입니다.

해당 함수를 호출하면 inchesToFeet 함수를 return 합니다.

 

feetFunc 변수에 getFeetFunc()의 return값을 할당하면 변수에 inchesToFeet()가 할당됩니다.

따라서 변수 이름인 feetFunc를 이용해 함수 호출이 가능한 것입니다.

 

말로 하니 길어졌는데 예제를 보고 이해를 하면 쉬운 개념입니다.


이렇게 하여 함수 문법이 모두 끝이 났습니다.

최대한 자세히 설명하고 싶은 마음에 말이 길어진 느낌이 있네요.

 

Swift의 함수는 확실히 편의성이 뛰어난 느낌입니다.

1급 객체로서 변수, 상수에도 할당이 가능하고 매개변수, 반환 값으로도 사용이 가능하니까요.

 

심지어 함수 2탄에서 설명했듯이 한 번에 여러 값을 반환도 가능합니다.

실제 앱을 만들며 응용하면 재미가 있을 거 같아요.

 

감사합니다!


아직은 초보 개발자입니다.

더 효율적인 코드 훈수 환영합니다!

공감 댓글 부탁드립니다.

 

 

반응형