[Swift] 함수

한음·2022년 3월 8일
0

스위프트는 함수형 프로그래밍 패러다임을 채택하고 있는 언어.

인자와 반환값 타입을 명시. nil 반환 가능성이 있는 경우, 반환 타입을 옵셔널 타입으로 명시.

func add_five(x: Int) -> Int {
    let result = x + 5
    return result
}

let x = 10
print(add_five(x: x)) // 15


//
func hello(name: String?){
    guard let _name = name else {
        return
    }
    print("Hello, \(_name).")
}

hello(name: "한음")
let optName: String? = "한음"
print(optName) // Optional("한음")
hello(name: optName)


//
func multiply(x: Int, y: Int) -> Int {
    return x * y
}

print(multiply(x:y:)(3,5)) // 이런식으로 호출도 가능하다.

튜플로 여러 값 반환시 함수 정의 단계에서 미리 변수명을 바인딩 할 수 있다.

func example() -> (num: Int, str: String){
    return (10, "HELLO")
}

let a = example()
print(a.num) // 10
print(a.str) // HELLO

특정 튜플이 여러 곳에서 사용될 경우, Type Alias 를 통해 새로운 축약형 타입을 정의할 수 있다.

typealias result = (Int, Character, String)

func example() -> result {
    let c: Character = "C"
    return (10, c, "It Works Like This")
}

let e = example()

print(e.0) // 10
print(e.1) // c
print(e.2) // It Works Like This

// 변수명 바인딩도 가능
typealias result = (int: Int, chr: Character, str: String)

func example() -> result {
    let c: Character = "C"
    return (10, c, "It Works Like This")
}

let e = example()

print(e.int) // 10
print(e.chr) // c
print(e.str) // It Works Like This

내부 매개변수명, 외부 매개변수명

용도에 따라 매개변수를 두 가지로 분리.

  • 외부 매개변수: 함수를 호출할 때 인자값에 대한 레이블 역할을 하며, 함수의 식별자 일부로 사용
  • 내부 매개변수: 입력된 인자값을 함수 내부에서 참조하기 위해 사용하는 변수.

별도로 외부 매개변수를 나누지 않을 경우 일반 매개변수가 인자 레이블 역할까지 겸하지만, 외부 매개변수를 명시적으로 정의하면 외부 매개변수가 인자 레이블이 됨.

func ex(out1 inner1: String, out2 inner2: Int){
    print(inner1)
    print(inner2)
}
// 이때 함수명은 ex(out1:out2:) 이다.

ex(out1: "Hello", out2: 123) // 호출.

위의 설명처럼, 외부 매개변수를 별도 설정하지 않을 시 일반 매개변수가 외부 매개변수 역할까지 하는 것.
** 외부 매개변수로 _ 를 두면, 외부 매개변수 생략이 가능해진다

func ex(_ inner1: String, _ inner2: Int){
    print(inner1)
    print(inner2)
}

ex("HELLO", 123) // ** 매개변수 레이블 없이 사용 가능
// 이때 함수명은 ex(_:_:) 가 된다.

//

func ex(_ inner1: String, outer2 inner2: Int){
    // _ 를 두는 위치는 상관 없다.
    print(inner1)
    print(inner2)
}

ex("HELLO", outer2: 123) // 두 번째 인자는 레이블을 적어야 한다.
// 이때 함수명은 ex(_:outer2:) 가 된다.

스위프트는 함수를 타입, 인자의 개수로 구별하는 것이 아닌 레이블로 구별한다.

func ex(a: String){
    print(a)
}
func ex(b: String){
    print(123)
}

ex(a: "Hello") // Hello
ex(b: "Hello") // 123

가변 인자

... 을 이용.

func average(score: Int...) -> Int {
    var total = 0
    for s in score{
        total += s
    }
    return total
}

print(average(score: 1, 23, 42)) // 66

레이블이 있으므로 파이썬과 달리 가변인자를 앞 쪽에 쓰는것이 가능.

func average(score: Int..., num: Int) -> Int {
    var total = 0
    for s in score{
        total += s
    }
    print(num)
    return total
}

print(average(score: 1, 23, 42, num: 15)) // 66

기본값을 갖는 매개변수

인자값 생략 가능.

func defaultFunc(message: String, work: Bool = true) {
    guard work else {
        return
    }
    print(message)
}

defaultFunc(message: "HELLO") // HELLO
defaultFunc(message: "HELLO", work: false) // return
defaultFunc(message:work:)("HELLO") // 함수 이름은 defaultFunc(message:work:) 이다.

매개변수의 수정

함수의 인자값이 상수로 정의됨. (let)
마음대로 변경하려 하면 오류 발생.
다른 언어들과 큰 차이 중 하나.

func ex(num: Int) -> Int {
    num += 1 // 오류
    return num
}

인자 값을 변경해서 사용하려면 또 복사하는 변수를 만들어야 함. 이때 같은 이름으로도 정의 가능한게 특이.

func ex(_ num: Int) -> Int {
    var num = num
    num += 1
    return num
}

print(ex(123)) // 124
profile
https://github.com/0hhanum

0개의 댓글