본문 바로가기

학교 수업/ios 개발 공부

[swift] 함수에서 매개변수 지정, 전달인자 레이블, 가변 매개변수, 데이터 타입으로서의 함수

안녕하세요 소프트웨어 공부하는 레오존입니다.

이번 포스팅에선 swift에서 사용되는 함수의 다양한 모습에 대해 알아보도록 하겠습니다.

 

 

매개변수 기본 값

 

매개변수 기본 값은 함수의 매개변수에 값이 들어오지 않아도 자동으로 매개변수 값을 갖게 되는 것입니다.

매개변수 기본값은 매개변수 목록 중에서 맨 뒤쪽에 위치하는 것이 좋습니다. 

매개변수 기본 값이 존재하는 함수의 구조는 아래와 같습니다. 아래의 형태에서 매개변수 2는 기본 값이 지정된 매개변수로 등호를 통해 매개변수 기본 값을 지정해 줄 수 있습니다.

func 함수이름(매개변수1 이름: 매개변수1 타입, 매개변수2 이름: 매개변수2 타입 = 매개변수 기본값 ...) -> 반환타입 {
    
    함수 구현부 
    
    return 반환값
}

매개변수 기본 값이 존재하는 예시는 아래와 같습니다. leozone 이라는 값이 매개변수 me에 string 데이터타입으로 지정되어 있습니다. 따라서 me라는 변수에는 leozone이라는 값이 들어가게 됩니다. 이전 포스팅에서 정리했듯이 반환타입은 함수의 형태에 따라 생략할 수도 있습니다. 

func greetinghi(friend: String, me: String = "leozone") {
    print("Hello \(friend)! It's \(me)!")
}

 

매개변수 기본값을 가지는 매개변수는 호출 시 생략도 가능합니다.

greetinghi(friend:"swift")  //매개변수 생략함, 아래와 같은 결과가 나옵니다.
//Hello swift! It's leozone!

 

매개변수 기본 값이 지정되었다고 하더라도 매개변수에 다른 값을 넣고 싶을 때 변경해 줄 수 있습니다.

greetinghi(friend:"yo", me:"pizi") //기본값이 지정된 매개변수 me에 pizi라는 값 넣어주기, 결과는 아래와 같습니다.
//Hello yo! It's pizi!

 

 

전달인자 레이블

 

전달인자 레이블은 함수를 호출할 때 매개변수의 역할을 더 명확하게 하거나 함수 사용자의 입장에서 매개변수가 어떤 역할을 할 것인지 명확하게 표현하고자 할 때 사용됩니다. 전달인자 레이블은 아래와 같은 형태로 사용할 수 있습니다.

func 함수이름(전달인자 레이블 매개변수1이름: 매개변수1타입, 전달인자 레이블 매개변수2이름: 매개변수2타입 ...) -> 반환타입 {
    
    함수 구현부
    
    return
}

 

전달인자 레이블을 사용하면 함수의 중복 정의도 쉽게 할 수 있습니다. 아래의 예시를 참고해 주세요. 위에서 선언한 greetinghi라는 함수와 똑같은 이름의 greetinghi라는 이름의 전달인자 레이블이 포함된 함수를 선언할 수 있습니다. to와 from의 전달인자 레이블이 포함된 greetinghi는 함수 이름이 바뀐 효과를 갖기 때문에 위에서 선언된 greetinghi라는 함수와 다른 함수로 취급받습니다. 실제로 swift에서는 greetinghi 뿐만 아니라 전달인자 레이블 to와 from이 전부 함수 이름으로 취급되기 때문입니다. 함수 외부에서는 to라는 전달인자레이블을 사용해서 함수를 호출하게 되고 함수 내부에서는 friend라는 매개변수 이름으로 함수를 호출하게 됩니다.

func greetinghi(to friend: String, from me: String) {
    print("Hello \(friend)! I'm \(me)!")
}

함수 외부에서는 to라는 전달인자레이블을 사용해서 함수를 호출하게 되고 함수 내부에서는 friend라는 매개변수 이름으로 함수를 호출하게 됩니다. 전달인자 레이블을 사용하면 사용자 입장에서 매개변수 역할을 명확하게 표현할 수 있다는 장점이 있습니다. 함수 외부에서는 꼭 전달인자 레이블을 사용해야 하고 함수 내부에서는 꼭 매개변수 이름을 사용해야 합니다.

greetinghi(to: "tstory", from: "leozone")  //to와 from을 사용해서 매개변수 역할을 명확하게 표현함, 결과는 아래와 같습니다.
//Hello tstory! I'm leozone!

 

 

가변 매개변수

 

매개변수를 통해 전달되는 값들이 명확하지 않다면 가변 매개변수를 사용할 수 있습니다. 가변 매개변수는 매개변수 타입뒤에 마침표 (.) 세개를 찍어 나타낼 수 있습니다. 가변 매개변수는 함수 당 하나만 가질 수 있습니다. 또한, 매개변수 목록 중에서 맨 뒤에 위치하는 것이 좋습니다. 가변 매개변수는 함수에서 아래와 같은 형태로 사용할 수 있습니다.

func 함수이름(매개변수1이름: 매개변수1타입, 전달인자 레이블 매개변수2이름: 매개변수2타입...) -> 반환타입 {
    
    함수 구현부
    
    return
}

가변 매개변수가 포함된 함수의 예시는 아래와 같습니다. 매개변수 이름 score의 매개변수 타입 뒤에 마침표 세 개(...)를 붙여서 score 가변 매개변수를 생성했습니다.

func scores(me: String, score: Int...) -> String {
    return "\(me)! Your score is \(score)!"
}

scores 함수를 호출해보도록 하겠습니다. 함수를 호출할 때, 전달인자가 없거나, 가변 매개변수인 score에 nill을 넣어주면 오류가 발생하게 됩니다. 가변인자에 아무 값도 넘기고 싶지 않다면 전달인자 레이블을 생략해야 합니다.

print(scores(me: "leozone", score: 98,100,20)) //전달 받는 값이 여러개, 출력 결과는 아래와 같습니다.
//leozone! Your score is [98, 100, 20]!

print(scores(me: "leozone" ))       //전달인자 레이블 생략, 출력 결과는 아래와 같습니다.
//leozone! Your score is []!

 

 

위에서 언급한 기본값을 갖는 매개변수, 전달인자 레이블, 가변 매개변수는 전부 섞어서 사용할 수 있습니다.

 

 

 

 

데이터 타입으로서의 함수

 

swift는 함수형 프로그래밍 패러다임을 포함하는 다중 패러다임 언어이며 swift의 함수는 일급객체입니다. swift의 함수가 일급객체라는 말은 변수 혹은 상수에 함수를 대입할 수 있고, 매개변수를 통해 함수를 전달할 수 있다는 의미를 지니고 있습니다.

먼저 상수 혹은 변수에 함수를 대입한 예시입니다. newfunction이라는 변수에 string타입의 두 매개변수를 받아 반환값이 없는 함수가 들어올 것이라고 명시해줍니다. 그리고 이전에 만들었던 greetinghi라는 함수를 newfunction이라는 변수에 할당해 줍니다.

var newFunction: (String, String) -> Void = greetinghi(to:from:)
newFunction("tstory", "leozone")  //결과는 아래와 같습니다.
//Hello tstory! I'm leozone!

타입이 다른 함수는 변수에 할당할 수 없습니다. 이전에 만들었던 scores라는 함수는 가변매개변수를 가지고 있고 Int타입의 매개변수를 지니고 있기 때문에 newFunction에 할당할 수 없습니다.

//newFunction = scores(me: score:)   //오류발생

또한, 함수 타입을 매개변수 타입으로 지정해 주면 function이라는 매개변수를 함수 안에서 실행할 수 있게 됩니다. 아래 예시를 참고해 주세요. 예시에서 보이듯이 string이라는 타입의 매개변수를 받아 반환값이 없는 함수가 function이라는 이름의 매개변수의 타입이라는 의미입니다. 함수가 매개변수의 타입이 되는 것이죠. 이러한 방법으로 함수를 직접 매개변수로 넘겨줄 수 있습니다.

func severalhi(function: (String, String) -> Void) {
    function("tstory", "leozone")
}



//severalhi 호출
severalhi(function: greetinghi(friend:me:)) //결과는 아래와 같습니다.
//Hello tstory! It's leozone!

severalhi(function: newFunction) //결과는 아래와 같습니다.
//Hello tstory! I'm leozone!

 

 

 

이 포스팅은 야금님의 ios 프로그래밍을 위한 스위프트 기초 강의를 듣고 정리한 내용입니다.

감사합니다.

 

 

야곰님의 ios 프로그래밍을 위한 스위프트 기초 바로가기

https://www.boostcourse.org/mo122/joinLectures/38564

 

iOS 프로그래밍을 위한 스위프트 기초

부스트코스 무료 강의

www.boostcourse.org