Search

[WWDC] Meet Swift Async Algorithms

๐ŸŽ

๋“ค์–ด๊ฐ€๋ฉฐ

Swift๋Š” ๊ณ„์† ์„ฑ์žฅ ์ค‘์ธ ์˜คํ”ˆ ์†Œ์Šค ํŒจํ‚ค์ง€ ์นดํƒˆ๋กœ๊ทธ์ž…๋‹ˆ๋‹ค.
๐Ÿง”๐Ÿปโ€โ™‚๏ธย : ์ด ํŒจํ‚ค์ง€๋Š” Swift Collections & Swift Algorithms์™€ ๊ฐ™์€ ๋‹ค๋ฅธ ํŒจํ‚ค์ง€๋“ค๊ณผ ์œ ์‚ฌํ•ฉ๋‹ˆ๋‹ค. AsyncSequence ํ”„๋กœํ† ์ฝœ์„ ์‚ฌ์šฉํ•ด ์‹œ๊ฐ„์— ๋”ฐ๋ผ ๊ฐ’์„ ์ฒ˜๋ฆฌํ•˜๋Š” ์ผ๋ จ์˜ ์•Œ๊ณ ๋ฆฌ์ฆ˜์ธ๋ฐ์š”.
๋ณธ๋ก ์œผ๋กœ ๋“ค์–ด๊ฐ€๊ธฐ ์ „์— AsyncSequence ํ”„๋กœํ† ์ฝœ์„ ํ•œ ๋ฒˆ ์ƒ๊ธฐํ•ด ๋ด…์‹œ๋‹ค.

AsyncSequence Recap

AsyncSequence ํ”„๋กœํ† ์ฝœ์€ ๋น„๋™๊ธฐ ์ƒ์„ฑ๊ฐ’์„ ๊ธฐ์ˆ ํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์คŒ
๐Ÿง”๐Ÿปโ€โ™‚๏ธย : Sequence์™€ ์œ ์‚ฌํ•˜๋‚˜ ๋‘ ๊ฐ€์ง€ ์ฐจ์ด์ ์ด ์žˆ์Šต๋‹ˆ๋‹ค.
๋ฐ˜๋ณต์ž ๋‹ค์Œ ํ•จ์ˆ˜(next function form its iterator)๋Š” Swift ๋™์‹œ์„ฑ์„ ์‚ฌ์šฉํ•ด ๊ฐ’์„ ์ „๋‹ฌํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋น„๋™๊ธฐ ํ•จ์ˆ˜์ž…๋‹ˆ๋‹ค.
โ€ข
Swift์˜ throw๋ฅผ ํ†ตํ•ด ์ž ์žฌ์ ์ธ ์žฅ์• ๋ฅผ ํ•ด๊ฒฐํ•ฉ๋‹ˆ๋‹ค.
โ€ข
Sequence์—์„œ์ฒ˜๋Ÿผ for-await-in ๊ตฌ๋ฌธ์œผ๋กœ ์ด๊ฑธ ๋ฐ˜๋ณตํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
for-await-in syntax
โ˜‘๏ธย ์ฆ‰, Sequence๋ฅผ ์‚ฌ์šฉํ•  ์ค„ ์•Œ๋ฉด AsyncSequence ์‚ฌ์šฉ์€ ์–ด๋ ต์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
AsyncSeqence๋ฅผ ๋„์ž…ํ•˜๋ฉด์„œ Sequence์—์„œ ์ฐพ์•„๋ณผ ์ˆ˜ ์žˆ๋Š” ๋ชจ๋“  ํˆด์„ ๋น„๋™๊ธฐ ๋ฒ„์ „์œผ๋กœ ์ถ”๊ฐ€ํ–ˆ์Šต๋‹ˆ๋‹ค.
โ–ถ๏ธย map, filter, reduce
๊ณ ๊ธ‰ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ํ†ตํ•ฉํ•˜๊ณ  ๊ฐ•๋ ฅํ•œ ๊ฑธ ์ œ๊ณตํ•˜๊ณ ์ž Clock์™€ ์ƒํ˜ธ ์šด์šฉ๋˜์ฃ . Swift ๋™์‹œ์„ฑ์„ ๋Š˜๋ฆฌ๋Š” AsyncSequence ์•Œ๊ณ ๋ฆฌ์ฆ˜์˜ ์˜คํ”ˆ ์†Œ์Šค ํŒจํ‚ค์ง€์ž…๋‹ˆ๋‹ค.
์ž‘๋…„ Swift Algorithm ํŒจํ‚ค์ง€๋ฅผ ์†Œ๊ฐœํ–ˆ๊ณ  ๊ทธ ์‚ฌ์šฉ ์‚ฌ๋ก€๋ฅผ ์ฆ๋ช…ํ•˜๊ณ ์ž ๋ฉ”์‹œ์ง• ์•ฑ์„ ๋งŒ๋“ค์—ˆ์Šต๋‹ˆ๋‹ค.
๐Ÿง”๐Ÿปโ€โ™‚๏ธย : ์šฐ๋ฆฌ๋Š” Swift ๋™์‹œ์„ฑ์„ ํ†ตํ•ด ์•ฑ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ ๊ธฐํšŒ๊ฐ€ ๋งŽ์ด ์ƒ๊ฒผ๋‹ค๊ณ  ํŒ๋‹จํ•˜์˜€์Šต๋‹ˆ๋‹ค. ๋น„๋™๊ธฐ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ๋ช‡ ๊ฐ€์ง€ ๋ณด์—ฌ๋“œ๋ฆฌ๊ธฐ ์œ„ํ•ด ์šฐ๋ฆฌ๊ฐ€ ์‚ฌ์šฉํ–ˆ๋˜ ๊ฒƒ๋“ค๊ณผ ์–ด๋–ป๊ฒŒ ์‹คํ–‰๋˜๋Š”์ง€ ๋ณด์—ฌ๋“œ๋ฆฌ๋„๋ก ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

Multi-input algorithms

๋จผ์ €, ์šฐ๋ฆฌ์—๊ฒŒ๋Š” ๋‹ค์ค‘ ์ž…๋ ฅ AsyncSequence๋กœ ์ž‘๋™ํ•˜๋Š” ํŠน์ • ์•Œ๊ณ ๋ฆฌ์ฆ˜๋“ค์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ์•Œ๊ณ ๋ฆฌ์ฆ˜๋“ค์€ AsyncSequence๋ฅผ ๋‹ค์–‘ํ•œ ๋ฐฉ์‹์œผ๋กœ ๊ฒฐํ•ฉํ•˜๋Š”๋ฐ์š”.
๐Ÿง”๐Ÿปโ€โ™‚๏ธย : ํ•˜์ง€๋งŒ ํ•˜๋‚˜์˜ ๊ณตํ†ต์ ์€ AsyncSequence๊ฐ€ ๋‹ค์ค‘์œผ๋กœ ์ž…๋ ฅ๋˜์ง€๋งŒ ๋‹จ์ผ ์ถœ๋ ฅ๋œ๋‹ค๋Š” ์ ์ž…๋‹ˆ๋‹ค.
์ด ์•Œ๊ณ ๋ฆฌ์ฆ˜์€ ๊ฐ ๋ฒ ์ด์Šค์—์„œ ๊ฒฐ๊ณผ ํŠœํ”Œ์„ ์ƒ์„ฑํ•˜๊ธฐ ์œ„ํ•ด ๋‹ค์ค‘ ์ž…๋ ฅ์„ ์ทจํ•˜๊ณ  ๊ทธ๊ฒƒ์„ ๋ฐ˜๋ณตํ•ฉ๋‹ˆ๋‹ค.
โ€ข
์ž…๋ ฅ๋ฌผ ๊ฐ๊ฐ์€ Zip์ด ๊ตฌ์กฐ๋ฅผ ์ด๋ฃจ๊ณ  ์žˆ๋Š” ๋ฒ ์ด์Šค์ž…๋‹ˆ๋‹ค.
โ€ข
๋น„๋™๊ธฐ Zip ์•Œ๊ณ ๋ฆฌ์ฆ˜์€ ํ‘œ์ค€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์—์„œ Zip๊ณผ ์œ ์‚ฌํ•˜๊ฒŒ ์ž‘๋™ํ•˜๋‚˜, ๋™์‹œ์— ๋ฒ ์ด์Šค ๊ฐ๊ฐ์„ ๋ฐ˜๋ณตํ•˜๊ณ  ๋ฐ˜๋ณต ์‹œ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉด ๋‹ค์‹œ throw ํ•ฉ๋‹ˆ๋‹ค.
๋ฐ˜๋ณต๊ณผ ์˜ค๋ฅ˜ rethrow๋ฅผ ๋™์‹œ์— ํ•˜๋Š” ๊ฒƒ์€ ๋” ๋ณต์žกํ•ด์งˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
ํ•˜์ง€๋งŒ Swift Async Algorithm์€ ๋ฉ”์‹œ์ง• ์•ฑ์—์„œ ๊ทธ๊ฑธ ๋ชจ๋‘ ๋‹ค๋ฃฐ ์ˆ˜ ์žˆ์—ˆ์ฃ .
[Zip ์˜์ƒ]
ํšจ์œจ์ ์ธ ์ €์žฅ๊ณผ ์ „์†ก์„ ์œ„ํ•ด ์˜์ƒ์„ ๋‹ค์–‘ํ•œ ํฌ๊ธฐ๋กœ ํŠธ๋žœ์Šค์ฝ”๋”ฉํ•˜๋ฉด์„œ ๋น„๋™๊ธฐ ์กฐ์ •ํ•˜๋Š” ์ฝ”๋“œ๊ฐ€ ์ด์ „์—๋„ ์žˆ์—ˆ๋Š”๋ฐ์š”.
โ˜‘๏ธย  Zip์„ ํ†ตํ•ด ํŠธ๋žœ์Šค์ฝ”๋”ฉ ์˜์ƒ์„ ๋‹ค๋ฅธ ์„œ๋ฒ„๋กœ ์ „์†กํ•  ๋•Œ ๋ฏธ๋ฆฌ๋ณด๊ธฐ๋ฅผ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.
โ˜‘๏ธย  Zip์€ ๋™๊ธฐ์„ฑ์ด๋ผ ํŠธ๋žœ์Šค์ฝ”๋”ฉ์ด๋‚˜ ๋ฏธ๋ฆฌ ๋ณด๊ธฐ๊ฐ€ ๋‘˜ ๋‹ค ์ง€์—ฐ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
๐Ÿง”๐Ÿปโ€โ™‚๏ธย : ํ•˜์ง€๋งŒ ์—ฌ๊ธฐ์„œ ๋์ด ์•„๋‹™๋‹ˆ๋‹ค.
โ€ข
Zip ์ž์ฒด๊ฐ€ ์–ด๋–ค ์ชฝ์—์„œ ๋จผ์ € ๊ฐ’์„ ์ƒ์„ฑํ•˜๋Š”์ง€ ๋” ์„ ํ˜ธํ•˜๋Š” ๊ฒƒ์ด ์—†๊ธฐ ๋•Œ๋ฌธ์— ์˜์ƒ์ด๋‚˜ ๋ฏธ๋ฆฌ๋ณด๊ธฐ ๋‘˜ ์ค‘ ์•„๋ฌด๊ฑฐ๋‚˜ ๋จผ์ € ์ƒ์„ฑ๋˜๊ณ  ์–ด๋А ์ชฝ์ด๋“  ๊ฐ„์— ๋‹ค๋ฅธ ์ชฝ์ด ํŠœํ”Œ์„ ์™„๋ฃŒํ•  ๋•Œ๊นŒ์ง€ ๊ธฐ๋‹ค๋ฆด ๊ฒ๋‹ˆ๋‹ค.
โ€ข
Zip์€ ํŠœํ”Œ์„ ๊ตฌ์ถ•ํ•˜๊ธฐ ์œ„ํ•ด ์„œ๋กœ๋ฅผ ๊ธฐ๋‹ค๋ฆด ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ํ•จ๊ป˜ ์—…๋กœ๋“œ๋  ์ˆ˜ ์žˆ๋„๋ก ์ง์„ ๊ธฐ๋‹ค๋ฆด ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
์šฐ๋ฆฌ๋Š” ์ž…๋ ฅ ๋ฉ”์‹œ์ง€๋ฅผ AsyncSequence๋กœ ๋ชจ๋ธ๋งํ•˜๋Š” ๊ฒƒ์ด ๊ฝค ํƒ€๋‹นํ•  ๊ฒƒ์ด๋ผ๋Š” ๊ฒฐ๋ก ์„ ๋‚ด๋ ธ์Šต๋‹ˆ๋‹ค.
AsyncSequence๋Š” ๋ช…๋ น์„ ๋ณด์กดํ•˜์—ฌ ์ฝœ๋ฐฑ์„ ๋ฉ”์‹œ์ง€ ๋น„๋™๊ธฐ ์‹œํ€€์Šค๋กœ ๋ฐ”๊ฟ€ ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ๋ฉ”์‹œ์ง€ ์ฒ˜๋ฆฌ์— ๋น„๋™๊ธฐ ์ŠคํŠธ๋ฆผ์„ ์‚ฌ์šฉํ•˜๊ธฐ๋กœ ๊ฒฐ์ •ํ–ˆ์Šต๋‹ˆ๋‹ค.
๐Ÿง”๐Ÿปโ€โ™‚๏ธย : ์šฐ๋ฆฌ๊ฐ€ ์ฒ˜๋ฆฌํ•ด์•ผ ํ•  ๋ถ€๋ถ„ ์ค‘ ํ•˜๋‚˜๋Š” ๋‹ค์–‘ํ•œ ๊ณ„์ •์„ ์ง€์›ํ•ด์•ผ ํ•œ๋‹ค๋Š” ์ ์ด์—ˆ์Šต๋‹ˆ๋‹ค.
๊ฐ ๊ณ„์ •์—์„œ ์ž…๋ ฅ ๋ฉ”์‹œ์ง€์˜ AsyncSequence๋ฅผ ๋งŒ๋“ค์—ˆ์œผ๋‚˜ ๋ง‰์ƒ ๊ตฌํ˜„ํ•˜๋ ค๊ณ  ํ•˜๋‹ˆ ํ•˜๋‚˜์˜ AsyncSequence๋กœ ์ฒ˜๋ฆฌํ•ด์•ผ ํ–ˆ๊ฑฐ๋“ ์š”.
โ–ถ๏ธย ์ฆ‰, AsyncSequence ๋ณ‘ํ•ฉ ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด ํ•„์š”ํ–ˆ์Šต๋‹ˆ๋‹ค.
Merge ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด ๊ฐ–์ถฐ์ ธ ์žˆ๋Š”๋ฐ์š”.
โ€ข
์ด ์•Œ๊ณ ๋ฆฌ์ฆ˜์€ ๋‹ค์ค‘ AsyncSequence๋ฅผ ๋™์‹œ์— ๋ฐ˜๋ณตํ•œ๋‹ค๋Š” ์ ์—์„œ Zip๊ณผ ๋น„์Šทํ•˜๊ฒŒ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค.
โ€ข
ํ•˜์ง€๋งŒ ๋‹ค๋ฅธ ์ ์ด ์žˆ๋‹ค๋ฉด,
โ—ฆ
์ง์„ ์ด๋ฃจ๋Š” ํŠœํ”Œ ๋Œ€์‹  ๋ฒ ์ด์Šค๊ฐ€ ๋™์ผ ์š”์†Œ ํƒ€์ž…์„ ๊ณต์œ ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
โ—ฆ
๋ฒ ์ด์Šค AsyncSequence๋ฅผ ํ•ด๋‹น ์š”์†Œ์˜ ํŠน์ด AsyncSequence ํ•˜๋‚˜์— ๋ณ‘ํ•ฉํ•ฉ๋‹ˆ๋‹ค.
[Merge ์˜์ƒ]
๋ณ‘ํ•ฉ ์•Œ๊ณ ๋ฆฌ์ฆ˜์€ ๋ฐ˜๋ณต ์‹œ ํ•œ ์ชฝ ๊ณ„์ •์—์„œ ๋จผ์ € ์ƒ์„ฑ๋œ ์š”์†Œ๋ฅผ ์ทจํ•ฉ๋‹ˆ๋‹ค. ๋ชจ๋“  ๋ฒ ์ด์Šค AsyncSequence๊ฐ€ ๋ฐ˜๋ณต์ž์—์„œ ์•„๋ฌด๊ฒƒ๋„ ๋„์ถœํ•˜์ง€ ์•Š์„ ๋•Œ๊นŒ์ง€ ๋ฐ˜๋ณต์€ ๊ณ„์† ๋ฉ๋‹ˆ๋‹ค. ๋ฒ ์ด์Šค์—์„œ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค๋ฉด ๋‹ค๋ฅธ ๋ฐ˜๋ณต์€ ์ทจ์†Œ๋ฉ๋‹ˆ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด ๋ฉ”์‹œ์ง€๋ฅผ AsyncSequence๋ฅผ ์ทจํ•˜๊ณ  ๋ณ‘ํ•ฉํ•  ์ˆ˜ ์žˆ์ฃ . ์ด Merge ์•Œ๊ณ ๋ฆฌ์ฆ˜์€ ๊ฐ’ ์ƒ์„ฑ ์‹œ ๋™์‹œ์— ์ž‘๋™ํ•˜์ง€๋งŒ ๊ฐ„ํ˜น ์‹œ๊ฐ„๊ณผ ์ƒํ˜ธ ์ž‘์šฉํ•˜๋Š” ๊ฒŒ ์œ ์šฉํ•  ๋•Œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

Clock, instant, duration

์ด๋ฒˆ ํŒจํ‚ค์ง€๋Š” ํŠน์ • ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ๋„์ž…ํ•ด Swift ๋‚ด ์ƒˆ๋กœ์šด Clock API๋ฅผ ์ด์šฉํ•จ์œผ๋กœ์จ ์‹œ๊ฐ„๊ณผ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค. ์‹œ๊ฐ„ ๊ทธ ์ž์ฒด๋Š” ๊ต‰์žฅํžˆ ๋ณต์žกํ•œ ์ฃผ์ œ๋กœ Swift 5.7์˜ clock, instant, duration ํƒ€์ž…์€ ์‹œ๊ฐ„์„ ์•ˆ์ „ํ•˜๊ณ  ์ผ๊ด€๋˜๊ฒŒ ํ•˜๋Š” ์ผ๋ จ์˜ API์ž…๋‹ˆ๋‹ค.
Clock ํ”„๋กœํ† ์ฝœ์€ 2๊ฐœ์˜ ํ”„๋ฆฌ๋ฏธํ‹ฐ๋ธŒ๋ฅผ ์ •์˜ํ•ฉ๋‹ˆ๋‹ค.
๐Ÿง”๐Ÿปโ€โ™‚๏ธย : ์ฃผ์–ด์ง„ ์ˆœ๊ฐ„ ์ดํ›„ ์ผ์–ด๋‚˜๋Š” ๋ฐฉ๋ฒ•๊ณผ ์ง€๊ธˆ์ด๋ผ๋Š” ๊ฐœ๋…์„ ์ƒ์„ฑํ•˜๋Š” ๋ฐฉ๋ฒ•์„์š”.
Clock์—๋Š” ์—ฌ๋Ÿฌ ๊ฐ€์ง€ ๊ตฌ์กฐ๊ฐ€ ๋“ค์–ด๊ฐ€ ์žˆ๋Š”๋ฐ ํ”ํžˆ ์“ฐ์ด๋Š” ๊ตฌ์กฐ ์ค‘ ๋‘ ๊ฐ€์ง€๋Š” ๋ฐ”๋กœ continuous clock๊ณผ Suspending Clock์ž…๋‹ˆ๋‹ค.
continuous clock
์Šคํ†ฑ์›Œ์น˜์ฒ˜๋Ÿผ ์‹œ๊ฐ„ ์ธก์ • ์‹œ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•˜๋ฉฐ ์‚ฌ๋ฌผ ์ƒํƒœ ์ธก์ • ์—ฌ๋ถ€์™€๋Š” ์ƒ๊ด€์—†์ด ์‹œ๊ฐ„์€ ํ˜๋Ÿฌ ๊ฐ‘๋‹ˆ๋‹ค.
suspending clock
๋จธ์‹ ์ด ์ •์ง€ํ•˜๋ฉด ๋ฉˆ์ถ”์ฃ .
์šฐ๋ฆฌ๋Š” ๋ฐ๋“œ๋ผ์ธ ์ดํ›„ ๊ฒฝ๊ณ ๋ฅผ ๋ฌด์‹œํ•  ์ˆ˜ ์žˆ๋„๋ก ์•ฑ์—์„œ ์ƒˆ๋กœ์šด ์‹œ๊ณ„ API๋ฅผ ์‚ฌ์šฉํ•˜์˜€๋Š”๋ฐ์š”.
์ง€์—ฐํ•˜๊ณ ์ž ํ•˜๋Š” ์ดˆ๋ฅผ ๊ตฌ์ฒด์ ์œผ๋กœ ๊ฐ€๋ฆฌํ‚ค๋Š” duration ๊ฐ’์„ ์ถ”๊ฐ€ํ•ด ๋ฐ๋“œ๋ผ์ธ์„ ๋งŒ๋“ค ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.
์ž‘๋™ ์‹คํ–‰ ๊ฒฝ๊ณผ ์‹œ๊ฐ„์„ ์ธก์ •ํ•˜๋Š” ๋ฐฉ๋ฒ•๋„ ์žˆ๊ตฌ์š”.
๐Ÿง”๐Ÿปโ€โ™‚๏ธย : ์•„๋ž˜์—์„œ๋Š” ์ž ์žฌ์  ์ž‘์—… ๊ฒฝ๊ณผ ์‹œ๊ฐ„์˜ ์ธก์ • ๊ฒฐ๊ณผ๋ฅผ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค.
[์ธก์ • ๊ฒฐ๊ณผ ์˜์ƒ]
์ด ๋‘ ์‹œ๊ณ„์˜ ์ฃผ์š” ์ฐจ์ด์ ์€ ๋จธ์‹ ์ด ์ •์ง€ํ–ˆ์„ ๋•Œ์˜ ๋ฐ˜์‘์—์„œ ๋‚˜ํƒ€๋‚˜๋Š”๋ฐ์š”.
โ–ถ๏ธย ์‹คํ–‰์„ ์žฌ๊ฐœํ•˜๋ฉด ๋จธ์‹ ์ด ์ •์ง€๋˜์–ด ์žˆ๋Š” ๋™์•ˆ continuous clock์€ ๊ณ„์† ์ž‘๋™ํ•˜์ง€๋งŒ suspending clock์€ ๊ทธ๋ ‡์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
๋ณดํ†ต ์ด ์ฐจ์ด๋Š” ์ฃผ์š” ํŠน์ง•์ด ์‹คํ–‰ ์‹œ๊ฐ„์„ ์ค‘๋‹จํ•จ์œผ๋กœ์จ ์• ๋‹ˆ๋ฉ”์ด์…˜๊ณผ ๊ฐ™์€ ๊ฒƒ๋“ค์„ ์˜ˆ์ƒํ•œ๋Œ€๋กœ ์ž‘๋™ํ•˜๊ฒŒ ํ•˜๋Š” ์ฃผ์š” ์„ธ๋ถ€ ์‚ฌํ•ญ์ด ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
โ˜‘๏ธย ๋งŒ์•ฝ ์• ๋‹ˆ๋ฉ”์ด์…˜์ฒ˜๋Ÿผ ๋จธ์‹ ์ด ์‹œ๊ฐ„๊ณผ ์ƒํ˜ธ ์ž‘์šฉํ•ด์•ผ ํ•œ๋‹ค๋ฉด Suspending clock๋ฅผ ์‚ฌ์šฉํ•˜์„ธ์š”.
โ˜‘๏ธย ์‚ฌ๋žŒ๊ณผ ๊ด€๋ จ๋œ ํ…Œ์Šคํฌ๋ฅผ ์ธก์ •ํ•˜๋Š” ๊ฒƒ์ด๋ผ๋ฉด continuous clock์ด ์ ํ•ฉํ•ฉ๋‹ˆ๋‹ค.
โ–ถ๏ธย ์ฆ‰, ์ ˆ๋Œ€์  ์ง€์† ๊ตฌ๊ฐ„์— ๋”ฐ๋ผ ์ง€์—ฐ์‹œ์ผœ์•ผ ํ•˜๋Š” ์ธ๊ฐ„๊ณผ ๊ด€๋ จ๋œ ์ผ์—์„œ๋Š” ํ›„์ž๋ฅผ ์‚ฌ์šฉํ•˜์„ธ์š”.

Algorithms using time

์‹ ํ˜• ํŒจํ‚ค์ง€์—์„œ๋Š” ์‹œ๊ฐ„๊ณผ ๊ด€๋ จํ•˜์—ฌ ์ด๋ฒคํŠธ๊ฐ€ ์ „๊ฐœ๋˜๋Š” ๊ฐœ๋…๋“ค์„ ์ฒ˜๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด ์ด ํƒ€์ž…๋“ค์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.
๐Ÿง”๐Ÿปโ€โ™‚๏ธย : ์šฐ๋ฆฌ๋Š” ๋ฉ”์‹œ์ง• ์•ฑ์„ ํ†ตํ•ด ์ด๋ฒคํŠธ๋ฅผ ์ •ํ™•ํžˆ ํ†ต์ œํ•˜๊ธฐ ์œ„ํ•ด ์ด ํƒ€์ž…๋“ค์ด ๊ต‰์žฅํžˆ ๋„์›€๋œ๋‹ค๋Š” ์‚ฌ์‹ค์„ ๋ฐœ๊ฒฌํ–ˆ์Šต๋‹ˆ๋‹ค. ์ƒํ˜ธ ์ž‘์šฉ ์ œํ•œ ์‹œ๊ฐ„์„ ์ธก์ •ํ•ด ๋ฉ”์‹œ์ง€๋ฅผ ํšจ๊ณผ์ ์œผ๋กœ ๋ฒ„ํผ๋งํ–ˆ์ฃ .
์šฐ๋ฆฌ๊ฐ€ ๊ฐ€์žฅ ์‹œ๊ฐ„์„ ๋งŽ์ด ํ™œ์šฉํ•˜๋Š” ๋ถ„์•ผ๋Š” ๋ฉ”์‹œ์ง€ ๊ฒ€์ƒ‰ ์ž…๋‹ˆ๋‹ค.
์šฐ๋ฆฌ๋Š” ๊ฒฐ๊ณผ ์ฑ„๋„์„ ๊ด€๋ฆฌํ•˜๋Š” ์ปจํŠธ๋กค๋Ÿฌ๋ฅผ ๋งŒ๋“ค์—ˆ์ฃ . ์ด ์ฑ„๋„์€ ๊ฒ€์ƒ‰ ํ…Œ์Šคํฌ์—์„œ UI๋กœ ๊ฒ€์ƒ‰ ๊ฒฐ๊ณผ๋ฅผ ๋ชจ์๋‹ˆ๋‹ค. ๊ฒ€์ƒ‰ ํ…Œ์Šคํฌ ์ž์ฒด์—๋Š” ์‹œ๊ฐ„๊ณผ ๊ด€๋ จ๋œ ๊ตฌ์ฒด์ ์ธ ํŠน์„ฑ์ด ํ•„์š”ํ–ˆ์ฃ .
๐Ÿง”๐Ÿปโ€โ™‚๏ธย : ์„œ๋ฒ„์—์„œ ๋ฐœ์†ก๋œ ๋ฉ”์‹œ์ง€ ๊ฒ€์ƒ‰ ์ œํ•œ ์‹œ๊ฐ„์„ ์ธก์ •ํ•˜๋ ค ํ–ˆ์Šต๋‹ˆ๋‹ค.
Debounce ์•Œ๊ณ ๋ฆฌ์ฆ˜์€ ๋ฐ˜๋ณต ์‹œ ๋‹ค์Œ ๊ฐ’์„ ๋‚ด๊ธฐ ์ „ ์ •์ง€ ๊ธฐ๊ฐ„์„ ๋Œ€๊ธฐํ•ฉ๋‹ˆ๋‹ค.
๐Ÿง”๐Ÿปโ€โ™‚๏ธย : ์ด๋ฒคํŠธ๊ฐ€ ๋นจ๋ฆฌ ์˜ฌ ์ˆ˜๋„ ์žˆ์ง€๋งŒ ๊ฐ’์„ ์ฒ˜๋ฆฌํ•˜๊ธฐ ์ „์— ์ •์ง€ ๊ธฐ๊ฐ„ ๋™์•ˆ ๋Œ€๊ธฐํ•˜๊ณ ์ž ํ•œ๋‹ค๋Š” ๊ฑฐ์ฃ .
๊ฒ€์ƒ‰ ํ•„๋“œ์˜ ์œ ์ € ์ž…๋ ฅ์ด ๋น ๋ฅด๊ฒŒ ๋ฐ”๋€” ๋•Œ ์šฐ๋ฆฌ๋Š” ๊ฒ€์ƒ‰ ์ปจํŠธ๋กค๋Ÿฌ๊ฐ€ ๊ฐ ๋ณ€ํ™”์˜ ๊ฒ€์ƒ‰ ์š”์ฒญ์„ ๊ธ‰ํ•˜๊ฒŒ ํ•˜๊ธธ ์›์น˜ ์•Š์Šต๋‹ˆ๋‹ค. ๋Œ€์‹ ์— ํŠน์ • ํƒ€์ดํ•‘์ด ์™„๋ฃŒ๋˜๋ ค๊ณ  ํ•  ๋•Œ๊นŒ์ง€์˜ ์ •์ง€ ๊ธฐ๊ฐ„ ๋™์•ˆ ๋Œ€๊ธฐํ•˜๊ธธ ์›ํ•˜๋Š” ๊ฑฐ์ฃ .
Debounce ์•Œ๊ณ ๋ฆฌ์ฆ˜์€ ๊ธฐ๋ณธ์ ์œผ๋กœ Continuous Clock์„ ์‚ฌ์šฉํ•  ๊ฒ๋‹ˆ๋‹ค.
โ–ถ๏ธย ์ด ๊ฒฝ์šฐ ์•„๋ฌด ์ผ์ด ์ผ์–ด๋‚˜์ง€ ์•Š๋Š” ํŠน์ • ๊ธฐ๊ฐ„๋™์•ˆ ๋Œ€๊ธฐํ•˜๊ฒŒ ํ•  ์ˆ˜ ์žˆ๊ณ  ์ž…๋ ฅ์„ debouncingํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
๐Ÿง”๐Ÿปโ€โ™‚๏ธย : ์‹œ๊ฐ„๊ณผ ์ง€์† ๊ธฐ๊ฐ„์€ debounce๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ๋‹ค๋ฅธ ์•Œ๊ณ ๋ฆฌ์ฆ˜์—์„œ๋„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
๐Ÿง”๐Ÿปโ€โ™‚๏ธย : ์šฐ๋ฆฌ๊ฐ€ ์ •๋ง ์œ ์šฉํ•˜๋‹ค๊ณ  ๋ฐœ๊ฒฌํ•œ ๋ถ„์•ผ๋Š” ๋ฐ”๋กœ ๋Œ€๋Ÿ‰์˜ ๋ฉ”์‹œ์ง€๋ฅผ ์„œ๋ฒ„๋กœ ์ „์†กํ•˜๋Š” ๊ฒƒ์ด์—ˆ์Šต๋‹ˆ๋‹ค.
Swift ์•Œ๊ณ ๋ฆฌ์ฆ˜ ํŒจํ‚ค์ง€์—๋Š” ๊ฐ’์„ ๋‚˜๋ˆ„๋Š” ์ผ๋ จ์˜ ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด ์žˆ๋Š”๋ฐ์š”. Swift Async Algorithm ํŒจํ‚ค์ง€์—์„œ๋„ ์ด๋“ค์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ๋‹ค์–‘ํ•œ Clock ๋ฐ duration๊ณผ ์ƒํ˜ธ ์šด์šฉํ•˜๋Š” ๋ฒ„์ „๋“ค๋„ ์ถ”๊ฐ€๋˜์—ˆ์Œ์€ ๋ฌผ๋ก ์ด๊ณ ์š”.
ํŠน์ • Chunk ์•Œ๊ณ ๋ฆฌ์ฆ˜๋“ค์„ ํ†ตํ•ด ์นด์šดํŠธ, ์‹œ๊ฐ„, ์ฝ˜ํ…์ธ ์— ๋”ฐ๋ผ ํ†ต์ œ๊ฐ€ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.
*๋งŒ์•ฝ ์—ฌ๊ธฐ์„œ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉด ๋‹ค์‹œ throwํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์˜ค๋ฅ˜์™€ ๊ด€ํ•ด์„œ๋Š” ์•ˆ์ „ํ•œ ์ฝ”๋“œ์ž…๋‹ˆ๋‹ค.
[Chunk ์˜์ƒ]
์šฐ๋ฆฌ๋Š” ๋ฉ”์‹œ์ง€ ์ฒญํฌ๊ฐ€ ํŠน์ • ๊ฒฝ๊ณผ ์‹œ๊ฐ„๋งˆ๋‹ค ์ง๋ ฌํ™”๋˜์–ด ์ „์†ก๋  ์ˆ˜ ์žˆ๋„๋ก chunked(by:) API๋ฅผ ์‚ฌ์šฉํ–ˆ์Šต๋‹ˆ๋‹ค.
์ด ๋ฐฉ์‹์œผ๋กœ ํด๋ผ์ด์–ธํŠธ๊ฐ€ ๋ณด๋‚ธ ํšจ์œจ์ ์ธ ํŒจํ‚ค์ง€๋ฅผ ๋ฐ›์•˜์ฃ . ๋Œ€๋Ÿ‰ ๋ฉ”์‹œ์ง€๋ฅผ 50๋ฐ€๋ฆฌ์ดˆ๋งˆ๋‹ค ์ž…๋ ฅํ•  ๋•Œ๋„ ์ด API๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.
๐Ÿง”๐Ÿปโ€โ™‚๏ธย : ๋ˆ„๊ตฐ๊ฐ€ ์‹ ๋‚˜์„œ ๋„ˆ๋ฌด๋‚˜ ๋น ๋ฅด๊ฒŒ ์ž…๋ ฅํ•  ๋•Œ๋„ ์„œ๋ฒ„์— ์ „์†ก๋œ ์š”์ฒญ์ด ๋‚˜๋‰˜์–ด์กŒ์ฃ !!

Collections

์ปฌ๋ ‰์…˜์ด๋‚˜ ์‹œํ€€์Šค๋กœ ์ž‘์—…ํ•  ๋•Œ๋Š” ์š”์†Œ๋ฅผ ๊ฒŒ์œผ๋ฅด๊ฒŒ(lazy) ์ฒ˜๋ฆฌํ•˜๋Š” ๊ฒŒ ์œ ์šฉํ•˜๋ฉฐ ์ž˜ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค.
AsyncSequence๋Š” Swift ํ‘œ์ค€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์—์„œ ์ด๋Ÿฐ ์ž‘๋™ ๋ฐฉ์‹๊ณผ ์œ ์‚ฌํ•˜๊ฒŒ ์ž‘๋™ํ•˜์ฃ . ํ•˜์ง€๋งŒ lazy ์•Œ๊ณ ๋ฆฌ์ฆ˜์ฒ˜๋Ÿผ ์ข…์ข… ์ปฌ๋ ‰์…˜ ์„ธ๊ณ„๋กœ ๋Œ์•„๊ฐ€์•ผ ํ•  ๋•Œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.
์‹ ๊ทœ ํŒจํ‚ค์ง€๋Š” AsyncSequence๋กœ ์ปฌ๋ ‰์…˜์„ ๊ตฌ์ถ•ํ•˜๊ธฐ ์œ„ํ•œ ์ผ๋ จ์˜ ์ด๋‹ˆ์…œ๋ผ์ด์ €๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ์ด๋“ค์„ ํ†ตํ•ด ์œ ํ•œํ•˜๋‹ค๊ณ  ์•Œ๋ ค์ง„ AsyncSequence๋ฅผ ์ž…๋ ฅํ•˜์—ฌ Dictionary, Set, Array๋ฅผ ๊ตฌ์ถ•ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
๐Ÿง”๐Ÿปโ€โ™‚๏ธย : ์ปฌ๋ ‰์…˜ ์ด๋‹ˆ์…œ๋ผ์ด์ €๋Š” ๋ฐ”๋กœ ๋ฉ”์‹œ์ง€ ์ดˆ๊ธฐํ™”๋กœ ๋ณ€ํ™˜๋˜๊ณ  ๋ฐ์ดํ„ฐ ํƒ€์ž…์„ ๋ฐฐ์—ด๋กœ ์œ ์ง€ํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ค๋‹ˆ๋‹ค.
Swift ๋™๊ธฐ์„ฑ ์‚ฌ์šฉ์„ ์œ„ํ•ด ์ตœ์‹  ์ •๋ณด๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ํŠน์ƒ‰์ด ๋‹ค์–‘ํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— ๊ต‰์žฅํžˆ ๋„์›€์ด ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.
โ˜‘๏ธย ๊ธฐ์กด ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ๋ฅผ ์œ ์ง€ํ•จ์œผ๋กœ์จ ์•ฑ์˜ ์ผ๋ถ€๋ฅผ ์ ์ฐจ ํƒ€๋‹นํ•œ ๊ณณ์œผ๋กœ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ํ•  ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.
์ง€๊ธˆ๊นŒ์ง€ Swift Async Algorithm ํŒจํ‚ค์ง€์˜ ํ•˜์ด๋ผ์ดํŠธ ์ค‘ ๊ทน์†Œ์ˆ˜๋งŒ ๋ณด์—ฌ๋“œ๋ ธ๋Š”๋ฐ์š”.
์˜ค๋Š˜ ๋ณธ ๊ฒƒ๋ณด๋‹ค ํ›จ์”ฌ ๋” ๋งŽ์€ ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด ์žˆ์Šต๋‹ˆ๋‹ค.
๐Ÿง”๐Ÿปโ€โ™‚๏ธย : ๋‹ค์ค‘ AsyncSequence๋ฅผ ๊ฒฐํ•ฉํ•˜๋Š” ๊ฒƒ๋ถ€ํ„ฐ
๐Ÿง”๐Ÿปโ€โ™‚๏ธย : ์‹œ๊ฐ„์— ๋”ฐ๋ฅธ ์ œํ•œ์„ ์ธก์ •ํ•˜๊ณ 
๐Ÿง”๐Ÿปโ€โ™‚๏ธย : ๊ฐ’์„ ๋‚˜๋ˆ„๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜
๐Ÿง”๐Ÿปโ€โ™‚๏ธย : ๋ฒ„ํผ๋งํ•˜๊ณ 
๐Ÿง”๐Ÿปโ€โ™‚๏ธย : reduce ์•Œ๊ณ ๋ฆฌ์ฆ˜, join ์•Œ๊ณ ๋ฆฌ์ฆ˜๋ถ€ํ„ฐ injection ์•Œ๊ณ ๋ฆฌ์ฆ˜๊นŒ์ง€ ๋”์šฑ ๋‹ค์–‘ํ•ฉ๋‹ˆ๋‹ค.
Swift Async Algorithms ํŒจํ‚ค์ง€๋Š” ์‹œ๊ฐ„์— ๋”ฐ๋ผ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋„๋ก ์•Œ๊ณ ๋ฆฌ์ฆ˜ ์ง‘ํ•ฉ์„ ์‚ฌ์šฉํ•˜๊ณ  ์ด๋ฅผ ์•ฑ์— ๋„์›€์ด ๋  ์ˆ˜ ์žˆ๋Š” ๊ด‘๋ฒ”์œ„ํ•œ ๊ณ ๊ธ‰ ๊ธฐ๋Šฅ์œผ๋กœ ํ™•๋Œ€ํ•ฉ๋‹ˆ๋‹ค.
๐Ÿง”๐Ÿปโ€โ™‚๏ธย : ํ•œ ๋ฒˆ ์จ๋ณด์„ธ์š”!! ์ด ํŒจํ‚ค์ง€๋กœ ์—ฌ๋Ÿฌ๋ถ„๋“ค์ด ๋ฌด์—‡์„ ํ•˜๋ ค ํ•˜์‹ค์ง€ ๊ธฐ๋Œ€๋ฉ๋‹ˆ๋‹ค! ๊ทธ๋ฆฌ๊ณ  ๊ทธ๋Ÿฐ ์—ด์ •์€ ๊ณต์œ ๊ฐ€ ๋˜๋Š”๊ฑฐ์ฃ . ์ด ํŒจํ‚ค์ง€๋Š” ์—ฌ๋Ÿฌ๋ถ„๊ณผ ํ•จ๊ป˜ ๊ฐœ๋ฐœํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.๐ŸŽ‰