이번에는 Swift에서의 함수에 관해서 알아 보겠습니다.
함수를 사용하면 반복적으로 작성해야 하는 코드를 하나의 함수로 묶을 수 있어 더욱 간단하고 편하게 코드를 작성할 수 있습니다.
함수 정의하기
func hello() {
print("Hello")
}
hello() //Hello 출력
Swift에서는 'func' 구문을 이용하여 함수를 정의합니다.
여기서 중괄호 안에 함수를 호출하면 실행할 코드를 작성합니다.
여러 줄의 길고 복잡한 코드를 하나의 함수로 묶어 호출하면 더욱 효율적이고 간편하게 코드를 작성할 수 있습니다.
매개변수를 받는 함수
func greet(name: String) {
print("Hello, \(name)")
}
greet(name: "Gildong") //Hello, Gildong 출력
입력받는 값(매개변수)이 있는 함수에서는 함수명 옆 괄호 안에 매개변수 이름과 타입을 기재하여 정의합니다.
이러한 함수는 호출 시 괄호 안에 매개변수명과 매개변수에 해당하는 값을 할당해야 합니다.
결과를 반환하는 함수
//부호 없는 32비트 정수의 최대값 출력
func Uint32Max() -> UInt32{
return UInt32.max
}
print("\(Uint32Max())") //4294967295 출력
함수를 호출하면 결과를 반환하는 함수에서는 함수명 괄호 오른쪽에 '->' 와 반환결과 타입을 기재하고, 중괄호 안에 'return'을 쓰고 반환할 값을 기재하여 정의합니다.
반환할 값은 변수와 상수 모두 가능합니다.
함수 내부 코드가 1줄일 때에는 'return' 은 생략할 수 있습니다.
결과를 반환하지 않는 함수는 괄호 오른쪽에 '-> ()' 이 생략되어 있습니다.
매개변수를 받고 결과를 반환하는 함수
func addInt(a: Int, b: Int) -> Int{
return a+b
}
print(addInt(a: 3, b: 5)) //8 출력
매개변수 입력과 결과 반환을 모두 하는 함수를 정의할 때에는 함수명 옆 괄호 안에 매개변수 이름과 타입을 기재하고, 함수명 괄호 오른쪽에 '->' 와 반환결과 타입을 기재합니다.
Swift에서는 매개변수나 반환결과가 다른 같은 이름의 함수는 서로 다른 함수로 처리됩니다.
지역 매개변수명, 외부 매개변수명
func addInt(number1 a: Int, number2 b: Int) -> Int{
return a+b
}
print(addInt(number1: 3, number2: 5)) //8 출력
함수 내에서 사용되는 지역 매개변수명 앞에 함수를 호출할 때 사용되는 외부 매개변수명을 추가할 수 있습니다.
이를 통해 외부 매개변수명은 더욱 자세하게, 지역 매개변수명은 더욱 간단하게 표기가 가능합니다.
호출 시 매개변수명 생략
func addInt(_ a: Int, _ b: Int) -> Int{
return a+b
}
print(addInt(3, 5))
매개변수명 앞에 밑줄표 (_) 를 쓰면 함수를 호출할 때의 매개변수명을 생략할 수 있습니다.
기본값(디폴트 값)을 갖는 함수
func introduceComputer(name: String, chip: String = "Apple M1"){
print("""
Computer Name : \(name)
CPU / SoC : \(chip)
""")
}
introduceComputer(name: "MacBook Air")
/*
Computer Name : MacBook Air
CPU / SoC : Apple M1
*/
introduceComputer(name: "MacBook Pro 14", chip: "Apple M1 Pro")
/*
Computer Name : MacBook Pro 14
CPU / SoC : Apple M1 Pro
*/
매개변수 타입 오른쪽에 '=' 와 설정할 기본값을 적어 매개변수의 기본값을 설정할 수 있습니다.
이러한 함수를 호출할 때 기본값이 설정된 매개변수에 값을 할당하지 않으면 자동으로 기본값으로 할당됩니다.
가변 매개변수
//배열을 매개변수로 받기
func shopping(shoplist: [String]){
print("쇼핑 시작!")
for item in shoplist{
print("\(item) 구매!")
}
}
//가변 매개변수 이용
func shopping2(shoplist: String ...){
print("쇼핑 시작!")
for item in shoplist{
print("\(item) 구매")
}
}
shopping(shoplist: ["오이", "쌈채소", "파프리카", "고등어", "삼겹살"])
/*
쇼핑 시작!
오이 구매
쌈채소 구매
파프리카 구매
고등어 구매
삼겹살 구매
*/
shopping2(shoplist: "오이", "쌈채소", "파프리카", "고등어", "삼겹살")
/*
쇼핑 시작!
오이 구매
쌈채소 구매
파프리카 구매
고등어 구매
삼겹살 구매
*/
매개변수를 통해 받을 값의 개수를 알기 어려울 때에는, 배열로 받는 것 외에도 가변 매개변수를 이용할 수 있습니다.
가변 매개변수를 사용하려면 함수 선언 시 매개변수 타입 옆에 '...'을 추가해야 합니다.
가변 매개변수는 함수 내부에서는 배열로 취급됩니다.
함수에서의 옵셔널
//옵셔널 선언 후 index 값이 shoplist를 벗어나면 nil을 반환하도록 guard문 작성
func pickFromShoplist(shoplist: String ..., index: Int) -> (item: String, number: Int)? {
guard 0 <= index && index < shoplist.count else {
return nil
}
return (shoplist[index], index)
}
if let item3 = pickFromShoplist(shoplist: "오이", "쌈채소", "파프리카", "고등어", "삼겹살", index: 3){
print("구매 목록의 \(item3.number)번째는 \(item3.item)입니다. ")
}else{
print("index값이 잘못되었습니다. ")
}
// 구매 목록의 3번째는 고등어입니다.
if let wrongItem = pickFromShoplist(shoplist: "오이", "쌈채소", "파프리카", "고등어", "삼겹살", index: 10){
print("구매 목록의 \(wrongItem.number)번째는 \(wrongItem.item)입니다. ")
}else{
print("index값이 잘못되었습니다. ")
}
// index값이 잘못되었습니다.
반환결과 타입에 '?'를 추가하면 옵셔널을 반환할 수 있습니다.
옵셔널을 사용하는 함수를 호출할 때는 'if let' 구문을 사용하여 옵셔널에 값이 있는지 확인해야 합니다.
입출력 매개변수(inout)
var double: Double = 1.3579
func roundNumber(_ number: inout Double) -> Double {
number = round(number * 100) / 100
return number
}
print(double) // 1.3579
print(roundNumber(&double)) // 1.36
print(double) // 1.36
매개변수는 기본적으로 함수 내에서 상수로 취급됩니다.
함수를 선언할 때 매개변수 타입 앞에 'inout' 키워드를 입력하면 함수 실행이 끝난(값 반환) 뒤에도 매개변수의 변경 사항이 유지됩니다.
이러한 함수에서는 매개변수 앞에 &를 붙여 호출합니다.
위 코드에서는 소수점 두번째 자리까지 반올림하는 roundNumber 함수가 값을 반환한 뒤에도 변경된 값이 유지되고 있습니다.
함수를 데이터 타입으로 취급
func addition(a: Int, b: Int) -> Int{
return a+b
}
func subtraction(a: Int, b: Int) -> Int{
return a-b
}
//addition, subtraction 함수를 각각 add, subtract 상수로 저장
let add = addition
let subtract = subtraction
//덧셈, 뺄셈을 Bool로 결정하는 함수 선언, Bool에 따라 상수로 저장한 덧셈, 뺄셈을 수행하는 함수 호출
func calculate(addition addNum:Bool) -> (Int,Int) -> Int{
if addNum{
return add
}else{
return subtract
}
}
//괄호를 2개 사용 - calculate 함수, addition/subtraction 함수
let res1 = calculate(addition: true)(35,13)
let res2 = calculate(addition: false)(246,77)
print("35+13=\(res1), 246-77=\(res2)") // 35+13=48, 246-77=169
//상수로 저장된 addition/subtraction 함수를 호출 후 각각 사용
let calc1 = calculate(addition: true)
let calc2 = calculate(addition: false)
print("35+13=\(calc1(35,13)), 246-77=\(calc2(246,77))") // 35+13=48, 246-77=169
함수를 상수나 변수에 할당하여 데이터 타입처럼 취급할 수 있습니다.
Swift에서 함수의 데이터 타입은 받는 매개변수의 데이터 타입과 반환되는 결과의 데이터 타입을 조합하여 결정됩니다.
위 코드에서 addition, subtraction 함수는 '(Int,Int) -> Int' 타입을 가집니다.
'iOS 애플리케이션 개발 > Swift 학습노트' 카테고리의 다른 글
3. 옵셔널(Optional) (0) | 2024.01.23 |
---|---|
2. 제어 구문과 3항식 (0) | 2024.01.19 |
1. Swift 언어 기초 - 변수와 상수, 데이터 타입 (0) | 2024.01.19 |
프롤로그 - 블로그를 다시 시작하며 (0) | 2024.01.19 |