iOS ์•ฑ ๊ฐœ๋ฐœ ๊ณต๋ถ€/TIL

7์ฃผ์ฐจ_5์ผ์ฐจ_์•ฑ ๊ฐœ๋ฐœ ์ˆ™๋ จ_Closure(ํด๋กœ์ €)_๊ฐœ์ธ๊ณต๋ถ€_TIL

yeggrrr๐Ÿผ 2024. 4. 19. 21:12
728x90


<TIL>
์˜ค๋Š˜์€ ํด๋กœ์ €์— ๋Œ€ํ•ด์„œ ๊ณต๋ถ€ํ•ด๋ดค๋‹ค.
์ด์ „์— ๊ณต๋ถ€ํ–ˆ์—ˆ๋Š”๋ฐ, ํ™•์‹คํ•˜๊ฒŒ ์ดํ•ดํ•˜๊ณ  ๋„˜์–ด๊ฐ„๊ฒŒ ์•„๋‹ˆ๋ผ์„œ
๋ง‰์ƒ ํด๋กœ์ €์— ๋Œ€ํ•ด์„œ ๋ง๋กœ ์„ค๋ช…ํ•˜๋ ค๊ณ  ๋ณด๋‹ˆ
๊นŒ๋จน์€ ๊ฒƒ ๊ฐ™์•˜๋‹ค.

(๊ณผ๊ฑฐ ํด๋กœ์ € ์ •๋ฆฌํ–ˆ๋˜ ๋‚ด ์ž์‹ .. ๋ฐ”๋ณด์ธ๊ฐ€(?) ๋ง๋”ํžˆ ์žŠ์–ด๋ฒ„๋ฆผ)

 

3์ฃผ์ฐจ_Swift ๋ฌธ๋ฒ•์ข…ํ•ฉ๋ฐ˜ ์‹ฌํ™”_(2์ผ์ฐจ)_ํด๋กœ์ € & ๊ณ ์ฐจํ•จ์ˆ˜

์˜ค๋Š˜์€ ์‹ฌํ™” ๊ฐ•์˜๋ฅผ ๋‹ค ๋“ค์—ˆ๋Š”๋ฐ, ์—ญ์‹œ๋‚˜ ๋ฉ˜๋ถ•..๐Ÿคฏ ํ›… ์–ด๋ ค์›Œ์ง„ ๋А๋‚Œ..? ๊ทธ๋ž˜๋„ ์–ด์ œ ์ดํ•ด ์•ˆ ๋œ ํด๋กœ์ €๊ฐ€ ์˜ค๋Š˜์€ ๊ท€์— ์ข€ ๋“ค์–ด์™€์„œ ๋‹คํ–‰์ด์—ˆ๋‹ค. ์—ญ์‹œ ๋ฌด์ง€์„ฑ์œผ๋กœ ๊ณ„์† ๋ณด๋ฉด ์ข€ ๋‚˜์•„์ง€๋Š” ๊ฒƒ ๊ฐ™์€.

yegenie-coding.tistory.com

..ใ…Žใ…Žใ…Žใ…Žใ…Ž!!!!


์˜ค๋Š˜์€ ํด๋กœ์ €์— ๋Œ€ํ•ด์„œ ์ •๋ฆฌํ•˜๊ณ !!๐Ÿ˜€

์ฃผ๋ง์—๋Š”
โœ”๏ธ๊ณ ์ฐจํ•จ์ˆ˜(map, filter, reduce) _2024.04.21(์ž‘์„ฑ์™„๋ฃŒ)
โœ”๏ธEscaping Closure _2024.04.28(์ž‘์„ฑ์™„๋ฃŒ)
โœ”๏ธ ARC-2024.04.28(์ž‘์„ฑ์™„๋ฃŒ)

์œ„์— 3๊ฐ€์ง€์— ๋Œ€ํ•ด์„œ ์ถ”๊ฐ€์ ์œผ๋กœ ์ •๋ฆฌํ•ด๋ณด๋ ค๊ณ  ํ•œ๋‹ค!



Closure(ํด๋กœ์ €)

์šฐ๋ฆฌ๊ฐ€ ์ž์ฃผ ์‚ฌ์šฉํ•˜๋˜ func ํ‚ค์›Œ๋“œ๋ฅผ ํ†ตํ•ด ์ด๋ฆ„์„ ๋ถ™์˜€๋˜ ํ•จ์ˆ˜๋„
'Named Closure'๋ผ๋Š” ํด๋กœ์ €์ด๋‹ค!

๋‹ค๋งŒ, ๊ทธ๋ƒฅ ํ•จ์ˆ˜๋ผ๊ณ  ๋ถ€๋ฅด๋Š” ๊ฒƒ ๋ฟ์ด๋‹ค.

์˜ค๋Š˜ ์ •๋ฆฌํ•  ํด๋กœ์ €๋Š” ๋ฐ”๋กœ 'Unnamed Closure'์ด๋‹ค.
(๋ณดํ†ต ๊ทธ๋ƒฅ Closure(ํด๋กœ์ €)๋ผ๊ณ  ๋ถ€๋ฆ„)

 



๋จผ์ €, ํด๋กœ์ €์˜ ๊ธฐ๋ณธ ํ˜•ํƒœ๋ถ€ํ„ฐ ์•Œ์•„๋ณด์ž!!

์œ„์™€ ๊ฐ™์ด ์‚ฌ์šฉํ•œ๋‹ค!
(ํŒŒ๋ผ๋ฏธํ„ฐ๋Š” ์•„๋ž˜ ์˜ˆ์‹œ์ฒ˜๋Ÿผ ์—ฌ๋Ÿฌ ๊ฐœ ๋„ฃ์„ ์ˆ˜ ์žˆ์Œ)

let add: (Int, Int) -> Int

add = { (num1: Int, num2: Int) -> Int in
	return num1 + num2
}


ํด๋กœ์ €๋ฅผ ์™œ ์‚ฌ์šฉํ•ด์•ผํ• ๊นŒ?


์•„๋งˆ ์ฝ”๋“œ๋ฅผ ์น˜๋ฉด์„œ func ํ•จ์ˆ˜๋ฅผ ๊ต‰์žฅํžˆ ๋งŽ์ด ๋งŒ๋“ค์–ด ๋ณด์•˜์„ ๊ฒƒ์ด๋‹ค.
ํ•จ์ˆ˜๋ฅผ ๋งŒ๋“ค๋ฉด์„œ ๊ณ ๋ฏผ์„ ๋งŽ์ดํ–ˆ๋˜๊ฒŒ ๋ฐ”๋กœ 'ํ•จ์ˆ˜ ์ด๋ฆ„ ์ง“๊ธฐ'์˜€๋‹ค.๐Ÿ˜ 


์ด๋Ÿฐ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•ด์ฃผ๋Š” ๊ฒƒ์ด ๋ฐ”๋กœ ํด๋กœ์ €์ด๋‹ค!


ํด๋กœ์ €๋Š” '์ž ๊น ์“ฐ๊ณ  ๋ฒ„๋ฆด ํ•จ์ˆ˜'๋ผ๊ณ  ์ƒ๊ฐํ•˜๋ฉด ๋œ๋‹ค.
์œ„์—์„œ ์–ธ๊ธ‰ํ•œ 'Unnamed Closure'
์˜์–ด ๊ทธ๋Œ€๋กœ ์ด๋ฆ„์—†๋Š” ํ•จ์ˆ˜์ด๋‹ค.
ํ•จ์ˆ˜๋ช…์„ ๋งŒ๋“ค์ง€ ์•Š์•„๋„ ๋œ๋‹ค!!๐Ÿคฉ


ํด๋กœ์ €๋Š”
์ด๋ฆ„์—†๋Š” ์ž„์‹œํ•จ์ˆ˜๋ฅผ ๋งŒ๋“ค์–ด ์‚ฌ์šฉํ•˜๋ฉด์„œ
๋งค๊ฐœ๋ณ€์ˆ˜ ๋˜ํ•œ ๊ธฐ์กด์˜ ํ•จ์ˆ˜์ฒ˜๋Ÿผ ํ™œ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค!


๊ทธ๋Ÿผ ์ด์ œ ์˜ˆ์‹œ๋ฅผ ํ†ตํ•ด ์ž์„ธํžˆ ์•Œ์•„๋ณด์ž!!



์œ„์— ์˜ˆ์‹œ์ฒ˜๋Ÿผ ๋”ํ•˜๊ธฐ ํ•จ์ˆ˜๋ฅผ ํ•œ ๋ฒˆ ๋งŒ๋“ค์–ด๋ณด๋ฉด?


func sumFunction(a: Int, b: Int) -> Int {
    return a + b
}
var sumResult: Int = sumFunction(a: 4, b: 8)
print(sumResult) // 12

 

์ด์ œ ํด๋กœ์ €๋ฅผ ํ™œ์šฉํ•ด ๋ณผ๊นŒ์š”?

var sum:(Int, Int) -> Int = {(a: Int, b: Int) -> Int in
        return a + b
}
sumResult = sum(4, 8)
print(sumResult) // 12

์ด๋ ‡๊ฒŒ sum()์•ˆ์— ํŒŒ๋ผ๋ฏธํ„ฐ ๊ฐ’์„ ๋„ฃ์–ด ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค!


๊ทธ๋ฆฌ๊ณ  ์•„๋ž˜์™€ ๊ฐ™์ด
ํ•จ์ˆ˜ ๋˜ํ•œ ํด๋กœ์ €์ด๋ฏ€๋กœ sum ๋ณ€์ˆ˜์— ํ•จ์ˆ˜๋ฅผ ํ• ๋‹นํ•  ์ˆ˜ ์žˆ๋‹ค.

sum = sumFunction(a: b:)
sumResult = sum(4, 8)
print(sumResult) // 12

 



๊ทธ๋ฆฌ๊ณ  'callback function(์ฝœ๋ฐฑ ํ•จ์ˆ˜)'๋กœ ํด๋กœ์ €๋ฅผ ๋งŽ์ด ์‚ฌ์šฉํ•œ๋‹ค.

์‚ฌ์น™์—ฐ์‚ฐ ํ•จ์ˆ˜๋กœ ์˜ˆ๋ฅผ๋“ค๋ฉด,

let add: (Int, Int) -> Int
add = { (a: Int, b: Int) -> Int in
    return a + b
}

let substract: (Int, Int) -> Int
substract = { (a: Int, b: Int) -> Int in
    return a - b
}

let mulitply: (Int, Int) -> Int
mulitply = { (a: Int, b: Int) -> Int in
    return a * b
}

let divide: (Int, Int) -> Int
divide = { (a: Int, b: Int) -> Int in
    return a / b
}


์ด๋ ‡๊ฒŒ ์‚ฌ์น™์—ฐ์‚ฐ ํด๋กœ์ €๋ฅผ ๋งŒ๋“ค๊ณ !

                           // "method ๋ผ๋Š” ์ด๋ฆ„์œผ๋กœ ํด๋กœ์ €๋ฅผ ๋„˜๊ฒจ์ฃผ๊ฒ ๋‹ค!"๋ผ๋Š” ์˜๋ฏธ
func calculate(a: Int, b: Int, method: (Int, Int) -> Int) -> Int {
    return method(a, b) // ํ•จ์ˆ˜ ์•ˆ์—์„œ ์ „๋‹ฌ๋ฐ›์€ ํด๋กœ์ €๋ฅผ ํ˜ธ์ถœ
}

calculate ํ•จ์ˆ˜ ์ƒ์„ฑํ•œ ๋‹ค์Œ

var calculated: Int

calculated = calculate(a: 10, b: 20, method: add)
print(calculated) // 30

์ด๋ ‡๊ฒŒ calculated ๋ผ๋Š” ๋ณ€์ˆ˜๋ฅผ ๋งŒ๋“ค๊ณ ,
๋งŒ๋“ค์–ด ๋†“์€ ๋ณ€์ˆ˜์—๋‹ค๊ฐ€ calculate ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜๋Š” ๊ฒƒ์ด๋‹ค.
(method์—๋Š” add๋ผ๋Š” ํด๋กœ์ €๋ฅผ ์ „๋‹ฌ๋ฐ›๊ธฐ)


์œ„์™€๊ฐ™์ด ํ•ด์ค˜๋„ ๋˜๊ณ !

calculated = calculate(a: 20, b: 30, method: { (first: Int, second: Int) -> Int in
    return first + second
})

print(calculated) // 50

์ด๋ ‡๊ฒŒ ๋ฐ”๋กœ method ๋’ค์— ์ „๋‹ฌ์ธ์ž๋กœ ์ฝ”๋“œ๋ธ”๋Ÿญ์„ ์ž‘์„ฑํ•˜์—ฌ ๋„˜๊ฒจ์ค˜๋„ ๋œ๋‹ค.



<ํ›„ํ–‰ ํด๋กœ์ €>


ํด๋กœ์ €๊ฐ€ ๋งˆ์ง€๋ง‰ ์ „๋‹ฌ์ธ์ž๋ผ๋ฉด,

๋งค๊ฐœ๋ณ€์ˆ˜ ์ด๋ฆ„์„ ์ƒ๋žตํ•˜๊ณ , ํ•จ์ˆ˜ ์†Œ๊ด„ํ˜ธ ์™ธ๋ถ€์— ํด๋กœ์ € ๊ตฌํ˜„์ด ๊ฐ€๋Šฅํ•˜๋‹ค!

func calculate2(a: Int, b: Int, method: (Int, Int) -> Int) -> Int {
    return method(a, b) // ํ•จ์ˆ˜ ์•ˆ์—์„œ ์ „๋‹ฌ๋ฐ›์€ ํด๋กœ์ €๋ฅผ ํ˜ธ์ถœ
}
var result: Int

result = calculate2(a: 12, b: 20) { (first: Int, second: Int) -> Int  in
    return first + second
}

print(result) // 32


<ํด๋กœ์ € ์ถ•์•ฝ(๊ฐ„์†Œํ™”)>

ํด๋กœ์ €๋Š” ๋‹ค์–‘ํ•œ ๋ฐฉ๋ฒ•์œผ๋กœ ์ถ•์•ฝ์ด ๊ฐ€๋Šฅํ•˜๋‹ค!
(๋ฐ”๋กœ ์œ„์˜ ์˜ˆ์‹œ ์ด์–ด์„œ ์ถ•์•ฝ)

Calculate2 ํ•จ์ˆ˜์˜ method ๋งค๊ฐœ๋ณ€์ˆ˜๋Š”
์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ Int์ž„์„ ์•Œ๊ณ ์žˆ๊ธฐ ๋•Œ๋ฌธ์—
๊ตณ์ด ๋ฐ˜ํ™˜ํƒ€์ž…์„ ๋ช…์‹œํ•ด์ฃผ์ง€ ์•Š์•„๋„ ๋œ๋‹ค.
(in ํ‚ค์›Œ๋“œ๋Š” ์ƒ๋žตX)

result = calculate2(a: 30, b: 22, method: { (first: Int, second: Int) in
    return first + second
})

print(result) // 52

์ด๋ ‡๊ฒŒ!!
( -> Int ์ƒ๋žต! )


์—ฌ๊ธฐ์„œ ์ถ”๊ฐ€์ ์œผ๋กœ ํ›„ํ–‰ ํด๋กœ์ €๋ฅผ ํ•จ๊ป˜ ํ™œ์šฉํ•˜์—ฌ ์ถ•์•ฝ์ด ๊ฐ€๋Šฅํ•˜๋‹ค!

result = calculate2(a: 30, b: 22) { (first: Int, second: Int) in
    return first + second
}

print(result) // 52

์ด๋ ‡๊ฒŒ!! ์†Œ๊ด„ํ˜ธ ๋‹ซ์•„์ฃผ๊ณ ,
( method:  ์ƒ๋žต!!)


๋˜ํ•œ,  ๋งค๊ฐœ๋ณ€์ˆ˜ ์ด๋ฆ„์ด ๊ตณ์ด ํ•„์š”ํ•˜์ง€ ์•Š๋‹ค๋ฉด,
๋‹จ์ถ• ์ธ์ž ์ด๋ฆ„($0, $1, $2)์„ ์‚ฌ์šฉํ•˜์—ฌ
์ถ”๊ฐ€์ ์œผ๋กœ ์ถ•์•ฝ์ด ๊ฐ€๋Šฅํ•˜๋‹ค!

result = calculate2(a: 22, b: 12, method: {
    return $0 + $1
})

print(result) // 34


์ด๋ ‡๊ฒŒ! ์—ฌ๊ธฐ์„œ ํ›„ํ–‰ ํด๋กœ์ €๊นŒ์ง€ ํ™œ์šฉํ•˜๋ฉด?

result = calculate2(a: 22, b: 12) {
    return $0 + $1
}

print(result) // 34


์™€์•™.. ์—„์ฒญ ์ค„์–ด๋“ค์—ˆ์ฅฌ..?๐Ÿซข

๊ทธ์น˜๋งŒ, ๋„ˆ๋ฌด ๋งŽ์ด ์ถ•์•ฝํ•˜์—ฌ ์‚ฌ์šฉํ•œ๋‹ค๋ฉด
๋ˆ„๊ตฐ๊ฐ€๋Š” ์ดํ•ดํ•˜์ง€ ๋ชปํ•˜๋Š” ์ฝ”๋“œ๊ฐ€ ๋  ์ˆ˜ ์žˆ์œผ๋‹ˆ!
์ ๋‹นํžˆ ์ถ•์•ฝํ•˜๋Š” ๊ฒƒ์ด ์ข‹๋‹ค.ใ…Žใ…Ž



<๐Ÿ’ก๊ธฐ์–ตํ•˜์ž!!๐Ÿ’ก>
1. ํŒŒ๋ผ๋ฏธํ„ฐ ์ด๋ฆ„(a, b) ๋Œ€์‹  $0, $1 ์‚ฌ์šฉ!!
2. ํŒŒ๋ผ๋ฏธํ„ฐ์™€ in ์‚ฌ์šฉ ํ˜น์€ $ ๋“ฑ์„ ์‚ฌ์šฉ!!



์•„๋ž˜ ์ถ•์•ฝ ์˜ˆ์‹œ๋Š”
์ˆ˜์—… ๋•Œ ๋ฐฐ์› ๋˜ '๋‹จ๊ณ„๋ณ„ ์ถ•์•ฝ๋ฒ•'์ด๋‹ค!
(ํ•œ๋ˆˆ์— ๋ณด๊ธฐ ์ข‹์•„ ๋‚จ๊ฒจ๋†“๊ธฐ๐Ÿ˜ƒ_ written by kokojong)

func addFunction(closure: (Int, Int, Int) -> Int) {
    let added = closure(1, 2, 3)
    print(added)
}

// ๋‹จ๊ณ„๋ณ„ ์ถ•์•ฝ๋ฒ•
addFunction(closure: { (a: Int, b: Int, c: Int) -> Int in
    return a + b + c
})


addFunction(closure: {(a, b, c) -> Int in
    return a + b + c
})

addFunction(closure: {(a, b, c) in
    return a + b + c
})

addFunction(closure: {
    return $0 + $1 + $2
})

addFunction(closure: {
    $0 + $1 + $2   // ํ•œ ์ค„์˜ ๊ฒฝ์šฐ์—๋Š” return๊นŒ์ง€๋„ ์ƒ๋žต ๊ฐ€๋Šฅ!!
})

addFunction(){
    $0 + $1 + $2
}

addFunction {
    $0 + $1 + $2
}

 

728x90