๐Ÿฆ… Swift

Functions

Kiwi๐Ÿ’ป 2022. 6. 1. 20:20

ํ•จ์ˆ˜๋Š” ํŠน์ • ๊ธฐ๋Šฅ์„ ์‹คํ–‰ํ•˜๊ธฐ ์œ„ํ•œ ์ฝ”๋“œ์˜ ๋ฌถ์Œ์ด๋‹ค. ๋™์ž‘์— ๋”ฐ๋ผ ํ•จ์ˆ˜์— ํŠน์ • ์ด๋ฆ„์„ ์„ค์ • ํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๊ธฐ ์œ„ํ•ด ํ˜ธ์ถœํ•  ์ˆ˜ ์žˆ๋‹ค.

ํ•จ์ˆ˜ ์ •์˜์™€ ํ˜ธ์ถœ (Defining and Calling Functions)

ํ•จ์ˆ˜๋ฅผ ์ •์˜ํ• ๋•Œ ์„ ํƒ์ ์œผ๋กœ ํŒŒ๋ผ๋ฏธํ„ฐ์˜ ์ด๋ฆ„์„ ์ •ํ•ด์ฃผ์–ด์•ผํ•œ๋‹ค. ๋˜ํ•œ ๋ฆฌํ„ด ๊ฐ’๋„ ์ •์˜ํ•  ์ˆ˜ ์žˆ๋‹ค. ๋ชจ๋“  ํ•จ์ˆ˜๋Š” ํ•จ์ˆ˜์˜ ๊ธฐ๋Šฅ์„ ๋‚˜ํƒ€๋‚ด๋Š” ๊ณ ์œ ์˜ ์ด๋ฆ„์„ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค. ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ํ˜ธ์ถœ์„ ํ•ด์•ผํ•˜๋ฉฐ ์•„๊ทœ๋จผํŠธ์— ๊ฐ’์„ ๋„ฃ์–ด ์ฃผ์–ด์•ผ ํ•œ๋‹ค. ์•„๊ทœ๋จผํŠธ๋Š” ํŒŒ๋ผ๋ฏธํ„ฐ์˜ ์ˆœ์„œ์™€ ํ•ญ์ƒ ๊ฐ™์•„์•ผ ํ•œ๋‹ค.

ํ•จ์ˆ˜ ํŒŒ๋ผ๋ฏธํ„ฐ์™€ ๋ฐ˜ํ™˜๊ฐ’ (Function Parameters and Return Values)

Swift๋Š” ๋งค์šฐ ์œ ์—ฐํ•œ ํŒŒ๋ผ๋ฏธํ„ฐ์™€ ๋ฐ˜ํ™˜๊ฐ’์„ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค.

ํŒŒ๋ผ๋ฏธํ„ฐ๊ฐ€ ์—†๋Š” ํ•จ์ˆ˜ (Functions Without Parameters)

ํ•จ์ˆ˜๋Š” ํ•ญ์ƒ ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ์ •์˜ํ•˜์ง€ ์•Š์•„๋„ ๋œ๋‹ค. ์˜ˆ์ œ ์ฝ”๋“œ๋ฅผ ๋ณด๋ฉด ์ž…๋ ฅ ์ฝ”๋“œ๊ฐ€ ์—†๊ธฐ ๋•Œ๋ฌธ์— ํ•ญ์ƒ ๊ฐ™์€ String์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

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

์—ฌ๋Ÿฌ๊ฐœ ํŒŒ๋ผ๋ฏธํ„ฐ๊ฐ€ ์žˆ๋Š” ํ•จ์ˆ˜ (Functions With Multiple Parameters)

ํ•จ์ˆ˜๋Š” ํ•จ์ˆ˜์˜ ์†Œ๊ด„ํ˜ธ ๋‚ด์— ์ฝค๋งˆ๋กœ ๊ตฌ๋ถ„ํ•˜์—ฌ ์—ฌ๋Ÿฌ๊ฐœ์˜ ์ž…๋ ฅ ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ๊ฐ€์งˆ ์ˆ˜ ์žˆ๋‹ค.

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!"

๋ฐ˜ํ™˜๊ฐ’ ์—†๋Š” ํ•จ์ˆ˜ (Functions Without Return Values)

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

NOTEโ—๏ธ
์—„๋ฐ€ํžˆ ๋งํ•˜๋ฉด greet(person:) ํ•จ์ˆ˜๋Š” ๋ฐ˜ํ™˜๊ฐ’์„ ์ •์˜ํ•˜์ง€ ์•Š์•˜์ง€๋งŒ ์—ฌ์ „ํžˆ ๋ฐ˜ํ™˜๊ฐ’์ด ์žˆ๋‹ค. ๋ฐ˜ํ™˜ ํƒ€์ž…์ด ์ •์˜๋˜์ง€ ์•Š์€ ํ•จ์ˆ˜๋Š” Void ํƒ€์ž…์˜ ํŠน๋ณ„ํ•œ ๊ฐ’(๋นˆํŠœํ”Œ())์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

์—ฌ๋Ÿฌ๊ฐœ์˜ ๋ฐ˜ํ™˜๊ฐ’์ด ์žˆ๋Š” ํ•จ์ˆ˜ (Functions with Multiple Return Values)

์—ฌ๋Ÿฌ๊ฐœ์˜ ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•˜๊ธฐ ์œ„ํ•ด ํ•จ์ˆ˜์˜ ๋ฐ˜ํ™˜ ํƒ€์ž…์œผ๋กœ ํŠœํ”Œ ํƒ€์ž…์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

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)
}

ํ•จ์ˆ˜ ์ธ์ž ๋ผ๋ฒจ๊ณผ ํŒŒ๋ผ๋ฏธํ„ฐ ์ด๋ฆ„ (Function Argument Labels and Parameter Names)

ํ•จ์ˆ˜์˜ ํŒŒ๋ผ๋ฏธํ„ฐ์— ๊ณ ์œ ์˜ ์ด๋ฆ„์„ ๋ถ€์—ฌํ•  ์ˆ˜ ์žˆ๋‹ค.

์•„๊ทœ๋จผํŠธ ๋ผ๋ฒจ ์ง€์ • (Specifying Argument Labels)

๊ณต๋ฐฑ์œผ๋กœ ๊ตฌ๋ถ„ํ•˜์—ฌ ํŒŒ๋ผ๋ฏธํ„ฐ ์ด๋ฆ„ ์•ž์— ์•„๊ทœ๋จผํŠธ ๋ผ๋ฒจ์„ ์ž‘์„ฑํ•œ๋‹ค.

func someFunction(argumentLabel parameterName: Int) {
    // In the function body, parameterName refers to the argument value
    // for that parameter.
}

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."

ํŒŒ๋ผ๋ฏธํ„ฐ ๊ธฐ๋ณธ๊ฐ’ (Default Parameter Values)

ํŒŒ๋ผ๋ฏธํ„ฐ์˜ ํƒ€์ž… ๋’ค์— ํŒŒ๋ผ๋ฏธํ„ฐ ๊ฐ’์„ ํ• ๋‹นํ•˜์—ฌ ํ•จ์ˆ˜์˜ ํŒŒ๋ผ๋ฏธํ„ฐ์— ๊ธฐ๋ณธ๊ฐ’ (default value) ์„ ์ •์˜ํ•  ์ˆ˜ ์žˆ๋‹ค.

func someFunction(parameterWithoutDefault: Int, parameterWithDefault: Int = 12) {
    // If you omit the second argument when calling this function, then
    // the value of parameterWithDefault is 12 inside the function body.
}
someFunction(parameterWithoutDefault: 3, parameterWithDefault: 6) // parameterWithDefault is 6
someFunction(parameterWithoutDefault: 4) // parameterWithDefault is 12

๊ธฐ๋ณธ๊ฐ’์„ ๊ฐ€์ง€๊ณ  ์žˆ์ง€ ์•Š์€ ํŒŒ๋ผ๋ฏธํ„ฐ๊ฐ€ ๋”์šฑ ์ค‘์š”ํ•œ ์˜๋ฏธ๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ํŒŒ๋ผ๋ฏธํ„ฐ ๋ชฉ๋ก์˜ ์•ž์— ์œ„์น˜ํ•ด์•ผ ํ•œ๋‹ค

In-Out ํŒŒ๋ผ๋ฏธํ„ฐ (In-Out Parameters)

ํ•จ์ˆ˜์˜ ํŒŒ๋ผ๋ฏธํ„ฐ๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ ์ƒ์ˆ˜์ด๋‹ค. ๊ทธ๋ ‡๊ธฐ ๋•Œ๋ฌธ์— ํ•ด๋‹น ํ•จ์ˆ˜์˜ ๋ฐ”๋”” ๋‚ด์—์„œ ํ•จ์ˆ˜์˜ ํŒŒ๋ผ๋ฏธํ„ฐ ๊ฐ’ ๋ณ€๊ฒฝ์„ ์‹œ๋„ํ•˜๋ฉด ์ปดํŒŒ์ผ ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค. ์ด๋•Œ ํŒŒ๋ผ๋ฏธํ„ฐ์˜ ๊ฐ’์„ ๋ณ€๊ฒฝํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” in-out ํ‚ค์›Œ๋“œ๊ฐ€ ํ•„์š”ํ•˜๋‹ค. ํ•จ์ˆ˜์˜ ์ˆ˜์ •๊ฐ€๋Šฅํ•จ์„ ์•Œ๋ฆฌ๊ธฐ ์œ„ํ•ด in-out ํŒŒ๋ผ๋ฏธํ„ฐ ์•„๊ทœ๋จผํŠธ์— &๋ฅผ ๋ถ™์—ฌ์ค€๋‹ค.

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"

'๐Ÿฆ… Swift' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

Enumerations  (0) 2022.06.15
Closures  (0) 2022.06.15
Control Flow  (0) 2022.06.01
Collection Types  (0) 2022.05.22
Strings and Characters  (0) 2022.05.22