본문 바로가기
Swift

4. 함수

by 루에 2015. 9. 30.
반응형

함수


함수는 동작을 작성하는 단위로 func 키워드로 정의한다.

// 함수의 정의

func greeting() {

    print("hello")

}

// 함수 호출

greeting()



함수 반환값


함수의 동작 결과를 반환하려면 파라미터 오른쪽에 ->를 이용한다. 반환 타입이 없으면 생략 가능하다.

func areOk() -> Bool {

    return true

}


func favorite() -> String {

    return "coffee"

}



다수의 반환값


함수의 결과로 다수의 결과를 반환하려면 튜플을 사용한다.

// 난수 3개를 튜플로 반환

func random3() -> (Int, Int, Int) {

    let r1 = Int(arc4random() % 10)

    let r2 = Int(arc4random() % 10)

    let r3 = Int(arc4random() % 10)

    

    return (r1, r2, r3)

}


// 함수 실행 결과 사용

var (n1, n2, n3) = random3()

print("random : \(n1), \(n2), \(n3)")


var nums = random3()

print("random : \(nums.0), \(nums.1), \(nums.2)")



파라미터


함수가 동작하면서 필요한 정보를 전달하기 위해 파라미터를 이용한다. 파라미터는 함수의 이름 뒤에 괄호를 이용해서 선언한다. 괄호 내부에는 파라미터 이름 뒤에 콜론을 이용해서 파라미터 타입을 설정한다.

func greeting(person: String) {

    print(person)

}


func greeting(person: String, emotion: String) {

    print(person + emotion)

}


// 함수 사용

greeting("hihi")

greeting("hi", "hello")



파라미터 이름


함수에서 정의한 파라미터를 사용하려면 파라미터 이름을 이용한다. Swift에서 파라미터 이름은 내부 파라미터 이름(local parameter name)과 외부 파라미터 이름(external parameter name)이 있다.

func greeting("외부파라미터 이름" "내부파라미터이름": "파라미터 타입") {}


// 외부 파라미터 이름을 사용한 함수

func greeting(whom person: String) {

    print(person)

}


// 함수 사용

greeting(whom: "nada")


외부 파라미터 이름은 파라미터마다 작성 가능하다.

// 함수는 서로 다른 함수로 사용할 있다.

func greeting(whom person: String, emotion: String) {}

func greeting(whom person: String, with emotion: String){}


greeting(whom: "nada", "happy")

greeting(whom: "nada", with: "happy")


외부 파라미터 이름과 내부 파라미터 이름을 같게 작성하려면 #을 사용

// 내부, 외부 파라미터 이름을 동일하게 사용한다.

func greeting(# person: String, # emotion1: String) {}

greeting(person: "nada", emotion1: "happy")



파라미터 기본값


파라미터에는 함수를 호출하면서 값을 입력하지 않아도 자동으로 값이 입력되도록 할 수 있다.

// emotion 기본값 설정

func greeting(whom person: String, emotion: String = "happy") {

    print(person + emotion)

}


// 기본값이 설정된 파라미터를 선언할 경우 선언한 값을 사용하고, 생략할 경우 기본값 사용

greeting(whom: "nada", emotion: "unHappy")

greeting(whom: "nada")


언더스코어(_)를 이용해서 외부 파라미터 이름 사용을 생략할 수 있는데, 이 때 파라미터를 구분하는데 혼동되지 않도록 파라미터 중에서 마지막이 되도록 작성한다.

// 번째 파라미터의 외부 파라미터 이름 생략

func greeting(who person: String, _ emotion: String) {}


greeting(who: "nada", "외부파라미터 생략")



가변 인자(Variadic Parameters)


가변인자는 하나의 파라미터로 다수의 값을 다루는 것을 의미한다. 파라미터의 타입 선언에 점 3개를 이용해 선언하고 함수의 파라미터 마지막에 위치하도록 한다.

func addAll(values: Int...) -> Int {

    return 0

}


// 가변적인 설정

addAll(1)

addAll(1,2,3,4,5)



파라미터 변수와 상수


함수에 선언한 파라미터는 함수 내부에서 let으로 선언된 상수로 동작한다. 그래서 함수 내부에서 파라미터에 새로운 값을 설정하려고 하면 에러가 발생한다.


함수 내부에서 파라미터를 변수로 사용하려면 var 키워드를 이용해서 파라미터를 선언한다. 파라미터의 타입이 숫자나 문자열과 같은 원시 타입인 경우, 함수를 호출하면서 값 복사가 되기 때문에 함수 내부의 파라미터를 변경하는 코드가 영향을 미치지 않는다.

// var 이용해 함수의 파라미터 설정

func countTo(var value: Int) -> Int {

    var result = 0

    while value > 0 {

        result += value

        value--     // 파라미터 변경

    }

    return result

}


countTo(10)



inout 파라미터


함수의 파라미터는 함수를 호출하면서 함수 내부의 코드로 정보를 전달하는 목적이므로 상수로 동작한다. 그리고 파라미터의 타입이 레퍼런스 타입이 아니면 파라미터의 값이 복사된다. 그래서 함수 파라미터를 변수로 선언하고 새로운 값을 대입해서 함수 외부로 값이 반영되지 않는다.


함수의 파라미터를 변수로 사용하고 또 함수 내에 작성한 변경이 함수 외부에 반영되도록 하려면 inout 키워드를 이용해서 파라미터를 선언한다.

func swap(inout i1: Int, inout i2: Int) {

    var temp = i1

    i1 = i2

    i2 = temp

}


var v1 = 1

var v2 = 2


// 파라미터 값이 복사되지 않도록 & 붙인다.

swap(&v1, &v2)


v1  // 2

v2  // 1



옵셔널 반환 타입과 파라미터


함수의 반환 타입이나 파라미터에 옵셔널 타입을 사용할 수 있다.

func convertInt(str: String) -> Int? {

    if let num = str.toInt() {

        return num

    }

    else {

        return nil

    }

}


// 옵셔널로 받은 반환값을 강제 언래핑

let num4 = convertInt("123")!


if let num = convertInt("seinf") {

    print(1)

}

else {

    print(0)    // nil이므로 0 출력

}



반응형

댓글