공부/SWIFT

[SWIFT] 함수(기본, 다양한 함수선언)

알로하리미 2021. 3. 10. 13:14
728x90

1.개요

메서드 : 구조체, 클래스, 열거형 등 특정 타입에 연관되어 사용하는 함수 

함수 : 모듈 전체에서 전역적으로 사용할 수 있는 함수

스위프트는 재정의(오버라이드)와 중복정의(오버라이딩)를 모두 지원

함수는 일급객체이므로 하나의 데이터 타입으로 사용 될수 있다.

* 함수의 축약표현 helloWorld( name: String, times: Int ) -> String 이라는 함수가 있으면
helloWorld(name:times:) 라고 표현을 한다.

 

 

2. 함수 정의

함수를 선언할 때는 가장 앞에 func 키워드를 붙이고 (person: String) 파라미터와 형 그리고 -> String 형태로 반환형을 정의합니다.

func 함수이름(매개변수...) -> 반환타입 {
    실행구문
    return 반환 값
}

func greet(person: String) -> String {
 let greeting = "Hello, " + person + "!"
 return greeting
}

 

 

함수 내부의 코드가 단 한줄의 표현이고 그표현의 결과값의 타입이 함수의 반환타입과 일치한다면 return키워드를 생략가능하다

func greet(person: String) -> String {
  "Hello, " + person + "!"
}

 

 

매개변수 없는 함수

func sayHelloWorld() -> String {
    return "hello, world"
}
print(sayHelloWorld())

 

 

복수의 매개변수를 사용하는 함수

func greet(person: String, alreadyGreeted: Bool) -> String {
    if alreadyGreeted {
        return greetAgain(person: person)
    } else {
        return greet(person: person)
    }
}
print(greet(person: "Tim", alreadyGreeted: true))
// Prints "Hello again, Tim!"

 

 

반환값이 없는 함수 (눈에 보이진 않지만 Void를 반환 , Void는 ()사용한 빈 튜플이라 보면됨)

func greet(person: String) {
    print("Hello, \(person)!")
}
greet(person: "Dave")
// Prints "Hello, Dave!"

 

 

복수의 값을 반환하는 함수

//튜플을 함수의 반환 값으로 사용할 수 있습니다.
func minMax(array: [Int]) -> (min: Int, max: Int) {
    var currentMin = array[0]
    var currentMax = array[0]
    for value in array[1..<array.count] {
        if value < currentMin {
            currentMin = value
        } else if value > currentMax {
            currentMax = value
        }
    }
    return (currentMin, currentMax)
}

//반환 값의 인자를 반환 값을 접근하는 접근자로 사용할 수 있습니다.
let bounds = minMax(array: [8, -6, 2, 109, 3, 71])
print("min is \(bounds.min) and max is \(bounds.max)")
// Prints "min is -6 and max is 109"

 

 

옵셔널 튜플 반환형

위의 반환 값과 달리 반환 값에 ? 물음표가 붙었습니다. (min: Int, max: Int)?

func minMax(array: [Int]) -> (min: Int, max: Int)? {
    if array.isEmpty { return nil }
    var currentMin = array[0]
    var currentMax = array[0]
    for value in array[1..<array.count] {
        if value < currentMin {
            currentMin = value
        } else if value > currentMax {
            currentMax = value
        }
    }
    return (currentMin, currentMax)
}

// 실제 반환 값에 접근하기 위해서는 
// if let과 같은 옵셔널 체인을 사용하거나 강제 unwrapping을 해야 합니다. 
// 아래는 옵셔널 체인을 사용한 예)입니다.

if let bounds = minMax(array: [8, -6, 2, 109, 3, 71]) {
    print("min is \(bounds.min) and max is \(bounds.max)")
}
// Prints "min is -6 and max is 109"

 

 

매개변수 이름과 전달인자 레이블

// 파라미터 앞에 인자 라벨을 지정해 실제 함수 내부에서 해당 인자를 
// 식별하기 위한 이름과 함수 호출시 사용하는 이름을 다르게 해서 사용할 수 있습니다.
func 함수이름(전달인자레이블 매개변수이름: 매개변수타입) -> 반환타입
{ 
    // 이 안에서는 매개변수이름을 사용
    실행구문
    return 실행 값
}

// 호출시 전달인자레이블을 사용
함수이름(전달인자레이블: 전달값)

// ex1) 
func someFunction(firstParameterName: Int, secondParameterName: Int) {
    // 함수 내부에서 firstParameterName와 secondParameterName의 인자를 사용합니다.
}
someFunction(firstParameterName: 1, secondParameterName: 2)



// ex2) 매개변수 이름을 전달인자레이블로도 사용할 수 있다.
func greet(person: String, from hometown: String) -> String {
    return "Hello \(person)!  Glad you could visit from \(hometown)."
}
print(greet(person: "Bill", from: "Cupertino"))
// Prints "Hello Bill!  Glad you could visit from Cupertino."

 

 

와이드카드( _ ) 를 사용하여 호출시 인자값 생략 할 수 있다.

func someFunction(_ firstParameterName: Int, secondParameterName: Int) {
    // 함수 안에서 firstParameterName, secondParameterName
    // 인자로 입력받은 첫번째, 두번째 값을 참조합니다.
}
someFunction(1, secondParameterName: 2)

 

 

기본값이 있는 매개변수는 뒤에 위치시킨다. 중요한 매개변수는 앞쪽에 위치시킨다. 

func someFunction(parameterWithoutDefault: Int, parameterWithDefault: Int = 12) {
    // 함수 호출시 두번째 인자를 생략하면 함수안에서
    // parameterWithDefault값은 12가 기본 값으로 사용됩니다.
}

someFunction(parameterWithoutDefault: 3, parameterWithDefault: 6) 
// parameterWithDefault는 6

someFunction(parameterWithoutDefault: 4) 
// parameterWithDefault는 12

 

 

집합매개변수(가변매개변수) 사용

함수마다 가변 매개변수는 하나만 가질 수 있다.
인자 값으로 특정 형(type)의 집합 값을 사용할 수 있습니다.
func arithmeticMean(_ numbers: Double...) -> Double {
    var total: Double = 0
    for number in numbers {
        total += number
    }
    return total / Double(numbers.count)
}
arithmeticMean(1, 2, 3, 4, 5) // return 3.0
arithmeticMean(3, 8.25, 18.75) //return 10.0

 

 

인-아웃 파라미터 (입출력 매개변수) inout

값이 아닌 참조를 전달하려면 입출력 매개변수를 사용한다
( 정의시 매개변수 타입앞에 inout을 붙인다. 호출시 전달인자에는 &를 붙인다.)

입출력 매개변수는 매개변수 기본값을 가질수 없다.

가변매개변수로 사용 될 수 없다.

상수는 변경될수 없으므로 입출력 매개변수로 사용 될 수 없다.
func swapTwoInts(_ a: inout Int, _ b: inout Int) {
    let temporaryA = a
    a = b
    b = temporaryA
}

//포인터를 넣는다고 생각 
var someInt = 3
var anotherInt = 107
swapTwoInts(&someInt, &anotherInt)
print("someInt is now \(someInt), and anotherInt is now \(anotherInt)")
// Prints "someInt is now 107, and anotherInt is now 3"

 

 

스위프트 함수 더 공부해보기 아래링크를 눌러보세요

2021.03.10 - [공부/SWIFT] - [SWIFT] 함수는 일급객체이다.