Published 2020. 9. 15. 20:48
728x90
반응형

함수를 어떻게 다양하게 사용할 수 있을지 공부해봤다.

1. 매개변수 기본값

매개 변수에 기본적으로 전달될 값을 미리 지정해둘 수 있다.
기본값을 갖는 매개변수는 매개변수 목록 중 뒤 쪽에 위치하는 것이 좋다.
매개변수 기본값을 어떻게 사용하는지 다음과 같이 확인할 수 있다.

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

말 그대로 변수의 값을 미리 지정해주어 사용한다는 것인데 예를 들어보면

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

// 매개변수 기본값을 가지는 매개변수는 호출시 생략할 수 있다.
greeting(friend: "berry")
greeting(friend: "john", me: "jay")

==================== 출력 결과 ====================
Hello berry! I'm jaynam
Hello john! I'm jay

요렇게 사용할 수 있다고 한다.
String 타입의 me 라는 변수에 jaynam 이라는 기본값을 정해두었는데
출력할 때 생략하게 되면 기본값이 출력되고 다른 값을 입력해서 출력할 수 있다.

2. 전달인자 레이블

말 그대로 해석해보면 전달할 인자를 레이블로 지정한다는 것 같은데
전달인자 레이블은 함수를 호출할 때 매개변의 역할을 좀 더 명확하게 하거나 함수 사용자의 입장에서 표현하고자 할 때 사용한다고 한다.
전달인자 레이블은 변경해서 동일한 이름의 함수를 중복으로 생성 가능하다.

// 전달인자 레이블
func 함수이름 (전달인자 레이블 매개변수1이름: 매개변수1타입, 전달인자 레이블 매개변수2이름: 매개변수2타입 ...) -> 반환타입 {
    함수 구현
    return
}
func greeting(to friend: String, from me: String) {
    print("Hello \(friend)! I'm \(me)")
}

// 전달인자 레이블 변경
func greeting(you friend: String, i me: String) {
    print("Hello \(friend)! I'm \(me)")
}

// 함수를 호출할 때에는 전달인자 레이블을 사용해야 한다.
greeting(to: "hana", from: "jaynam")
greeting(you: "hana", i: "jaynam")


==================== 출력 결과 ====================
Hello hana! I'm jaynam
Hello hana! I'm jaynam

보통은 변수 이름에 값을 넣어 출력하지만 전달인자 레이블을 통해 값을 입력해서 출력할 수 있게 된다.
여기서 전달인자를 변경하면 같은 함수를 중복해서 호출할 수 있다고 한다.

3. 가변 매개변수

가변 매개변수는 전달 답을 값의 개수를 알기 어려울 때 사용한다고 한다.
함수당 하나만 가질 수 있고 매개변수 목록 중 가장 뒤 쪽에 위치하는 것이 좋다.

// 가변 매개변수
func 함수이름 (전달인자 레이블 매개변수1이름: 매개변수1타입, 전달인자 레이블 매개변수2이름: 매개변수2타입 ...) -> 반환타입 {
    함수 구현
    return
}
func sayHelloToFriend(me: String, friends: String ... ) -> String {
    return "Hello \(friends)! I'm \(me)"
}

print(sayHelloToFriend(me: "jaynam", friends: "hana", "john", "berry"))

print(sayHelloToFriend(me: "jaynam"))

==================== 출력 결과 ====================
Hello ["hana", "john", "berry"]! I'm jaynam
Hello []! I'm jaynam

하나의 변수에 여러 개의 값을 입력할 수 있다.
출력 결과를 확인해보니 배열처럼 값이 들어간 것을 확인할 수 있었다.

그럼 변수의 타입을 컬렉션인 Array 로 하는 것과 가변 매개변수를 사용하는 것의 차이는?

컬렉션인 Array 와 가변 매개변수 둘다 여러 개의 값을 입력받아 사용할 수 있다는 점
Array 는 값을 입력받아 사용해야하지만 가변 매개변수는 함수를 호출할 때마다 값을 입력할 수 있으니
아까도 설명했듯이 값의 개수가 몇개인지 모를 경우에는 가변 매개변수를 사용하는 것이 더 효율적일 것 같다.
여러 개의 값을 동시에 다룬다는 비슷한 점이 있지만 차이점이 분명하게 존재한다는 점?

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

스위프트는 함수형 프로그래밍 패러타임을 포함하는 다중 패러다임 언어이므로 스위프트의 함수는 일급 객체다.
그래서 함수를 변수, 상수 등에 할당이 가능하고 매개변수를 통해 전달할 수 있다.
함수의 타입 표현: 반환 타입을 생략할 수 없다.

var someFuntion: (String, String) -> Void = greeting(to:from:)

someFuntion("eric", "jaynam")

someFuntion = greeting(friend: me:)
someFuntion("eric", "jaynam")

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

func runAnother(function: (String, String) -> Void) {
    function("jenny", "mike")
}

runAnother(function: greeting(friend:me:))

runAnother(function: someFuntion)

==================== 출력 결과 ====================
Hello eric! I'm jaynam
Hello eric! I'm jaynam
Hello jenny! I'm mike
Hello jenny! I'm mike

변수에 함수를 매개변수로 정하고 아까 만들어뒀던 함수를 넣었다.
변수에 두 개의 매개변수 값을 입력하게 되면 함수에 들어가 함수의 결과가 출력되게 된다.
타입이 같은 다른 함수를 넣어서 사용할 수도 있다.
String 과 String 의 두 개의 타입을 입력 받고 있기 때문에 다른 타입을 넣게 되면 당연히 안되겠지?

runAnother 란 함수에서는 함수의 입력 값을 함수 내부에서 구현해서 출력하고 있다.

이렇게 다양한 방법을 사용해서 함수를 구현할 수 있고 경우에 따라 함수가 달라진다는 점 !
사실 나에게는 너무 어색한 함수의 사용법이기 때문에  여러 번 사용해보면서 익숙해져야겠다.

 

- 참고 사이트 - 

www.edwith.org/boostcamp_ios/lecture/11225

 

[LECTURE] 08. 함수 고급 : edwith

생각해보기   ▶ 내가 만든 함수 중 전달인자 레이블을 활용하는 것이 있나요? 무엇이 있는지 소개해주세요. 또 왜 전달인자 레이블이 필요했는지 설명해주세요 :) ▶ '가변 매개변수... - 부스��

www.edwith.org

 

728x90
반응형

'iOS > Swift' 카테고리의 다른 글

[Swift] 9. 반복문 (for-in, while, repeats-while)  (0) 2020.09.16
[Swift] 8. 조건문  (0) 2020.09.16
[Swift] 6. 함수 기본 (func)  (0) 2020.09.08
[Swift] 5. 컬렉션 타입 (Array, Dictionary, Set)  (0) 2020.09.08
[Swift] 4. Any, AnyObject, nil  (0) 2020.09.07
복사했습니다!