함수의 응용
1) 아규먼트 레이블
// 아큐먼트 레이블을 사용하면
func printName1(first name: String) {
print("나의 이름은 \(name) 입니다.")
}
printName1(first: "뉴턴")
//아규먼트 레이블 사용 안하면
func someFunction(first: Int, second: Int) {
print(first + second)
}
someFunction(first: 1, second: 2)
//아규먼트 레이블 사용하는 것의 이점 (일반적으로 함수를 사용할때 더 명확하게 무엇을 요구하는 지 알려줄 수 있다.)
func someFunction1(writeYourFirstNumber a:Int, writeYourSecondNumber b: Int) {
print(a + b)
}
someFunction1(writeYourFirstNumber: 3, writeYourSecondNumber: 4)
안에서는 간단하게 겉으로는 명확하게 알 수 있음
아규먼트 레이블은 파라미터 앞에 한칸 띄고 쓰면 된다.
2) 아규먼트 레이블을 생략해서 사용하는 것도 가능 (와일드카드 패턴)
func addPrintFunction(_ firstNum: Int, _ secondNum: Int) {
print(firstNum + secondNum)
}
addPrintFunction(1, 2)
너무나도 명확한 경우에 생략해서 사용
3) 가변파라미터 - 함수의 파라미터에 정해지지 않은, 여러개의 값을 넣는 것도 가능(Variadic Parameters)
/**=============================================================
- 1) 하나의 파라미터로 2개이상의 아규먼트를 전달할 수 있다.
- 2) 아규먼트는 배열형태로 전달된다.
- 3) 가변 파라미터는 개별함수마다 하나씩만 선언할 수있다.(선언 순서는 상관없음)
- 4) 가변 파라미터는 기본값을 가질 수 없다.
===============================================================**/
func arithmeticAverage(_ numbers: Double...) -> Double {
var total = 0.0
for n in numbers {
total += n
}
return total / Double(numbers.count)
}
//arithmeticAverage(5, 6, 7, 8, 9)
arithmeticAverage(1.5, 2.5, 3.5, 4.5)
정해지지 않은 여러개의 파라미터를 받을 때
4) 함수의 파라미터에 기본값(디폴트) 정하는 것도 가능
func numFunction(num1: Int, num2: Int = 5) -> Int {
var result = num1 + num2
return result
}
numFunction(num1: 3)
numFunction(num1: 3, num2: 7)
숫자를 주지 않으면 기본값으로 사용
아규먼트값이 항상 필요한 것이 아닐 수도 있다.
실제 애플이 미리 만들어 놓은 함수에는 기본값이 들어 있는 경우가 꽤 있다.
print(items: Any..., separator: String, terminator: String)
생략해서 print()로 많이 사용
함수 사용시 주의점
return 키워드의 정확한 이해
return 키워드의 역할
1) 리턴타입이 있는 함수의 경우(아웃풋이 있는 경우):
리턴 키워드 다음의 표현식을 평가한 다음에 그 결과를 리턴하면서 함수를 벗어남
2) 리턴타입이 없는 함수의 경우(아웃풋이 없는 경우):
함수의 실행을 중지하고 함수를 벗어남 ⭐️
// 리턴 타입이 있는 경우
func addFunction(num1: Int, num2: Int) -> Int {
var result = num1 + num2
return result
}
addFunction(num1: 3, num2: 4) // 7
// 리턴 타입이 있는 경우
func valuationFunction(num: Int) -> Int {
if num >= 5 {
return num
}
return 0
}
valuationFunction(num: 3) // 0
valuationFunction(num: 5) // 5
// 리턴 타입이 없는 경우
func numberPrint(n num: Int) {
if num >= 5 {
print("숫자가 5이상입니다.")
return
}
print("숫자가 5미만입니다.")
}
numberPrint(n: 7) // 숫자가 5이상입니다.
numberPrint(n: 4) // 숫자가 5미만입니다.
// 만약 return이 없다면 조건에 부합하더라도 두 print 문 전부 출력.
// numberPrint(n: 7) // 숫자가 5 이상입니다.
// 숫자가 5 미만입니다.
리턴 타입이 없는 경우
return을 적어주지 않으면 if문에 부합하는 조건 이어도 밑에 있는 print("숫자가 5미만입니다.") 여기까지 진행이 됨.
함수의 중첩 사용 - 중첩된 함수(Nested Functions)
함수 안에 함수를 작성할 수도 있다.
(함수 안에 있는 함수는 밖에서 사용이 불가능)
함수를 제한적으로 사용하고 싶을 때, 사용
func chooseStepFunction(backward: Bool, value: Int) -> Int {
func stepForward(input: Int) -> Int {
return input + 1
}
func stepBackward(input: Int) -> Int {
return input - 1
}
if backward {
return stepBackward(input: value)
} else {
return stepForward(input: value)
}
}
// ChooseStepFunction(backward: true, value:3) // 2
var value = 7
//case1
chooseStepFunction(backward: true, value: value) // 6
//case2
chooseStepFunction(backward: false, value: value) // 8
주의점 정리
구분 | 주의할 점 |
1) 파라미터의 이해 | 파라미터는 변수가 아닌 상수(let)이고, 함수 내부적으로만 쓰이므로 값의 변경이 불가능 (변경을 하려면 새로운 변수를 선언해야 함) |
2) Scope(범위) | 함수 내에서 선언한 변수는 함수 내에서 밖에 사용하지 못함 (외부 변수는 함수 내에서 접근 가능) |
3) return 키워드 | 1) 리턴타입이 있는 함수: 리턴 키워드 다음의 표현식을 평가한 다음, 그 결과를 리턴하면서(함수 실행을 중지하고) 함수를 벗어남 2) 리턴타입이 없는 함수: 함수의 실행을 중지하고 함수를 벗어남 |
4) 함수의 실행문 (return 타입을 가지고 있는) |
리턴 타입이 있는 함수를 호출하는 경우, 함수를 호출하는 것은 자체로 표현식(결과는 함수가 리턴하는 값)이라는 것을 인지하고 사용할 필요가 있음 예시) nameString() == "스티브" |
5) 함수의 중첩 사용 | 함수 내부에서 함수를 작성하여 사용하는 것도 가능 (다만, 외부에서 내부 함수는 접근불가능) |
'iOS 관련 공부' 카테고리의 다른 글
옵셔널(Optional) (0) | 2025.01.03 |
---|---|
inout 파라미터, guard문, @discardableResult (0) | 2024.12.31 |
함수의 형태 (0) | 2024.12.24 |
제어전송문 (1) | 2024.12.18 |
튜플 (0) | 2024.12.12 |