코딩에서 가장 많이 사용하는,
그리고 오류도 많이 발생하는,
하지만 가끔은 편리한,
코딩의 꽃!
함수에 대해 알아보자
함수의 장점
- 반복되는 코드 재사용 가능
- 미리 함수를 정의하고 나면, 쉽게 사용만 하면 됨
함수의 기본 형태
함수를 활용하기 위해서는 정의와 호출을 알고 있어야 한다.
기본적인 함수 정의와 호출정의한 함수를 호출하면 함수 내부의 실행문이 실행된다.
// 정의
func someFunction() {
print("이 형식이 기본적인 함수 정의이다.")
}
// 호출
someFunction()
함수의 Input과 Output
함수는 Input 값과 Output 값을 가질 수 있는데, 각 경우에 따라서 코드 형식이 약간 달라진다.
1. Input 값과 Output 값 모두 없는 경우
// 정의
func someFunction() {
print("이 형식이 기본적인 함수 정의이다.")
}
// 호출
someFunction()
2. Input 값만 있는 경우
// 정의
func someFunction(name: String) {
print("안녕, \(name)"
}
// 호출
someFunction(name: "홍길동")
함수 정의에서 name을 파라미터 또는 매개변수라고 한다.
함수 호출에서 실제로 name에 전해주는 값(”홍길동”)을 아규먼트(Argument)라고 한다.
Input 값이 있는 함수는 호출 시에 반드시 아규먼트를 전해주어야 한다.
3. Output 값만 있는 경우
// 정의
func someFunction() -> Int {
return 3
}
// 호출
someFunction()
// 활용
print(someFunction())
var a = someFunction()
Output 값이 있는 함수는 Output 값의 타입을 화살표와 함께 파라미터 뒤에 명시해주어야 한다.
함수의 Output 값을 반환할 때 return 키워드를 사용한다.
4. Input 값과 Output 값 모두 있는 경우
// 정의
func someFunction(a: Int, b: Int, c: Int) -> Int {
return a + b + c
}
// 호출
someFunction(a: 1, b: 2, c: 3)
Void 타입
Output 값(리턴값, 반환값)이 없는 함수에 표시한다.
아래의 세 함수는 모두 같은 의미이다.
func someFunction1() {
print("홍길동")
}
func someFunction2() -> Void {
print("홍길동")
}
func someFunction3() -> () {
print("홍길동")
}
Output 값이 없다는 타입인 Void 키워드나 같은 의미인 ()을 명시한다.
함수의 여러 형태
Swift에서는 가끔 이상하고 복잡한 형태의 함수를 볼 수 있다.
하지만 그 함수들은 오히려 개발자들의 편의를 위해 정의된 모습이다.
아래 정리 내용을 살펴보면 이제 모든 함수를 이해할 수 있을 것이다.
1. 아규먼트 레이블 (Argument Label)
// 정의
func someFunction(writeFirstName name: String, writeCountry address: String) {
print("\(name)님, \(address)에 살고 계시군요?"
}
// 호출
someFunction(writeFirstName: "홍길동", writeCountry: "조선")
파라미터 앞에 키워드가 있는데, 이를 아규먼트 레이블이라고 한다.
보통 길게 입력하여 요구하는 파라미터에 대하여 더욱 명확하게 설명할 수 있다.
주의할 점은, 함수를 정의할 때의 실행문 내에서는 파라미터를 사용하여 작성한다.
그리고 함수 호출 시 아큐먼트와 함께 아규먼트 레이블를 명시한다.
2. 와일드카드 패턴
// 정의
func someFunction(_ name: String, _ address: String) {
print("\(name)님, \(address)에 살고 계시군요?"
}
// 호출
someFunction("홍길동", "조선")
와일드카드 패턴은 _(언더바)를 아규먼트 레이블의 위치에 작성한다.
가장 큰 특징은 호출 시 아규먼트 앞에 그 어떤 키워드도 넣지 않는다는 것이다.
3. 파라미터 기본값
// 정의
func someFunction(name: String, address: String = "한국") {
print("\(name)님, \(address)에 살고 계시는군요?")
}
// 호출
someFunction(name: "홍길동") // "홍길동님, 한국에 살고 계시는군요?"
someFunction(name: "홍길동", address: "미국") // "홍길동님, 미국에 살고 계시는군요?"
함수 정의 시, 파라미터에 값을 미리 할당하여 기본값을 설정할 수 있다.
함수 호출 시, 아규먼트를 넣지 않았을 때 해당 파라미터에는 자동으로 기본값이 할당된다.
4. 가변 파라미터
// 정의
func someFunction(_ numbers: Double...) -> Double {
var total = 0.0
for i in numbers {
total += i
}
return total
}
// 호출
someFunction(1.5, 2, 3.4, 1)
가변 파라미터란 갯수가 정해지지 않는 배열 형식의 값이다.
함수 정의 시, 타입 표현은 ‘Input 타입…’으로 표시한다.
각 함수 당 가변 파라미터 하나만 사용이 가능하다.
가변 파라미터는 기본값을 갖지 못한다.
배열 형식의 아규먼트이다보니 실행문에서 보통 반복문을 자주 활용한다.
함수의 지칭과 할당
함수를 호출시키지 않고 표기만 할 수도 있다.
말이 어려운데 코드를 보면 쉽게 이해할 수 있다.
func someFunction() {
print("홍길동")
}
// 함수 표기
someFunction
// 함수를 변수에 할당
var a = someFunction
// 할당된 변수 활용
a() // "홍길동"
위와 같이 새로운 변수에 함수를 할당할 수 있다.
그러나 파라미터가 있는 함수는 할당의 형식이 약간 달라진다.
func someFunction(firstName name: String, _ address: String, age: Int) {
print(name, address, age)
}
// 할당
var a = someFunction(firstName:_:age:)
// 변수 활용
a("홍길동", "한국", 20)
할당을 할 때에는 함수명 뒤의 파라미터가 들어가는 가로 안에서의 형식이 다르다.
파라미터와 콜롬을 입력한 뒤, 바로 다음 파라미터와 콜롬을 입력하는 방식이다.
이 때 아규먼트 레이블이나 와일드카드 인자가 있을 경우, 그것들을 작성한다.
할당된 변수를 활용할 때에는 아규먼트 값만 넣어주면 된다.
함수도 타입추론이 되기 때문에 할당할 때 타입을 명시하지 않아도 된다.
참고로 함수의 타입은 다음과 같이 작성한다.
// (String, String, Int)이 Input 값, Output 값은 없음
var a: (String, String, Int) -> () = someFunction(firstName:_:age:)
// (Int)이 Input 값, Output 값은 없음
var b: (Int) -> Void = someFunction(firstName:_:age:)
// 타입 주석 시, Input 부분은 가로작성이 필수이고, Output은 하지 않아도 된다.
함수 사용 시 주의점
- 함수의 파라미터는 상수(let)이다. 따라서 실행문에서 수정이 불가능하다.
- 함수 내에서 선언한 변수(let, var)는 해당 함수의 실행문(Scope)에서만 사용가능하다.
- Output 타입이 없어도 return 키워드를 사용하는 경우가 있다.
func someFunction(number: Int) {
if number > 100 {
return
} else {
print("100 미만")
}
}
위 함수의 아규먼트로 101을 넣어주면 함수가 종료되며 아무 일도 벌어지지 않는다.
이처럼 return 키워드는 함수를 종료시키는 성질이 있다.
따라서 단순히 특정 상황에서 함수를 종료시키고 싶은 때, return 키워드를 사용할 수 있다.
단, 오로지 ‘return’만 작성해야한다.
'Swift 문법' 카테고리의 다른 글
[Swift] 클래스와 구조체 (0) | 2022.07.17 |
---|---|
[Swift] Enum(열거형) (0) | 2022.07.16 |
[Swift] 튜플 (0) | 2022.07.14 |
[Swift] Switch문 (0) | 2022.07.13 |
[Swift] 연산자 팁 (0) | 2022.07.12 |