📌 함수의 기본 개념
함수(Function)은 어떤 기능을 하는 코드 모음이라고 보면 된다.
함수는 항상 2단계로 실행된다.
// 1) 함수 정의문
func sayhello() {
print("Hello, world!")
print("Hello, Swift!")
print("Hello, what's up, bro!")
}
// 2) 함수 실행문(call)
sayhello()
1. 기능을 정의한다.
2. 호출한다. (뒤에 소괄호를 붙여서 함수를 실행한다.)
함수를 사용하는 이유❓
- 반복되는 동작을 단순화해서 재사용 가능하다.
- 코드를 논리적 단위로 구분이 가능하다.
- 코드 길이가 긴 것을 단순화해서 사용 가능하다.
📌 함수의 종류
함수는 크게 4가지 종류로 나눌 수 있다.
1. 인풋(입력)만 있는 경우
2. 아웃풋(출력)만 있는 경우
3. 인풋(입력)과 아웃풋(출력)이 있는 경우
4. 인풋(입력)과 아웃풋(출력)이 없는 경우 == Void타입
1. 인풋(입력)만 있는 경우
// 함수 정의문
func saySomething(name: String) {
print("안녕하세요 \(name) 님")
}
// 함수 실행문(call)
saySomething(name: "스티브")
함수에서 return이 없다는 것의 의미는
함수의 실행을 중지하고 함수를 벗어난다는 뜻이다.
2. 아웃풋(출력)만 있는 경우
아웃풋 앞에 return이라는 키워드를 사용한다.
func sayHelloString() -> String {
return "안녕하세요"
}
sayHelloString() // 안녕하세요
print(sayHelloString() + " 잡스 님")
// 함수를 호출하는 것도 표현식이 될 수 있다.(리턴형이 있는 경우)
// (표현식의 결과는 함수가 리턴하는 값)
var name1 = sayHelloString()
3. 인풋(입력)과 아웃풋(출력)이 있는 경우
// 함수 정의문
func plusFuntion(a: Int, b: Int) -> Int {
let c = a + b
return c // 아웃풋이 있는 경우, 리턴키워드를 사용해야함
}
// 함수 실행문(call)
plusFuntion(a: 3, b: 4)
print(plusFuntion(a: 5, b: 6))
4. 인풋(입력)과 아웃풋(출력)이 없는 경우 == Void타입
3개 다 같은 함수이다.
func sayhello1() {
print("Hello, Swift!")
}
func sayhello2() -> Void {
print("Hello, Swift!")
}
func sayhello3() -> () {
print("Hello, Swift!")
}
📌 return 키워드
리턴 타입이 없는 경우 ( 아웃풋이 없는 경우 )
함수를 그냥 벗어난다는 의미이다.
func numberPrint(n num: Int) {
if num >= 5 {
print("숫자가 5이상입니다.")
return // 값을 반환하지 않는 함수에서 리턴키워드를 만나면 그냥 함수를 종료시킨다.
}
print("숫자가 5미만입니다.")
}
numberPrint(n: 7) // 리턴키워드가 없다면 숫자가 5미만입니다까지 출력이 되게 된다.
numberPrint(n: 4)
numberPrint(n: 5)
숫자가 5이상입니다.
숫자가 5미만입니다.
숫자가 5이상입니다.
만약 return을 사용하지 않으면 모든 값이 출력된다.
그렇기 때문에 조건에 맞는 실행문만 실행되기를 원하면 return 키워드를 넣어야 한다.
리턴 타입이 있는 경우
return 키워드 다음의 표현식을 평가하고 그 결과를 리턴하면서 함수를 벗어난다.
표현식의 결과가 함수가 리턴하는 값의 타입과 일치해야 한다.
func nameString() -> String {
return "스티브"
}
var yourName: String = nameString()
// nameString함수의 리턴값은 스티브이기 때문에 var yourName: String = "스티브" 라고 쓰여있는것과 동일하다.
if nameString() == "스티브" { // if true와 같다.
print("이름이 일치합니다.")
}
//var your: () -> String = nameString
📌 파라미터, 아규먼트
파라미터 : 함수에 입력값으로 사용되는 변수 ( 내부 사용 )
아규먼트 : 함수를 호출할 때 필요한 값 ( 외부 사용 )
func printName(name: String) { // name: String (파라미터)
print("나의 이름은 \(name) 입니다.")
}
printName(name: "에디슨") // "에디슨" (아규먼트)
함수의 파라미터의 값은 let으로 취급된다.
즉, 값을 변경할 수 없다는 의미이다.
func printName(name: String) { // name: String (파라미터)
// name = "토마스"
print("나의 이름은 \(name) 입니다.")
}
printName(name: "에디슨") // "에디슨" (아규먼트)
name을 토마스로 변경하면 에러가 발생하게 된다.
아규먼트 레이블
아규먼트 레이블을 사용하는 이유는 가독성이 더 좋기 때문이다.
func someFunction1(writeYourFirstNumber a:Int, writeYourSecondNumber b: Int) {
print(a + b) // 내부에서는 간단하게 a b로 표시할 수 있어서 간단하지만 겉에서 보기에는 이름으로 기능을 알 수 있다.
}
someFunction1(writeYourFirstNumber: 3, writeYourSecondNumber: 4)
함수 내부에서는 a, b로 표현하면 되고
입력을 받을 때는 무슨 값인지를 표시하기 좋게 풀네임으로 표시할 수 있다.
즉, 같은 값의 이름을 따로따로 표시할 수 있다는 장점이 있다.
func addPrintFunction(_ firstNum: Int, _ secondNum: Int) {
print(firstNum + secondNum)
}
addPrintFunction(1, 2)
와일드카드 패턴을 사용해서 긴 아규먼트 레이블을 생략할 수 있다.
가변 파라미터 (Variadic Parameters)
- 하나의 파라미터로 2개 이상의 아규먼트를 전달할 수 있는 파라미터이다.
- 아규먼트를 배열 형태로 전달하고 함수마다 하나씩만 선언할 수 있다.
- 기본값을 가질 수 없다.
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)
📌 함수에 기본값
함수 파라미터에 기본값을 넣을 수 있다.
하지만 기본값만 있을 뿐이고 새로운 값을 넣을 수 있다.
func numFunction(num1: Int, num2: Int = 5) -> Int {
var result = num1 + num2
return result
}
numFunction(num1: 3)
numFunction(num1: 3, num2: 7)
'Swift > Swift 문법' 카테고리의 다른 글
[ Swift 문법 ] 함수 02 - 오버로딩(overloading) (0) | 2024.07.23 |
---|---|
[ Swift 문법 ] 튜플(Tuple) (0) | 2024.07.08 |
[ Swift 문법 ] Switch문 (0) | 2024.07.08 |