๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
IT/Swift ๋…ธํŠธ

010 Closure ํด๋กœ์ €

by 33.0 2025. 3. 19.
728x90

 

๐Ÿ“Œ 1๏ธโƒฃ ํ•จ์ˆ˜์™€ ํด๋กœ์ €์˜ ๊ด€๊ณ„

ํ•จ์ˆ˜๊ฐ€ ๋ฐ˜๋ณต์ ์œผ๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ์ฝ”๋“œ ๋ธ”๋ก์„ ๋œปํ•˜๋Š” ๊ฑฐ๋ฉด 

ํด๋กœ์ €๋Š” ์ฝ”๋“œ๋ธ”๋ก์„ ๋‹ค๋ฅธ ๊ณณ์œผ๋กœ ์ „๋‹ฌํ•˜๋Š”๋ฐ์— ์ง‘์ค‘ (ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ ์ฝ”๋“œ๋ธ”๋ก์„ ์ „๋‹ฌ)

 

ํ•จ์ˆ˜ function = named closure 

ํด๋กœ์ € Closure = unnamed closure , ์ฆ‰ ์ด๋ฆ„ ์—†๋Š” ํ•จ์ˆ˜๋ผ๊ณ ๋„ ๋งํ•  ์ˆ˜ ์žˆ๋‹ค. 

 

ํ•จ์ˆ˜ 

func sayHello() {
    print("์•ˆ๋…•!")
}

sayHello() // ์‹คํ–‰ํ•˜๋ฉด "์•ˆ๋…•!" ์ถœ๋ ฅ

 

ํด๋กœ์ € 

let greeting = { 
    print("์•ˆ๋…•!") 
}

greeting() // ์‹คํ–‰ํ•˜๋ฉด "์•ˆ๋…•!" ์ถœ๋ ฅ

 

โœ” ์ฐจ์ด์ 

  • func ํ‚ค์›Œ๋“œ ๋Œ€์‹  {}(์ค‘๊ด„ํ˜ธ)๋ฅผ ์‚ฌ์šฉํ•ด ์ด๋ฆ„ ์—†์ด ํ•จ์ˆ˜์ฒ˜๋Ÿผ ์ƒ๊ธด ์ฝ”๋“œ ๋ธ”๋ก์„ ๋งŒ๋“ค์—ˆ์–ด.
  • ์ด๋ ‡๊ฒŒ ๋งŒ๋“  ์ด๋ฆ„ ์—†๋Š” ํ•จ์ˆ˜(์ฝ”๋“œ ๋ธ”๋ก)๋ฅผ ๋ณ€์ˆ˜ greeting์— ์ €์žฅํ•œ ๊ฒƒ!
  • ์ดํ›„์— greeting()์„ ์‹คํ–‰ํ•˜๋ฉด ํ•จ์ˆ˜์ฒ˜๋Ÿผ ๋™์ž‘ํ•ด!

โžก๏ธ ์ฆ‰, ํด๋กœ์ €๋Š” ์ด๋ฆ„ ์—†๋Š” ํ•จ์ˆ˜์ฒ˜๋Ÿผ ๋™์ž‘ํ•˜๋Š” ์ฝ”๋“œ ๋ธ”๋ก์ด์•ผ!

 

๐Ÿ“Œ 2๏ธโƒฃ ํด๋กœ์ €์˜ ๊ธฐ๋ณธ ํ˜•ํƒœ

ํด๋กœ์ €์˜ ๊ธฐ๋ณธ ํ˜•ํƒœ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์•„.

{ (๋งค๊ฐœ๋ณ€์ˆ˜) -> ๋ฐ˜ํ™˜ํƒ€์ž… in 
	์‹คํ–‰ํ•  ์ฝ”๋“œ 
}
โžก๏ธ "in" ํ‚ค์›Œ๋“œ๋ฅผ ๊ธฐ์ค€์œผ๋กœ ์•ž์ชฝ์ด ๋งค๊ฐœ๋ณ€์ˆ˜์™€ ๋ฐ˜ํ™˜ ํƒ€์ž…์„ ๋‚˜ํƒ€๋‚ด๊ณ ,

๋’ค์ชฝ์ด ์‹ค์ œ๋กœ ์‹คํ–‰๋˜๋Š” ์ฝ”๋“œ ๋ถ€๋ถ„์ด์•ผ!

๐Ÿ“ ์˜ˆ์ œ: ๋ง์…ˆํ•˜๋Š” ํด๋กœ์ €

let add = { (a: Int, b: Int) -> Int in 
	return a + b 
} 
let result = add(3, 5) // 3 + 5 = 8 

print(result) // ์ถœ๋ ฅ: 8

โœ” ์„ค๋ช…

  • (a: Int, b: Int) -> Int ๐Ÿ‘‰ ๋‘ ๊ฐœ์˜ ์ •์ˆ˜๋ฅผ ๋ฐ›์•„์„œ ์ •์ˆ˜๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ํด๋กœ์ €์•ผ.
  • {} ์•ˆ์—์„œ a + b๋ฅผ ๊ณ„์‚ฐํ•˜๊ณ  return์„ ์‚ฌ์šฉํ•ด ๋ฐ˜ํ™˜ํ•ด.
  • let add = {} ๐Ÿ‘‰ ์ด ํด๋กœ์ €๋ฅผ ๋ณ€์ˆ˜ add์— ์ €์žฅํ–ˆ์–ด.
  • add(3, 5) ๐Ÿ‘‰ ๋งˆ์น˜ ํ•จ์ˆ˜์ฒ˜๋Ÿผ (3, 5)๋ฅผ ๋„ฃ์–ด ํ˜ธ์ถœํ•  ์ˆ˜ ์žˆ์–ด!

โžก๏ธ ์ฆ‰, ํด๋กœ์ €๋Š” "์ด๋ฆ„ ์—†๋Š” ํ•จ์ˆ˜"์ด๊ธฐ ๋•Œ๋ฌธ์— ๋ณ€์ˆ˜์— ์ €์žฅํ•ด์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์–ด!


๐Ÿ“Œ 3๏ธโƒฃ ํด๋กœ์ €๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์ด์œ 

ํด๋กœ์ €๋Š” ์ฝ”๋“œ๋ฅผ ๋ณ€์ˆ˜์ฒ˜๋Ÿผ ์ €์žฅํ•˜๊ณ  ์ „๋‹ฌํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ์ ์—์„œ ๊ฐ•๋ ฅํ•œ ๊ธฐ๋Šฅ์„ ๊ฐ€์งˆ ์ˆ˜ ์žˆ์–ด!
ํŠนํžˆ, ์ฝœ๋ฐฑ(callback) ํ•จ์ˆ˜๋กœ ๋งŽ์ด ์‚ฌ์šฉ๋ผ.

๐Ÿ“ ์˜ˆ์ œ: ํด๋กœ์ €๋ฅผ ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ์ „๋‹ฌํ•˜๊ธฐ

func executeClosure(action: () -> Void) { 
	action() 
} 

executeClosure(action: { print("ํด๋กœ์ € ์‹คํ–‰!") }) // ์ถœ๋ ฅ: "ํด๋กœ์ € ์‹คํ–‰!"

โœ” ์„ค๋ช…

  • executeClosure(action:) ๐Ÿ‘‰ ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ํด๋กœ์ €๋ฅผ ๋ฐ›๋Š” ํ•จ์ˆ˜
  • () -> Void ๐Ÿ‘‰ ๋งค๊ฐœ๋ณ€์ˆ˜๊ฐ€ ์—†๊ณ , ๋ฐ˜ํ™˜๊ฐ’๋„ ์—†๋Š” ํ˜•ํƒœ์˜ ํด๋กœ์ €๋ฅผ ๋ฐ›์Œ
  • action() ๐Ÿ‘‰ ์ „๋‹ฌ๋ฐ›์€ ํด๋กœ์ €๋ฅผ ์‹คํ–‰
  • executeClosure(action: { print("ํด๋กœ์ € ์‹คํ–‰!") }) ๐Ÿ‘‰ ์‹คํ–‰ํ•˜๋ฉด "ํด๋กœ์ € ์‹คํ–‰!"์ด ์ถœ๋ ฅ๋จ

โžก๏ธ ์ฆ‰, ํด๋กœ์ €๋Š” ๋‹ค๋ฅธ ํ•จ์ˆ˜์— "์ฝ”๋“œ ๋ธ”๋ก"์„ ๋„˜๊ฒจ์ฃผ๋Š” ์šฉ๋„๋กœ๋„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์–ด!


๐Ÿ“Œ 4๏ธโƒฃ ํด๋กœ์ €๋ฅผ ๋” ์งง๊ฒŒ ์“ฐ๋Š” ๋ฐฉ๋ฒ• (ํ›„ํ–‰ ํด๋กœ์ €)

Swift์—์„œ๋Š” ํด๋กœ์ €๋ฅผ ๊ฐ„๋‹จํ•˜๊ฒŒ ์ค„์—ฌ ์“ธ ์ˆ˜ ์žˆ๋Š” ๋ฌธ๋ฒ•์ด ์žˆ์–ด!

executeClosure { 
	print("๋” ์งง์€ ํด๋กœ์ €!") 
}
executeClosure { print("๋” ์งง์€ ํด๋กœ์ €!") }

โžก๏ธ **"ํ›„ํ–‰ ํด๋กœ์ €(Trailing Closure)"**๋ผ๊ณ  ํ•ด์„œ, ํ•จ์ˆ˜์˜ ๋งˆ์ง€๋ง‰ ๋งค๊ฐœ๋ณ€์ˆ˜๊ฐ€ ํด๋กœ์ €๋ผ๋ฉด,
๊ด„ํ˜ธ () ๋ฐ–์—์„œ {}๋ฅผ ์‚ฌ์šฉํ•ด ๋” ๊ฐ„๊ฒฐํ•˜๊ฒŒ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ์–ด!


๐Ÿ“Œ ๐Ÿš€ ์ •๋ฆฌ: ํด๋กœ์ €(Closure)๋ž€?

1๏ธโƒฃ ํด๋กœ์ €๋Š” "์ด๋ฆ„ ์—†๋Š” ํ•จ์ˆ˜" ๊ฐ™์€ ์ฝ”๋“œ ๋ธ”๋ก์ด์•ผ!
2๏ธโƒฃ ๋ณ€์ˆ˜์— ์ €์žฅํ•ด์„œ ๋‚˜์ค‘์— ์‹คํ–‰ํ•  ์ˆ˜๋„ ์žˆ์–ด!
3๏ธโƒฃ ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ์ „๋‹ฌํ•ด์„œ, ํŠน์ • ์ฝ”๋“œ ์‹คํ–‰์„ ๋ฏธ๋ฆฌ ์ •ํ•  ์ˆ˜๋„ ์žˆ์–ด!
4๏ธโƒฃ ์ฝœ๋ฐฑ(callback) ํ•จ์ˆ˜๋กœ ์ž์ฃผ ์‚ฌ์šฉ๋ผ!
5๏ธโƒฃ ํ›„ํ–‰ ํด๋กœ์ € ๋ฌธ๋ฒ•์„ ์‚ฌ์šฉํ•˜๋ฉด ๋” ์งง๊ฒŒ ์“ธ ์ˆ˜ ์žˆ์–ด!

 

 

 

 

728x90