본 포스팅은 '스위프트 프로그래밍 (3판) - 야곰 저' 도서와 앨런 Swift 문법 마스터스쿨 강의를 통해 공부하며 정리하는 포스팅입니다.
혹시 틀린 부분이 있거나 질문이 있으시다면 언제든지 댓글 달아주시면 정말 감사하겠습니다 :)
0. 함수를 사용하는 이유
- 반복되는 동작을 단순화하여 코드 재사용
- 코드를 논리적 단위로 구분하여 모듈화
- 코드길이가 긴 것을 단순화
1. 함수
- Swift에서 함수는 일급 객체이다. (그 자체로 반환 값, 인자로 사용 가능)
func 함수 이름(매개변수1: 자료형, 매개변수 2: 자료형...) -> 반환타입 {
실행 구문
return 반환값
}
- 매개변수 = 파라미터 = 인자 : 함수의 정의에서 입력값으로 사용되는 변수
- 인수 = 아규먼트 : 함수의 호출에 사용되는 실제 값
1) 매개변수 이름과 전달인자 레이블(아규먼트 레이블)
- 매개변수의 이름 앞에 전달인자 레이블을 붙일 수 있고, 이를 통해 매개변수의 역할을 명확하게 할 수 있음
func sayHello(from myName:String, to name:String) -> String {
return "Hello \(name)! I'm \(myName)"
}
//myName, name: 매개변수(=파라미터) 이름
//from, to : 전달인자 레이블
print(sayHello(from: "yuri", to: "Jenny")
//"yuri", "Jenny" : 인수(=아규먼트)
- 전달인자 레이블 사용 시, 함수 내부에서는 전달인자 레이블을 사용할 수 없으며 외부에서는 매개변수 이름을 사용할 수 없다.
- 전달인자 레이블이 변경되면, 함수 자체가 달라지므로 함수 중복 정의(오버로드)가 가능함
2) 와일드 카드 식별자 사용
- 위 예시와 같이 일일이 전달인자 레이블이나 매개변수 이름을 지정하기가 귀찮다면, 와일드 카드 식별자(_ )를 앞에 붙여서 생략할 수 있다.
func sayHello(_ myName:String, _ name:String) -> String {
return "Hello \(name)! I'm \(myName)"
}
// _ : 와일드카드 식별자
print(sayHello("yuri", "yulzzang")) //Hello yulzzang! I'm yuri
3) 매개변수 기본값 사용
- 매개변수가 들어오지 않을 경우 사용할 기본값을 지정할 수 있다.
func sayHello(_name: String, times: Int = 3) -> String {
var result: String = ""
for _ in 0..<times {
result += "Hello \(name)!" + " "
}
return result
}
print(sayHello("yuri")) // Hello yuri! Hello yuri! Hello yuri!
print(sayHello("yuri", times: 2)) // Hello yuri! Hello yuri!
4) 가변 매개변수
- 매개변수로 몇 개의 값이 들어오는지 모를 때 사용하며, 0개 이상의 값을 받아올 수 있음
- 가변 매개변수로 사용할 매개변수의 타입 뒤에 ... 를 붙이면 됨
- 가변 매개변수로 들어온 인자값은 배열처럼 사용할 수 있음
- 함수마다 가변 매개변수는 1개만 사용가능
func sayHelloToFriends(me: String, friends names: String...) -> String {
var result: String = ""
for friend in names { //함수 내부에서는 전달인자 레이블 사용 불가
result += "Hello \(friend!)" + " "
}
result += "I'm " + me + "!"
return result
}
print(sayHelloToFriends(me: "yuri", friends: "yujeong", "jeonga", "sugil")
//Hello yujeong! Hello jeonga! Hello sugil! I'm yuri!
5) 입출력 매개변수
- Swift의 함수는 보통 함수의 전달인자로 값이 전달될때, 해당 값을 복사하여 전달하지만, 원래 값을 변경하기 위해서는 함수에 입출력 매개변수를 지정하고 참조를 전달하면 된다.
- 매개변수의 자료형 앞에 'inout' 키워드를 붙이고, 전달될 변수나 상수앞에는 앰퍼샌드(&)를 붙여서 참조하게 한다.
- 입출력 매개변수는 가변 매개변수가 될 수 없으며, 기본값을 가질 수 없다.
var numbers = [1, 2, 3]
func nonReference(_ arr: [Int]) {
var copiedArr = arr
copiedArr[1] = 1
}
func reference(_arr: inout [Int){
arr[1] = 1
}
nonReference(numbers)
print(numbers) //1, 2, 3
reference(&numbers)
print(numbers) //1, 1, 3
6) 반환값을 무시할 수 있는 함수
- 가끔씩 함수의 반환값이 반드시 필요하지 않은 경우도 있는데, 이럴때 @discardableResult 를 사용하면 경고를 없앨 수 있음
@discardableResult func discardResult(_ something: String) -> String {
print(something)
return something
}
disracdResult("hello") //hello //경고창 X
2. 함수 사용 시 주의사항
- 파라미터는 변수가 아닌 상수이므로, 함수 내부적으로 값이 불가능하다. 값의 변경을 원한다면 새로운 변수에 값을 복사해서 사용해야 한다.
- 함수 내에서 선언한 변수 혹은 함수는, 함수 밖에서 사용이 불가능하다.
- 리턴타입이 있는 함수는 특정 값을 리턴하면서 함수를 그 자리에서 바로 중지하며, 리턴타입이 없는 함수는 함수를 그 자리에서 중지한다.
'🐦 Swift' 카테고리의 다른 글
[Swift] 변수와 상수, 의미 있는 이름 (0) | 2023.05.09 |
---|---|
[Swift] 옵셔널, 옵셔널 바인딩, 강제 추출, nil-coalescing (0) | 2023.03.20 |
[Swift] 흐름제어 (0) | 2023.03.14 |
[Swift] 데이터 타입 기본 (0) | 2023.03.08 |
[Swift] 스위프트 (0) | 2023.03.07 |