๊ณต๋ถ๋ฅผ ํ๋ค๋ณด๋ฉด ๊ผญ ํ ๋ฒ์ฉ ๋ง์ฃผ์น๊ฒ ๋๋ defer... ํ์ง๋ง ํ์์ ๊ฑฐ์ ์ธ ์ผ์ด ์์์ด์ ๊ฐ๋ ์ ๋ํ ์ดํด๋ ๋ถ์กฑ & ๊ทธ๋์ ์ง์ง๋ก ์ด๋ป๊ฒ ์ฐ๋๊ฑด๋ฐ ?!?! ํ๋ ๊ถ๊ธ์ฆ์ผ๋ก ๋ค์ defer์ ๋ํด ์์๋ณด๊ธฐ๋ก ํ์ต๋๋ค ๐ค
defer๋?
defer {
<#statements#>
}
๋ค์๊ณผ ๊ฐ์ ํํ๋ฅผ ๋๊ณ ์๋ defer ๊ตฌ๋ฌธ ์์๋ ํ์ฌ ์ฝ๋ ๋ธ๋ก์ ๋๊ฐ๊ธฐ ์ ์ ๊ผญ ์คํํด์ผ๋๋ ์ฝ๋๋ฅผ ์์ฑํ์ฌ ์ฝ๋๊ฐ ๋ธ๋ก์ ์ด๋ป๊ฒ ๋น ์ ธ๋๊ฐ๋ ๊ผญ ๋ง๋ฌด๋ฆฌํด์ผ๋๋ ์์ ์ ํ ์ ์๊ฒ ๋์์ค ์ ์์ต๋๋ค.
์ฝ๋ ๋ธ๋ก์ ๋น ์ ธ๋๊ฐ๊ฒ ๋๋ ๊ฒฝ์ฐ๋ 1) return 2) ์๋ฌ throw 3) ์ฝ๋ ๋ธ๋ก์ ๋์ ๋ง๋ฌ์ ๋ ์ด๋ ๊ฒ ์๋ค๊ณ ์๊ฐํ๋๋ฐ defer๋ ์ฝ๋ ๋ธ๋ก์ ๋น ์ ธ๋๊ฐ๋ ์กฐ๊ฑด, ์ด์ ์ ์๊ด์์ด ๋ ์คํ๋ฉ๋๋ค.
defer์ ์ฃผ ์ฌ์ฉ ๋ชฉ์
์ฃผ๋ก ๋ฆฌ์์ค ์ ๋ฆฌ ๋ฐ ์ค๋ฅ ์ฒ๋ฆฌ์ ์ ์ฉํ๊ฒ ์ฌ์ฉ๋ฉ๋๋ค.
๋ํ์ ์ธ ์์๋ก๋ NSLock(Dead Lock์ ํด๊ฒฐํ ์ ์๋ ๋ฐฉ๋ฒ๋ค ์ค ํ๋)์ ์ฌ์ฉํ ๋๊ฐ ์์ต๋๋ค.
์๋ก ๋ค๋ฅธ ์ค๋ ๋์์ ํ๋์ ๋ฆฌ์์ค์ ์ ๊ทผํ์ฌ ๋ณ๊ฒฝํ๋ ๊ฒ์ ๋ง๊ธฐ ์ํด ์ฌ์ฉํ ๋ lock์ ๊ฑธ๊ณ ์ฌ์ฉ์ด ๋๋๋ฉด unlock์ ํธ์ถํด์ผํฉ๋๋ค.
์ด๋ unlock ๋ฉ์๋๋ฅผ defer ๊ตฌ๋ฌธ์ ์์ฑํด์ค์ ์ฝ๋ ๋ธ๋ก์ ๋น ์ ธ๋๊ฐ ๋ ํญ์ unlock ๋ฉ์๋๊ฐ ๊ผญ ํธ์ถ๋ผ์ ๋ฐ๋๋ฝ ํ์์ด ๋ฐ์ํ๋ ๊ฒ์ ์๋ฐฉํ ์ ์์ต๋๋ค!
๋ณด๋ค ๊ฐ๋จํ ์์๋ฅผ ํตํด ์ดํดํด๋ณผ๊ฒ์! ํจ์ ๋ด์์ ํ์ผ์ ์ด์ด ์ฌ์ฉํ๋ ์ํฉ์ด ์๋ค๊ณ ๊ฐ์ ํด๋ด ์๋ค. ํ์ผ์ ์ฌ์ฉํ๋ ์ค ์ค๋ฅ๊ฐ ๋ฐ์ํด์ ์ฝ๋ ๋ธ๋ก์ ๋น ์ ธ๋๊ฐ์ผํ ๋ ํ์ผ์ ์ ์์ ์ผ๋ก ๋ซ์ ๋ฉ๋ชจ๋ฆฌ์์ ํด์ ํด์ค์ผํฉ๋๋ค. ์ด๋ฐ ๋ด์ฉ์ defer์ ๊ตฌํํ๋ฉด ์ ์ฉํ๊ฒ ์ฌ์ฉํ ์ ์์ต๋๋ค!
defer๋ฅผ ์ฌ์ฉํ์ง ์์ ๊ฒฝ์ฐ์ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ๋ฅผ ์ฝ๋๋ก ํ ๋ฒ ๋ณผ๊ฒ์!
func writeData() {
let file = openFile()
if ... {
closeFile(file)
return
}
if ... {
closeFile(file)
return
}
}
๋ง์ฝ defer๋ฅผ ์ฌ์ฉํ์ง ์๋๋ค๋ฉด ….. ์ค๋ณต ์ฝ๋๊ฐ ๊ณ์ ๋ฐ์ํ๊ฒ ๋ฉ๋๋ค. return ํน์ throw ์ ์๋ ๋ฐ๋์ closeFile ๋ฉ์๋๋ฅผ ์คํํด์ผ ํ๊ธฐ ๋๋ฌธ์ด์ฃ . ๊ทธ๋ฆฌ๊ณ ์ ์ง ๊ด๋ฆฌ๋ ์ด๋ ต๊ตฌ ์ฝ๋๊ฐ ๊ธธ์ด์ง๋ฉด closeFile์ ๊น๋จน์์ง๋ … ๋ํ.
func writeData() {
let file = openFile()
defer {
closeFile(file)
}
if ... { return }
if ... { return }
}
ํ์ง๋ง ์ด๋ ๊ฒ defer์ closeFile ๋ฉ์๋๋ฅผ ํ ๋ฒ ์์ฑํด์ฃผ๊ธฐ๋ง ํ๋ฉด ํด๋น writeData ์ฝ๋ ๋ธ๋ก์ ๋ฒ์ด๋ ๋๋ง๋ค defer๊ฐ ์คํ๋๋ค๋ ๊ฒ์ ํ ๋์ ํ์ธํ๊ธฐ๋ ์ฝ๊ณ ์ฝ๋๋ ํจ์ฌ ๊ฐํธํด์ง์ฃ !
ํน์ง
- ํ์ฌ ์ฝ๋ ๋ฒ์๋ฅผ ๋ฒ์ด๋๊ธฐ ์ ๊น์ง ์คํ์ ๋ฏธ๋ฃจ๋ค๊ฐ ํ๋ก๊ทธ๋จ ํ๋ฆ์ด ์ฝ๋ ๋ฒ์๋ฅผ ๋ฒ์ด๋๊ธฐ ์ง์ ์ ์คํ๋ฉ๋๋ค.
- ํ ์ฝ๋ ๋ฒ์์ ์ฌ๋ฌ defer๊ฐ ์์ฑ๋ผ์์ผ๋ฉด ๋งจ ๋ง์ง๋ง์ ์์ฑ๋ ๊ตฌ๋ฌธ๋ถํฐ ์ญ์์ผ๋ก ์งํ๋ฉ๋๋ค.
์๋์ ์์๋ฅผ ํตํด์ defer์ ํน์ง์ ๋ํด ์กฐ๊ธ ๋ ์์๋ด ์๋น !
for i in 0...2 {
defer {
print("A", terminator: " ")
}
print(i, terminator: " ")
// if๋ฌธ๋ ํ๋์ ์ฝ๋ ๋ธ๋ก์ด๊ฒ ์ฃ ?
if i % 2 == 0 {
defer {
print("", terminator: "\\n")
}
print("It's even", terminator: " ")
}
}
// 0 It's even
// A 1 A 2 It's even
// A
๋จผ์ for๋ฌธ์ด๋ผ๋ ๊ฐ์ฅ ํฐ ํ๋์ ์ฝ๋ ๋ธ๋ก์ด ์๊ณ i๊ฐ 0์ธ ์ํฉ๋ถํฐ ์์๋ฉ๋๋ค.
์์ํ์๋ง์ defer๋ฌธ์ ๋ง๋๋ฉด ํด๋น ํด๋ก์ ๋ฅผ ์คํ์ ํ๋์ฉ ์๋๋ค๊ณ ์๊ฐํด๋ณผ๊ฒ์!
์ง๊ธ defer ์คํ์๋ print("A", terminator: " ")๊ฐ ํ๋ ์์์ต๋๋ค!
๋ค์ ํ๋ฆฐํธ ๋ฌธ์ ๋ฐ๋ผ "0"์ด ํ๋ฆฐํธ ๋๊ณ if๋ฌธ์ ๋ง๋๊ฒ ๋ฉ๋๋ค.
0 % 2 == 0 ์ด๊ธฐ ๋๋ฌธ์ if๋ฌธ ์์ ๋ค์ฌ๋ค๋ณด๋ฉด defer๊ฐ ๋ ์์ฃ ! ํ์ง๋ง ์ด๋ for๋ฌธ๊ณผ if๋ฌธ์ ๋ณ๊ฐ์ ์ฝ๋ ๋ธ๋ก์ด๊ธฐ ๋๋ฌธ์ ์ด์ ์ ์์๋ defer ์คํ๊ณผ๋ ๋ค๋ฅธ ์๋ก์ด ์คํ์ print("", terminator: "\\n")์ ์์์ค๋๋ค.
๊ทธ๋ฆฌ๊ณ "It's even"์ด ํ๋ฆฐํธ๋๊ณ if๋ฌธ ์ฝ๋๋ธ๋ก์ ๋น ์ ธ๋๊ฐ๊ฒ ๋ฉ๋๋ค.
์ฝ๋ ๋ธ๋ก์ ๋น ์ ธ๋๊ฐ๋ฉด defer๋ฌธ์ด ์คํ๋๋ค๊ณ ํ์ผ๋ ์ด๋ ์๋ก์ด if๋ฌธ defer ์คํ์์ pop์ ํด์ค์ ๊ฐ์ฅ ์ต๊ทผ์ ์์ธ print("", terminator: "\\n")๊ฐ ์คํ๋๊ฒ ์ฃ !
๋ง๋ก๋ง ์ค๋ช ์ ํ๋ ค๋ ๋ญ๊ฐ ์ข ์ด๋ ต๊ณ ๋ณต์กํด๋ณด์ด๋๋ฐ... ๐ซ ๊ทธ๋ ์ง ์๋ค๋๊ฑฐ !!
์ฌ๊ธฐ๊น์ง ์ค๋ฉด for๋ฌธ ์ฝ๋๋ธ๋ก๋ ํ ๋ฒ ๋น ์ ธ๋๊ฐ๊ฒ ๋๊ฒ ์ฃ ? ๊ทธ๋ผ ์ฒ์์ ์์๋ defer ์คํ์์ pop์ ํด์ค ๋ค print("A", terminator: " ")๋ฅผ ์คํํด์ฃผ๊ฒ ๋ฉ๋๋ค!
๊ทธ๋ฌ๋ฉด ํ์ฌ๋ ์ฌ๊ธฐ๊น์ง ํ๋ฆฐํธ๊ฐ ๋ ์ํ์ ๋๋ค.
0 It's even
A
์ด๋ฐ ์์ผ๋ก ๋๋ฒ ๋ for๋ฌธ์ ๋๋ฉด ์ฝ๋ ํ๋จ์ ๊ฒฐ๊ณผ๋ฅผ ํ์ธํ ์ ์์ต๋๋ค.
์ฒ์์ defer๊ฐ ์ญ์์ผ๋ก ์คํ๋๋ค๋๊ฒ ๋ญ๊ฐ ํ๋๋ฐ defer๋ฅผ ์คํ์ ์์๋จ๋ค๊ฐ ํ๋์ฉ popํด์ ์คํ์ํค๋ ๋๋์ผ๋ก ์ดํด๋ฅผ ํ๋ ์กฐ๊ธ ๋ ๊ฐ์ด ์ ์ค๋ ๊ฒ ๊ฐ๋๋ผ๊ตฌ์! ์ฐธ๊ณ ํ์ญ์ผ ๐
๋ ๋ค๋ฅธ defer์ ํน์ง๋ค๋ก๋
- defer๋ฅผ ์ฝ๊ธฐ ์ ์ ํจ์๊ฐ ์ข ๋ฃ๋๋ฉด defer๋ฌธ์ ์คํ๋์ง ์๋๋ค.
- defer ์ฝ๋ ๋ด๋ถ์๋ break, return์ฒ๋ผ ๊ตฌ๋ถ์ ๋น ์ ธ๋๊ฐ ์ ์๋ ์ฝ๋๋ ์ค๋ฅ๋ฅผ ๋์ง๋ ์ฝ๋๋ฅผ ์์ฑํ๋ฉด ์๋๋ค.
์ ์ด์ ๋ ๊ฐ์ ๊ฐ์ ๋ฆฌํดํ ์ ์์ ๋ฟ๋๋ฌ ์ด๋ฏธ ์ฝ๋ ๋ธ๋ญ์์ ๋น ์ ธ๋์์ ์คํ๋๊ธฐ ๋๋ฌธ์ ๊ฑฐ๊ธฐ์ ๋ flow๋ฅผ ๋น ์ ธ๋์ค๋ ค๊ณ ํ๋ ๊ฒ ์์ฒด๊ฐ ๋ง์ด ์๋๋ ? ์ํฉ์ด๋ผ๊ณ ์ ๋ ์ดํด๋ฅผ ํ์ต๋๋ค...๐ค
- ์ฝ๋ ๋ธ๋ก ๋ด๋ถ์ ๋ ํ ๋จ๊ณ ํ์์ ๋ธ๋ก์ ๋ง๋ค๊ณ ์ ํ ๋ do ๊ตฌ๋ฌธ์ catch ์์ด ๋จ๋
์ผ๋ก๋ ์ฌ์ฉํ ์ ์์ต๋๋ค.
do block ์ข ๋ฃ ์ ๊ทธ ๋ด๋ถ์ defer ๊ตฌ๋ฌธ์ด ์คํ๋๋ ์ ์ฌ์ฉํ๋ฉด ๋ณต์กํ flow ์งค ๋ ์ฌ์ฉํด๋ณผ ์๋ ์์ ๊ฒ ๊ฐ๋ค์!
func someFunction() {
print("1")
defer {
print("2")
}
do {
defer {
print("3")
}
print("4")
}
defer {
print("5")
}
print("6")
}
someFunction()
// 1
// 4
// 3
// 6
// 5
// 2
- ์ค์ฒฉ๋๋ ๊ฒฝ์ฐ ๋ฐ๊นฅ → ์ ์์๋๋ก ์คํ๋ฉ๋๋ค.
defer๋ ๊ฒฐ๊ตญ ํ๋์ ์ฝ๋ ๋ธ๋ญ์ด๊ธฐ ๋๋ฌธ์ ๊ทธ defer๋ฌธ์ ๋ฒ์ด๋์ผ ๋ด๋ถ defer๋ฌธ์ด ์คํ๋๋ ์๋ฆฌ์ธ๋ฏ?๐ค
func deferExample3() {
defer {
print("example1")
defer {
print("example2")
}
print("example3")
}
}
// example 1
// example 3
// example 2
๊ทผ๋ฐ ์๋ ๊ฒ ์ฝ๋ ์์ฑํด์ ๋๋ฆฌ๋๊น scope์ ๋์ ์๋ defer๋ ๋ฐ๋ก ์คํ๋๋ฒ๋ฆฌ๋๊น ์ฒซ๋ฒ์งธ defer → do๋ก ๋ณ๊ฒฝํด๋ผ! ๋ผ๋ ๊ฒฝ๊ณ ๋ฌธ์ด ๋น๋๋ค ํธ์ค
print(”example3”)๋ฅผ ์ญ์ ํ๋ฉด ์ค์ฒฉ๋ผ์๋ defer์๋ ๋๊ฐ์ ๊ฒฝ๊ณ ๋ฌธ์ด ๋จ๋ ๊ฒ์ ๋ณผ ์ ์์ต๋๋ค.
defer ๋ค์ ๋ค๋ฅธ ๋ด์ฉ์ด ์๋ค ? ๊ทธ๋ฌ๋ฉด ์ด์ฐจํผ defer๊ฐ ๊ฐ์ฅ ๋ง์ง๋ง์ ์คํ๋๊ธฐ ๋๋ฌธ์ defer๋ฅผ ์ฌ์ฉํ๋ ์๋ฏธ๊ฐ ์์ด์ do๋ก ๋ณ๊ฒฝํ๋ผ๊ณ ํ๋ ๊ฒ ๊ฐ๋ค์!
๋ ๊ณต์ ๋ฌธ์๋ฅผ ์ฝ๋ค๊ฐ ํ ๋ฌธ์ฅ์ ๋ฐ๊ฒฌํ๋๋ฐ ์ ์๋ฟ์ง ์์์ GPTํํ ๋ฌผ์ด๋ดค์ต๋๋ค ใ ๐
๋ฒ์์ ๋ง์ง๋ง defer ๊ตฌ๋ฌธ์ ๋จผ์ ์คํํ๋ค๋ ๊ฒ์ ๋ค๋ฅธ defer ๊ตฌ๋ฌธ์ ์ํด ์ ๋ฆฌ๋ ๋ฆฌ์์ค๋ฅผ ์ฐธ์กฐํ ์ ์๋ค๋ ์๋ฏธ์ ๋๋ค.
์ด ๋ฌธ์ฅ์ ๋ํด ์งํผํฐ์๊ฒ ์์์ ํจ๊ป ์ค๋ช ํด๋ฌ๋ผ๊ณ ์์ฒญํ์ ๋ ๋ฐ์ ์ ์์๋ ๋ด์ฉ์ ๋๋ค.
func processFile(filename: String) {
let file = openFile(filename)
defer {
closeFile(file)
}
let data = readFile(file)
defer {
releaseData(data)
}
// ํ์ผ ๋ฐ์ดํฐ ์ฒ๋ฆฌ
}
- closeFile(file): ํ์ผ์ ๋ซ๋ ์์ . ํจ์์ ๋ง์ง๋ง ๋ถ๋ถ์ ์คํ๋์ด์ผ ํฉ๋๋ค.
- releaseData(data): ํ์ผ๋ก๋ถํฐ ์ฝ์ ๋ฐ์ดํฐ๋ฅผ ํด์ ํ๋ ์์ . ๋ฐ์ดํฐ ์ฒ๋ฆฌ๊ฐ ์๋ฃ๋ ํ ์คํ๋์ด์ผ ํฉ๋๋ค.
์ด ์์๋ ํ์ผ์ ๋ซ์ ํ์ ๋ฐ์ดํฐ๋ฅผ ํด์ ํ๋ ค๊ณ ์๋ํ๋ ๊ฒ์ ๋ฐฉ์งํฉ๋๋ค. ํ์ผ์ด ๋ซํ๋ค๋ฉด, ๊ทธ ํ์ผ๋ก๋ถํฐ ์ฝ์ ๋ฐ์ดํฐ์ ์ ๊ทผํ๋ ๊ฒ์ด ๋ ์ด์ ์ ํจํ์ง ์์ ์ ์๊ธฐ ๋๋ฌธ์ ๋๋ค.
์ ์ฝ๋์์๋ fileName์ผ๋ก file์ ์ด๊ณ , ๊ฑฐ๊ธฐ์๋ถํฐ ๋ฐ์ดํฐ๋ฅผ ์ฝ์ด์ค๊ณ ์์ต๋๋ค. ์ด๋ ์ฝ๋ ๋ธ๋ญ์ ๋น ์ ธ๋๊ฐ๊ธฐ ์ , 1) ๋ฐ์ดํฐ ํด์ 2) ํ์ผ ๋ซ๊ธฐ ์ด ๋ ๊ฐ์ง ์์ ์ด ๋ฐ๋์ ์คํ๋ผ์ผํฉ๋๋ค. ์ด๋ ๋ ์์ ์ ์๋ก์๊ฒ ์ํฅ์ ๋ผ์น ์ ์๋ค๊ณ ํ๋จ์ด ๋ฉ๋๋ค.
ํ์ผ์ด ๋จผ์ ๋ซํ๋ฉด ๊ทธ ๋ฐ์ดํฐ์ ์ ๊ทผ์ ํ ์ ์์ ์๋ ์๊ธฐ ๋๋ฌธ์ด์ฃ ! ์ ํํ ์์๋ ์๋ ์ ์์ง๋ง ์ด์ ๊ฐ์ด ๋จผ์ ์คํ๋ releaseData defer๋ฌธ์ ๋ง์ง๋ง์ผ๋ก ์คํ๋ defer๋ฌธ์ด ์ ๋ฆฌํ๊ณ ์ ํ๋ file ๋ณ์๋ก๋ถํฐ ๋ฐ์์จ ๋ฐ์ดํฐ๋ฅผ ์ฐธ์กฐํ๊ณ ์๋๊ฑธ ํ์ธํ ์ ์์ต๋๋ค.
์กฐ๊ธ ํท๊ฐ๋ฆด๋งํ ์์
func deferExample() -> String {
var nickname = "์ฝ๋ฆฌ"
// ํจ์ ํธ์ถ ํ return๊น์ง ๋๋ ๋ค์์ ํธ์ถ๋จ
// ์ค์ฝํ ๋, ํจ์ ๋ฆฌ์์ค ์ ๋ฆฌ
defer {
nickname = "์นด๋ "
print("defer")
print(nickname)
}
return nickname
}
print(deferExample())
// defer
// ์นด๋
// ์ฝ๋ฆฌ
๋ด ์์์ ์ฝ๋ฆฌ defer ์นด๋ ์๋๋ฐ … defer๊น์ง ๋๋์ผ ๋ฉ์๋๊ฐ ์ ๋ง ๋๋๋๊ฑฐ๋ผ์ return → defer → print๋ฌธ ์คํ ์ด๋ ๊ฒ ๋๋ ๊ฒ ๊ฐ๋ค ์ผ๋จ defer๋ฌธ ๋ด๋ถ์์ ๊ฐ์ ๋ณ๊ฒฝํ๋๋ผ๋ return ๊ฐ์๋ ์ํฅ์ ๋ผ์น์ง ์๋๊ฑธ๋ก.. .!๋ ธ์ฐ….. defer๋ ์ฝ๋๋ธ๋ก์ ๋ฒ์ด๋๊ธฐ ์ง์ !!์ ์คํ๋๊ธฐ ๋๋ฌธ์ defer ๋ด์ฉ ์คํ ํ..? ์ด..? return์ด ๋๋์ค์์๋๋ฐ…? ๋ง์ฝ ๊ทธ๋ ๊ฒ ๋๋ฉด defer ์นด๋ ์นด๋ ๊ฐ ๋์์ผํ๋๋ฐ ๊ทธ๊ฑด ์ ๊ทธ๋ ๋ค…์ ๊ทธ๋ ์ง ๐ค โก๏ธ String์ด ์ผ๋จ ๊ฐ ํ์ ์ด๊ธฐ ๋๋ฌธ์… ์ฐธ์กฐ ํ์ ์ด๋ฉด ๋ด๊ฐ ๋งํ๋๋ก ๋์ฌ๊ฒ๊ฐ๋ค! return๊ณผ ์ฝ๋ ๋ธ๋ก ๋ฒ์ด๋๊ธฐ ์ง์ ์ ํ์ด๋ฐ์ด ๋ค๋ฅธ๊ฐ๋ณด๋ค…๋ฐ์ ๊ธ์ ์ฝ์ด๋ณด์…
์ด๋ฌํ ์์์ ํ๋ฆ์ ๋ฐ๋ผ..๋ฐ๋ผ ๊ฐ๋ค๊ฐ..์๋์ ๊ธ์ ๋ง๋์ defer์ ์ค์ ์๋์ ๋ํด ๋ ์์๋ณด์์ต๋๋ค..๐ซ
์๋์ ๊ธ์ defer ์๋ ์๋ฆฌ ๋ฐ ์์์ ๋ํด ์ฐธ๊ณ ์ ๋๋ก๋ง ๋ด์ฃผ์ธ์!
How “defer” operator in Swift actually works
์ด ๊ธ์ ๋ฒ์ญํ ์ด ๊ธ์ ์ฐธ๊ณ ํ์ต๋๋ค ๐โ๏ธ
defer๋ฅผ ํธ์ถํ๊ณ ์๋ก์ด ๊ฐ์ ์ ์ฉํ๊ธฐ ์ ์ ์๋ ๊ฐ์ ์ ์ฅํ๋ค!
defer๋ฅผ ํธ์ถํ๋ ๊ฒ์ ์์ ๋ณ์์ ๊ธฐ์กด ๊ฐ์ ๋ฃ์ด๋๊ณ ๊ธฐ์กด ๊ฐ์ ๋ณํ์ ์ผ์ผํค๊ณ ์์ ๋ณ์๋ฅผ ๋ฆฌํดํ๋ ๊ฒ๊ณผ ๊ฐ์ ๋ก์ง์ด๋ค.
๋ฐ๋ผ์ ์๋์ ๋ ํจ์๋ ๋ด๋ถ ๋์์ด ๊ฑฐ์ ๋์ํ๋ค๊ณ ํ๋ค!
var a = "Hello"
func b() -> String {
defer { a.append(" world") }
return a
}
var a = "Hello"
func c() -> String {
let d = a
a.append(" world")
return d
}
์ต์ ๋ ๊ฐ์ ์ธ๋ํํ๋ ๊ณผ์ ์ ์กฐ๊ธ ๋ ๋ณต์กํ๋ค …
var a: String? = nil
func b() -> String {
a = "Hello world"
defer { a = nil }
return a!
}
print(b()) // Hello world
์ฌ๊ธฐ์๋ return a!์์ ๊ฐ์ ์ธ๋ํํ๋ ๊ณผ์ ์์ a์ ๊ฐ์ด ์๋ ๊ฒฝ์ฐ defer๋ฅผ ์ค๊ฐ์ ์คํํ๊ณ ์๋ค..! ์ฑ๊ธฐ..
์๊ฐ๋ณด๋ค ๊ฐ๋จํ ์ค ์์๋๋ฐ ์๊ฐ๋ณด๋ค ๋ณต์กํ๋ defer์ ๋ํด ์์๋ณด์์ต๋๋ค ~ ๐โ๏ธ
'๐ iOS' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Swift] Property Wrapper ๋ฝ๊ฐ๊ธฐ (1) (0) | 2024.01.12 |
---|---|
[Swift] rethrows ํค์๋๋ ์ธ์ ์ฐ๋๊ฑธ๊น ๐ค (3) | 2024.01.02 |
[Coordinator] Coordinators Redux (4) | 2023.12.29 |
[Coordinator] The Coordinator (4) | 2023.12.28 |