[Swift] 함수에 대해 알아보자 (확장편)

안녕하세요~ 차니에요!

 

지난 기본편에 이어서 확장편 포스팅하겠습니다.

이전 포스팅 먼저 보고 와주세요~

 

1. 파라미터 확장편

1-1. 파라미터 기본값 설정

func printInfo(name: String = "channy", age: Int = 28) {
    print("name: \(name), age : \(age)")
}

위와 같이 함수의 인자에 기본값 설정이 가능합니다.

인자에 기본값이 설정되어 있으므로 호출 시에 선택하여 값을 넘길 수 있게 됩니다.

1-2. 값에 의한 호출 (call by value)

함수 내부에서 인자 값을 변경하려고 하면 에러가 납니다.

Value Type(ex. String, Int...)은 인자로 사용 시 값이 복사되어 상수(let)로 사용하게 됩니다.

즉 인자로 받은 값은 함수 내부에서 수정이 불가합니다.

 

1-3. 주소에 의한 호출 (call by reference)

class Person {
    var name: String
    var age: Int
    
    init(name: String, age: Int) {
        self.name = name
        self.age = age
    }
}

func changeName(person: Person, name: String) {
    person.name = name
}

var channy = Person.init(name: "channy", age: 28)
print("1: name = \(channy.name)") // channy

changeName(person: channy, name: "chanchan")
print("2: name = \(channy.name)") // chanchan

Refence Type의 인자는 주소에 의한 참조이므로 프로퍼티 값의 변경이 가능합니다.

Person 인스턴스(channy)를 생성하여 해당 인스턴스를 인자로 넘겨주어 값을 변경하는 예제입니다.

 

1-4. Value Type을 주소 참조 방식으로 전달하는 방법

func printName(name: inout String) {
    name = "chanchan!!"
    print(name)
}

var name = "channy"
print(name)	        // channy
printName(name: &name) // chanchan!!
print(name) 	      // chanchan!!

인자의 자료형(Type) 앞에 inout 키워드를 넣고 호출 시에 &변수명 으로 호출해주시면 됩니다.

 

1-5. 가변 파라미터

func sum(list num: Int...) -> Int {
    num.reduce(0, +)
}

print(sum(list: 1, 2, 3, 4, 5, 6, 7, 8, 9, 10)) // 55

위와 같이 하나의 파라미터(list)가 여러개의 아규먼트를 받을 때 사용합니다.

자료형(Type) 뒤에 ... 을 입력하여 컴파일러에게 연속해서 받을 것임을 알려주면됩니다.

 

이때 list의 타입은 배열입니다.

 

2. 함수 표기법

Apple Document 중 일부

xCode로 개발하다보면 애플 문서를 보고 함수에 대한 내용을 들여다 보거나 할 일이 있는데 updateValue(_:forKey:) 이런식으로 표기되어 있는걸 함수 표기법으로 표기되었다고 합니다.

 

2-1. 파라미터가 없는 경우

func printInfo()

파라미터가 없는 함수의 함수 표기법은 printInfo 로 끝이 납니다.

 

2-2. 파라미터가 있는 경우

func printInfo(_ nm: String, age: Int)

위 함수를 함수 표기법으로 표기하면 printInfo(_:age:) 가 됩니다.

함수명 뒤로 인자들을 으로 구분하여 적어주면 됩니다.

이때 생략된(와일드 카드 패턴) 인자들은 _(언더바)로 명시해주어야합니다.

 

3. 일급 객체 함수와 클로저

지금까지 함수에 대해 정의와 사용법 그리고 특징들을 알아보았는데요.

Swift는 객체 지향의 함수형 언어로 스위프트의 함수는 일급 객체입니다.

이와 관련된 포스팅을 이전에 해놓은게 있으니 함수에 대해 더 깊게 공부하고 싶으신 분들은 일급 객체 클로저 순으로 보시면 좋을 것 같습니다.

 

2021.07.23 - [iOS/Swift] - [Swift] 일급 객체(First-class citizen)

2021.07.26 - [iOS/Swift] - [Swift] 클로저(Closure)에 대해 알아보자

 

오늘 준비한 내용은 여기까지 입니다! (__)