함수 고급

CHOI·2021년 5월 25일
0

Swift

목록 보기
6/10
post-thumbnail

1. 매개 변수의 기본값

매개 변수에 기본으로 전달될 값들을 미리 지정해줄 수 있다.

func greeting(friend: String, me: String = "CHOI") {
    print("Hello \(friend)! I'm \(me)")
}

greeting(friend: "KIM")

//>> Hello KIM! I'm CHOI

그리고 이렇게 기본값을 가지는 매개 변수들은 가장 뒤쪽에 적어주는것이 좋다.

func greeting(friend: String, me: String = "CHOI") {
    print("Hello \(friend)! I'm \(me)")
}

greeting(friend: "KIM", me: "HA")

//>> Hello KIM! I'm HA

만약 기본값 외에 따라 값을 넣어주고 싶으면 me 라는 매개변수를 명시한다음에 값을 지정해주면 된다.

2. 전달인자 레이블(Argument Label)

  • 함수를 호출할 때 함수 사용자의 입장에서 매개변수의 역할을 좀 더 명확하게 표현할 때 사용
  • 전달인자 레이블은 변경하여 동일한 함수의 이름을 중복하여 생성가능
func greeting(friend: String, me: String = "CHOI") {
    print("Hello \(friend)! I'm \(me)")
}

greeting(friend: "KIM", me: "HA")

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

greeting(friend: "KIM", me: "HA")

//>> Hello KIM! I'm HA
//>> Hello KIM! I'm HA

함수 외부에서는 꼭 전달인자 레이블을 사용해야하고 함수 내부에는 꼭 매개변수 이름을 사용해야한다.

3. 가변 매개변수

  • 전달 받을 값의 개수를 알기 어려울 때 사용
  • 가변 매개변수는 함수당 1개만 가질 수 있다.
  • 기본값이 있는 매개변수 같이 가변 매개변수를 맨 뒤에 쓰는게 좋다.
func sayHelloToFriends (me: String, friends: String...) -> String {
    return "Hi \(friends), I'm \(me)"
}
print(sayHelloToFriends(me: "CHOI", friends: "KIM","LEE"))

//>> Hi ["KIM", "LEE"], I'm CHOI

print(sayHelloToFriends(me: "CHOI"))

//>> Hi [], I'm CHOI

만약 가변인자에 아무값도 넘기고 싶지 않으면 그냥 지우면 된다.

만약 (friends: ) 이나 (friends: nil) 를 하면 오류가 발생한다.

4. 데이터 타입으로서의 함수

Swift에서 함수는 일급객체로 변수나 상수에 저장이 가능하다.

그리고 또한 매개변수를 통해 전달 될 수 있다.

func greeting(to friend: String, from me: String = "CHOI") {
    print("Hello \(friend)! I'm \(me)")
}
var somefunction: (String, String) -> Void = greeting(to:from:)
somefunction("there", "KIM")

//>> Hello there! I'm KIM

somefunction 라는 변수에 (String, String) -> Void 즉, 문자열 두개를 매개변수를 가지고 반환값이 없는 함수가 들어온다 라고 명시 해주는 것이다. 그리고 그 함수가 greeting(to:from:) 라고 명시 해준 것이다.

func sayHelloToFriends(me: String, friends: String...) -> String {
    return "Hello \(friends)! I'm \(me)!"
}
var somefunction: (String, String) -> Void = sayHelloToFriends(me:friends:)
somefunction("there", "KIM")

//>> 오류 발생

여기선 friends 가 String 타입이기는 하나 가변 매개변수 이기 때문에 오류가 발생한다.

이처럼 타입이 다른 함수는 할당할 수 없다.


또한 비슷하게 함수 타입을 매개변수로 지정할 수 있다.

func func1(var1: (String, String) -> Void){
    var1("str1", "str2")
		var1("str3", "str4")
}

func1(var1: greeting(friend:me:))
//>>Hello str1! I'm str2
//>>Hello str3! I'm str4

func1 의 매개변수 var1 은 String 2개를 매개변수로 가지고 반환값이 없는 함수의 타입을 가진다는 의미이다.

var fun_var: (String, String) -> Void = greeting(friend:me:)
func1(var1: fun_var)

//>>Hello str1! I'm str2
//>>Hello str3! I'm str4

그리고 또한 이렇게 변수에 담겨있는 함수를 넘겨줄 수 있다.


전체적으로 다시한번 살펴보면 아래와 같다.

func 함수이름_A(A매개변수: (문자열, 문자열) -> 반환값없음){
		함수이름_A("매개변수_1", "매개변수_2")
}

함수이름_A(A매개변수: 함수이름_b)

복잡하니까 한줄씩 다시 살펴보면

func 함수이름_A(A매개변수: (문자열, 문자열) -> 반환값없음)

문자열 2개를 가지고 반환값이 없는 함수를 매개변수로 지정한다. 즉 매개변수는 함수이다.

	함수이름_A("매개변수_1", "매개변수_2")

그리고 A매개변수로 받는 함수에 들어갈 매개변수는 "매개변수_1", "매개변수_2" 이다.

즉 예를 들어서 함수이름_A 의 매개변수가 다른 함수 함수이름_b 를 받을 때 함수이름_b 에 들어갈 매개변수가 "매개변수_1", "매개변수_2" 라는 의미이다.

함수이름_A(A매개변수: 함수이름_b)

함수이름_A를 실행하라 이때 매개변수로 들어가는 함수는 함수이름_b의 타입을 가진다.

profile
벨로그보단 티스토리를 사용합니다! https://flight-developer-stroy.tistory.com/

0개의 댓글

관련 채용 정보