Swift/개념 & 응용

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

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

안녕하세요.

 

지난 Swift 문법 - 함수(1)에 이어서 함수에 대해 알아보겠습니다.

이번에도 예제를 많이 사용하여 쉽게 이해 가도록 하였습니다.

 

지난 포스팅은 아래 링크를 누르면 바로 보실 수 있습니다.

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

 

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

안녕하세요. 오늘은 Swift의 함수에 대해 알아보겠습니다. 어떤 언어든 함수 부분이 첫 번째 고비인 것 같아요. 저도 공부하면서 다른 문법보다는 어려운 감이 있었는데요. 파이팅하면 좋겠습니

jeong9216.tistory.com

 

그럼 시작하겠습니다.


참고 자료

Apple Swift Document

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

 

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

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

 

Smile Han

 

www.youtube.com


디폴트 매개변수 정의하기

함수를 호출할 때 argument로 전달하는 값이 없는 경우,

정의에서 설정한 디폴트 매개변수 값을 사용합니다.

 

함수 선언 방법을 점차 늘려가니 너무 길어진 감이 있네요.

func <함수명> (<외부 매개변수 이름> <내부 매개변수 이름>: <매개변수 타입> = <디폴트 값>, ... ) -> <반환값 타입> {
	// 함수 코드
}

예시

func getMessage(type: Int, message: String = "Default Message") -> String {
    return ("\(type) : \(message)")
}

let msg = getMessage(type: 0)
print(msg)
//실행 결과
//0 : Default Message

매개변수 message에 argument값을 설정하지 않으면 디폴트인 "Default Message"를 사용하도록 선언했습니다.

따라서 출력에 저희가 type값으로 넘긴 0과 디폴트 값인 Default Message가 함께 출력됩니다.


여러 값 반환하기

Swift의 함수를 공부하면서 가장 놀란 부분입니다.

 

Swift의 함수는 여러 결과 값들을 튜플로 감싸서 반환할 수 있습니다.

즉, 여러 값을 한 번에 반환할 수 있다는 의미입니다.

말만 들어도 정말 편할 거 같습니다.

 

예시

func converter(_ inch: Float) -> (centimeters: Float, meters: Float) {
    let centimeters = inch * 2.54
    let meters = inch * 0.0254
    return (centimeters, meters)
}

let resultConverter = converter(20)
print(type(of: converter))
print("20 inch => \(resultConverter.centimeters)cm, \(resultConverter.meters)m")
//실행 결과
//(Float) -> (centimeters: Float, meters: Float)
//20 inch => 50.8cm, 0.508m

함수 결과와 함께 함수 타입도 출력하였습니다.

함수 타입 출력을 보니 return 타입이 튜플인 것을 알 수 있습니다.

 

한 번의 호출만으로 centimeters값과 meters값을 구할 수 있습니다.

실제 앱을 만들 때도 아주 유용하게 사용할 것 같네요.


가변 매개변수

함수의 매개변수 개수를 가변적으로 설정할 수도 있습니다.

대표적인 가변 매개변수 함수는 지금까지 자주 접한 print()가 있겠습니다.

 

매개변수가 몇 개 들어갈지 확실하지 않을 때 사용하면 됩니다.

매개변수 타입 옆에 ...를 붙여주면 가변 매개변수로 선언 가능합니다.

func <함수명> (<매개변수 이름>: <매개변수 타입>... ) -> <반환값 타입> {
// 함수 코드
}

 

예시

func printMessages(strings: String...) {
    for string in strings {
        print(string, terminator: " ")
    }
}
print(type(of: printMessages))
printMessages(strings: "Hello", "Hi", "JeongJu")

//실행 결과
//(String...) -> ()
//Hello Hi JeongJu

이번에도 함수 타입을 함께 출력했습니다.

가변 매개변수로 선언하면 타입에서도 ...이 함께 출력되어 가변적이라는 것을 알 수 있네요.

가변 매개변수는 호출 할 때 argument 옆에 나열하여 작성하면 됩니다.


inout 매개변수

Swift는 기본적으로 call by value입니다.

함수로 전달한 argument가 함수 내부에서 값이 변해도 원본에는 영향을 주지 않는다는 의미인데요.

 

inout 키워드를 사용하면 함수 내부의 작업이 원본에도 영향을 주는

call by reference를 Swift에서 구현할 수 있습니다.

참고로 Swift 3 이후부터 가능합니다.

 

함수의 선언부에서 매개변수 타입 앞에 inout을 작성해서 입출력 매개변수(inout parameter)로 선언하면 됩니다.

호출할 때는 & 기호를 변수 앞에 적어주세요.

 

예시

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

var originalValue = 10
print(originalValue)
print(doubleValue(value: &originalValue))
print(originalValue)
//실행 결과
//10
//20
//20

originalValue를 10으로 초기화하였습니다.

첫 print()는 초기화 값 그대로 10이 출력되었습니다.

inout 매개변수를 가진 doubleValue에 originalValue를 넘깁니다.

originalValue를 두 배로 하여 출력되어 20입니다.

 

일반적인 함수라면 세 번째 출력에서 call by value이기 때문에 10이 출력되었을 건데요.

inout을 사용하여 원본에도 영향을 받아 20이 출력되었습니다.


다음 포스팅이 함수 문법 마지막입니다.

함수의 내용이 많아 총 세 개로 나누었습니다.

끝까지 봐주시면 감사하겠습니다.

 

감사합니다!


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

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

공감 댓글 부탁드립니다.

 

반응형