allen
@allen
Students
7,512
Reviews
736
Course Rating
5.0
iOS๊ฐ๋ฐ์ ์จ๋ฐ์
๋๋ค.
https://www.youtube.com/@allen_ios
"์ ํํ๊ฒ ์๋ ์ง์์, ์ฝ๊ฒ ์์ ์ ๋ง๋ก ์ค๋ช ํ ์ ์์ด์ผ ํ๋ค."๊ฐ ์ ๋ชจํ ์ ๋๋ค.
๊ทธ๋ ๊ธฐ์ ์ ๊ฐ ๊ณต๋ถํ๋ฉด์ ๊ฒช์๋ ์ํ์ฐฉ์ค๋ฅผ ์ฝ๊ฒ ํ์ด๋ด์ด
๋๊ตฌ๋ ์ดํดํ ์ ์๋ ์ธ์ด๋ก ์ง์์ ๊ณต์ ํ ์์๋ ๊ฐ๋ฐ์๊ฐ ๋๊ณ ์ถ์ต๋๋ค.
์ ๋ ์ฌ์ด ์ฃผ์ ๋ก ๋น ๋ฅธ ์๊ฐ ์์ ๊ฒํฅ๊ธฐ ์์ผ๋ก ์ฝ๊ฒ๋ง ๊ฐ๋ฅด์น๋ ๊ฐ์๋ฅผ ๋ง๋๋ ๊ฒ์๋ ๊ด์ฌ์ด ์์ต๋๋ค.
๊ทธ๋ฐ ๊ฐ์๋ ์ผ๋ง๋ ์ง ๋น ๋ฅด๊ฒ ์ฐ์ด๋ด๋ฏ ๋ง๋ค ์ ์๊ฒ ์ง๋ง, ๊ฒฐ๊ตญ "์ข์ ๊ฐ๋ฐ์๋ก ์ฑ์ฅ"ํ๋ ๊ฒ์ ๊ทธ๋งํผ ์ด๋ก ์ ์ธ ๊ธฐ๋ฐ์ ๋ฐ๊ฑฐ๋ฆ์ด ํํํด์ผ ํ๋ค๊ณ ๋ฏฟ๊ณ ์๊ธฐ ๋๋ฌธ์
๋๋ค.
์ฌ์ด ๊ฐ์๋ณด๋ค๋, ์ข์ ๊ฐ๋ฐ์(๋์์์ด ์ฑ์ฅํ ์ ์๋ ๊ฐ๋ฐ์)๊ฐ ๋๊ธฐ ์ํด
๋ฐ๋์ ์์์ผ ํ๋ ์ด๋ ค์ด ๋ด์ฉ๊น์ง๋ฅผ ์ต๋ํ ์ฝ๊ฒ, ๊ทธ๋ฆฌ๊ณ ์ง๊ด์ ์ผ๋ก ์๋ ค๋๋ฆฌ๋ ๊ฒ.
๊ทธ๋์ ์ ๊ฐ ์๋ ์ฌ๋ฌ๋ถ ์ค์ค๋ก WHY(์)๋ฅผ ๊ณ ๋ฏผ/์๊ฐํ ์ ์๋ ๋ฐ๊ฑฐ๋ฆ์ ๋ง๋ค์ด ๋๋ฆฌ๋ ๊ฒ์ ์ ์ ๊ฐ์ ๋ชฉํ๋ก ์ผ๊ณ ์์ต๋๋ค.
์ ์ค์ค๋ก๋ ๋ด์ผ์ ๋ ์ข์ ๊ฐ๋ฐ์๊ฐ ๋์๊ณ ๋
ธ๋ ฅํ๋ ๋งํผ
์ ๊ฐ ๊ณ ๋ฏผ ํ๋ ๋ด์ฉ๋ค์ ๊น์ด์๊ฒ ์ ๋ฌ ๋๋ฆฌ๊ณ ์ถ์ต๋๋ค.
๋ฉด์ ์์ ์๊พธ ๋จ์ด์ง๊ฑฐ๋, ์ฌ์ด ๋ด์ฉ๋ ์์ ์ ์ธ์ด๋ก ์ ํํํ์ง ๋ชปํ๊ฒ ๋ค๋ ๊ฒ์ ์ ํํ๊ฒ ์๊ณ ์์ง ์๋ค๋ ์๋ฏธ๋ผ๊ณ ๋ ์๊ฐํฉ๋๋ค. ์คํ๋ ค ๊ธฐ๋ณธ์ ์ธ ๋ด์ฉ, CS์ ๋ํด "ํํํ ๊ธฐ๋ณธ๊ธฐ"๊ฐ ์์ด์ผ, ๋น ๋ฅด๊ฒ ์ฑ์ฅ ๊ฐ๋ฅํ๋ค๊ณ ๋ฏฟ์ต๋๋ค.
๐๐ป๋ฌธ์๋ ์๋์ ์ด๋ฉ์ผ๋ก ์ฃผ์๋ฉด ๋ฉ๋๋ค.
we.love.code.allen@gmail.com
์ธ์ด: Swift(์ค์ํํธ), Python, Java, C#
Courses
Reviews
- # Alan Swift Concurrency for Swift 6 (Part-1)
whitejh
ยท
[Understanding with pictures] The most intuitive understanding of the concepts of sync and async[Understanding with pictures] The most intuitive understanding of the concepts of sync and async- Alan Swift Grammar Master School (Online BootCamp - 2 Month Course)
- Alan iOS Concurrency - Understanding Dispatch Queues and Operation Queues
- # Alan Swift Concurrency for Swift 6 (Part-1)
Posts
Q&A
Actor์์ Task vs Task.detached ์ฌ์ฉ ์ ์ฌ์ง์ ๋ฌธ์ ์ง๋ฌธ
๋ค ์๋ ํ์ธ์! ์ง๋ฌธ ๋ด์ฉ์ ๋ํด, 2๊ฐ์ง ํฌ์ธํธ๋ฅผ ๋ง์๋๋ฆด ์ ์์ ๊ฒ ๊ฐ์๋ฐ์.(1) ์ฌ๊ธฐ์ ์ด๋ ๊ฒ Task.detached๋ก ๊ตฌํ๋๋ ๊ทธ๋ฅ Task๋ก ๊ตฌํ๋๋, ์ ํ ์๊ด์์ด downloadImage ํจ์ ์์ฒด๋ ์กํฐ๊ฐ ์๋ ์ธ๋ถ ์ฐ๋ ๋์์ ์คํ๋๊ฒ ๋ฉ๋๋ค.let task = Task.detached { let image = try await downloadImage(from: url) return image }let task = Task { let image = try await downloadImage(from: url) return image }์กฐ๊ธ ์์ํ์ค ์๋ ์์ง๋ง, ์ ๊ทธ๋ฐ์ง ์ค๋ช ๋๋ฆฌ๋ฉด.. Task๋ก ๊ตฌํํ์๋ฉด actor์ context๋ฅผ ์์๋ฐ๋ ๊ฒ์ ๋ง์ง๋ง, ์ค์ downloadImage(from: url) ํจ์ ์์ฒด๊ฐ ์กํฐ ๋ด๋ถ์ ๋ฉ์๋๊ฐ ์๋ ์ธ๋ถ์ ๋ฉ์๋์ด๊ณ , ํด๋น ํจ์๋ฅผ ํธ์ถํ๋ฉด์, ์์ await ์ด๋ผ๋ ํค์๋๊ฐ ๋ถ์ด์๋ค๋ ๊ฒ์ด, ๊ฒฐ๊ตญ์ ๋์ ์ฐ๋ ๋๊ฐ ์๋ ์ธ๋ถ์ ์ฐ๋ ๋๋ฅผ ์ฌ์ฉํ๋ค๋ ์๋ฏธ๋ผ๊ณ ๋ณด์๋ฉด ๋ฉ๋๋ค.(์ฝ๊ฒ ํ๋ง๋๋ก ์ ๋ฆฌํด์ ๋ง์๋๋ฆฌ๋ฉด, ๋น๋๊ธฐ ๋ฉ์๋(ํจ์)๋ก ๊ตฌํ๋์ด ์์ผ๋ฉด, (์กํฐ์์ ํธ์ถํ๋๋ผ๋) ์กํฐ๊ฐ ์๋ ์ธ๋ถ ์ฐ๋ ๋์์ ๋์ํฉ๋๋ค.)๊ทธ๋์, ์ฌ์ค Task ๋ Task.detached๋ ๊ตฌํํ๊ณ , ์ค์ ๋์ํ๋ ๊ฒ์๋ ์ ํ ์ฐจ์ด๊ฐ ์์ง๋ง.. ์ฌ๊ธฐ์ Task.detached๋ฅผ ์ฌ์ฉํ๋ค๋ ๊ฒ์ "์ธ๋ถ ์ฐ๋ ๋์์ ์คํ๋๋ค๋ ์๋ฏธ๋ฅผ ์กฐ๊ธ ๋ ๋ช ํํ๊ฒ ํด์ฃผ๊ธฐ ์ํจ"์ด๋ผ๊ณ ๋ณด์๋ฉด ๋ ๊ฒ ๊ฐ์ต๋๋ค.(๋ค ๊ทธ๋์, ์์ ๋ด์ฉ์ ์ ํํ๊ฒ ์ดํดํ์๋ ๊ฒ์ด ๋จผ์ ์ค์ํ ๊ฒ ๊ฐ๊ณ ์.) (2) ๋ง์ฝ์, ์์ (1)๋ฒ ๋ด์ฉ์ด ์๋๋ผ๊ณ ๊ฐ์ ํ๊ณ , Task๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ด serial executor์์ ์คํ์ด ๋๋ค๊ณ ๊ฐ์ ์ ํด์ ๋ง์์ ๋๋ ค๋, ์ฌ์ง์ ๋ฌธ์ ๊ฐ ๋ฐ์ํ์ง ์์ต๋๋ค.let task = Task { let image = try await downloadImage(from: url) return image } /// ์ผ๋จ (์๋ฃ๋์ง ์์) ์์ ์ํ๋ฅผ ๋ณด๊ด cache[url] = .loading(task)์๋ํ๋ฉด, ๋ฐ๋ก ์๋์ ์๋ ์ฝ๋์ธ, cache[url] = .loading(task) ๋๋ฌธ์ ๊ทธ๋ ์ต๋๋ค. ์ฝ๊ฒ ๋ง์์ ๋๋ฆฌ๋ฉด ์์ ์ฝ๋๋ ๋ฐ๋ก ์๋์ ์ฝ๋์ ๋์ผํฉ๋๋ค. (Task ์์ ๋น๋๊ธฐ์ ์ธ ์์ ์ ์ ์ธํ๊ณ ์๊ฐํ์๋ฉด ์ฌ์์.)let task = Task{ } cache[url] = .loading(task)์์ ์ ์์ฑํ์๋ง์, ๋๊ธฐ์ ์ผ๋ก ์ผ๋จ cache์ ์ํ๋ฅผ .loading๋ผ๊ณ ์ ์ฅํด ๋์ต๋๋ค. ์์ ์์ฒด๋ฅผ ์์ฑํ์๋ง์ ์ ์ฅํด๋๋ (๋๊ธฐ์ ์ธ) ๋ฐฉ์์ด๊ธฐ ๋๋ฌธ์ (๋ฌผ๋ก ์์ ์์์๋ ๋น๋๊ธฐ์ ์ธ ์ผ์ด ์ผ์ด๋์ง๋ง..) ์ผ๋จ ์บ์ ์์ฒด๋ฅผ ๋ฐ๊ฟ๋์๊ธฐ ๋๋ฌธ์ await์ ํตํด ์ธ๋ถ์์ ์ ๊ทผํ๋๋ผ๋ ์ฌ์ง์ ๋ฌธ์ ๊ฐ ๋ฐ์ํ์ง ์์ต๋๋ค.(๊ทธ๋์, "์์ (Task)"์์ฒด๋ฅผ ์์ฑํ๊ณ ์ ์ฅํ๋(์ค๊ฐ์ awaitํค์๋๊ฐ ์ ํ ๋ค์ด๊ฐ์ง ์๋) ๋๊ธฐ์ ์ธ ๋ฐฉ์์ผ๋ก ์ฌ์ง์ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ ๊ฒ์ด๋ผ๊ณ ๋ณด์๋ฉด ๋ฉ๋๋ค.) ์์ ๋ด์ฉ๋ค์ ์ ์ดํดํด ๋ณด์๋ฉด ์ข์ ๊ฒ ๊ฐ๊ณ , ์ถ๊ฐ์ ์ผ๋ก ์ง๋ฌธ์ด ์๊ธฐ์๋ฉด ๋ ์ง๋ฌธ์ฃผ์ธ์!๊ฐ์ฌํฉ๋๋ค. :)
- 0
- 2
- 37
Q&A
Task ํด๋ก์ ๋ด `non-Sendable` ๊ฐ ํ์ ์ ๊ทผ ์, ์บก์ฒ ๋ฆฌ์คํธ๊ฐ ์ ์๋ Task ์์์ ๋ฐ๋ฅธ ์ปดํ์ผ๋ฌ ์๋ฌ ์ฐจ์ด
์๋ ํ์ธ์! sujinnaljin ๋!์ง๋ฌธ์ฃผ์ ๋ด์ฉ์ดํ์ฌ ๊ฐ์์ 48๊ฐ ~ 52๊ฐ ๋ด์ฉํ๊ณ ๊ด๋ จ๋ ๋ด์ฉ์ธ๋ฐ, ์ด๋ฒ์ Xcode๊ฐ ์ ๋ฐ์ดํธ๊ฐ ๋๋ฉด์ ๋ด๋ถ ๋ฉ์ปค๋์ฆ์ด ์ด๋ฒ์ ์ ๋๋ก ๊ตฌํ์ด ๋์๋ ๋ณด๋ค์.(Region Based Isolation ๊ด๋ จ ๋ด์ฉ์ด์์, https://github.com/swiftlang/swift-evolution/blob/main/proposals/0414-region-based-isolation.md )๋ค์ ๊ฐ์์์ ๋ด์ฉ์ ์์ธํ ๋ค๋ฃจ๊ณ ์์ผ๋.. ๊ฐ์ ๋ด์ฉ์ ๋ณด์๋ฉด ๋๊ณ , ๊ทธ ์ ์ ์ต๋ํ ์ง๊ด์ ์ด๊ณ ๊ฐ๋จํ๊ฒ๋ง ๋ง์๋๋ ค๋ณด๋ฉด, ValueCounterํ์ ์ ๊ฐํ์ ์ด๊ธด ํ์ง๋ง, Task์ ํด๋ก์ ์์ฒด๋ ๋ณ์ ์ฃผ์๋ฅผ ์บก์ฒํด์ ์ฌ์ฉํ๊ธฐ ๋๋ฌธ์ valueCounter ๋ณ์ ์ฃผ์๊ฐ ํ๋ฒ ์ ๋ฌ(sending)์ด ๋์ด ๋ฒ๋ฆฌ๋ฉด, ๊ทธ ์ดํ์ ์ฝ๋์์๋ ์ฌ์ฉํ ์๊ฐ ์์ต๋๋ค. (๊ทธ๊ฒ Swift Concurrency์์ ์๋กญ๊ฒ ๋์ ํ Shared Mutable State๋ฅผ ๋ค๋ฃจ๊ธฐ ์ํ ๋ด๋ถ ๋ฉ์ปค๋์ฆ์ด๋ผ๊ณ ๋ณด์๋ฉด ๋ฉ๋๋ค.)(์ฆ, ์์ Task๋ฅผ "1๋ฒ Task"๋ผ๊ณ ์ด๋ฆ ๋ถ์ด๊ธฐ๋ก ํ๊ณ , ์๋ Task๋ฅผ "2๋ฒ Task"๋ผ๊ณ ์ด๋ฆ ๋ถ์ด๊ธฐ๋ก ํ๋ฉด.. ์ด๋ฏธ 1๋ฒ Task์์ valueCounter๋ฅผ ์ฐจ์งํ๊ณ ์จ๋ฒ๋ฆฌ๊ธฐ๋ก ๋ ๊ฒ์ด๊ธฐ ๋๋ฌธ์ 2๋ฒ Task์์๋ ๋์ด์ valueCounter์ ๋ณ์์ ์กฐ์ฐจ ์ ๊ทผํ ์ ์์ด์ง ๊ฒ์ ๋๋ค.)func test() { var valueCounter = ValueCounter() โ Task {// valueCounter์ ์ฃผ์๊ฐ Task ๋ด๋ถ๋ก ์์ ์ ๋ฌ (๋์ด์ ์๋ ์ฝ๋์์ ์ฌ์ฉ ๋ถ๊ฐ) print(valueCounter.increment()) print(valueCounter.value) } Task { [valueCounter] in // valueCounter ์ฃผ์์ ์ ๊ทผ ๋ถ๊ฐ var newValueCounter = valueCounter print(newValueCounter.increment()) print(newValueCounter.value) } }๋ค๋ง, Task์ ์บก์ฒ๋ฆฌ์คํธ ์์๊ฐ ๋ฐ๋๋ฉด ๊ฐ๋ฅํ ๊ฒ์ ๋๋ค. ์๋๋ฉด ์ด๋ฒ์๋ ์บก์ฒ๋ฆฌ์คํธ๋ฅผ ๋จผ์ ์ฌ์ฉํ๊ธฐ ๋๋ฌธ์, valueCounter๋ณ์์ ์ฃผ์๊ฐ Task ๋ด๋ถ๋ก ์์ ์ ๋ฌ(sending)์ด ๋ ๊ฒ์ด ์๋๊ธฐ ๋๋ฌธ์.. ๊ทธ ์ดํ์ ์ฝ๋์ธ Task์์ valueCounter ๋ณ์์ ์ ๊ทผ์ด ๊ฐ๋ฅํ ๊ฒ์ ๋๋ค.func test() { var valueCounter = ValueCounter() โ Task { [valueCounter] in // valueCounter ์ฃผ์๊ฐ ์์ ์ ๋ฌ์ด ๋ ๊ฒ์ด ์๋ var newValueCounter = valueCounter print(newValueCounter.increment()) print(newValueCounter.value) } Task {// valueCounter ์ฃผ์์ ์ ๊ทผ ๊ฐ๋ฅ print(valueCounter.increment()) print(valueCounter.value) } } ๋ค, ๊ทธ๋์ ์์ ๊ฐ์ ๋ด์ฉ์ ํ์ธํ์๋ฉด ๋ ๊ฒ ๊ฐ๊ณ ..๊ฐ์ ํ๋ฐ๋ถ 48๊ฐ ~ 52๊ฐ ๋ด์ฉ๊ณผ sendingํค์๋ ๋ด์ฉ๊น์ง๋ฅผ ์ ๋ณด์๋ฉด ์ง๋ฌธ ์ฃผ์ จ๋ ๋ด์ฉ์ ๋ํด ๋ช ํํ๊ฒ ์ดํดํ์ค ์ ์์ผ์ค ๊ฒ ๊ฐ์ต๋๋ค.(์ ๊ฐ ๊ฐ์ ์ดฌ์ ๋น์์๋.. ์ปดํ์ผ๋ฌ ๋ด๋ถ์ sendingํค์๋ ๊ด๋ จ ๋ถ๋ถ์ด ์๋ง ์ ํํ๊ฒ ๊ตฌํ์ด ์๋์ด ์์ด ํฌ๋์๊ฐ ๋์ง ์์๋๋ฐ, ์ ํํ๊ฒ ๋ง์๋๋ฆฌ๋ฉด ํด๋น 12๊ฐ ๊ฐ์ ๋ด์ฉ ์ค์ ์บก์ฒ๋ฆฌ์คํธ ๋ถ๋ถ์ ๋ํด ์ค๋ช ๋๋ฆฌ๋ ๋ด์ฉ์ ์ ํํ๊ฒ ์ปดํ์ผ๋ฌ ์ ๋ฐ์ดํธ๊ฐ ๋๊ธฐ ์ ๋ด์ฉ์ด๋ผ, ์ ๋๋ก ๋์ํ๊ณ ์์ง ์์ ๊ฒ์ผ๋ก ๋ณด์๋ฉด ๋ ๊ฒ ๊ฐ์ต๋๋ค. ์ฆ, ์ง๊ธ ์ค๋ช ๋๋ฆฐ ๋ด์ฉ์ด Evolution๋ฌธ์์ ์ ํํ๊ฒ ์ผ์นํ๊ฒ ์ปดํ์ผ๋ฌ๊ฐ ์ ๋ฐ์ดํธ ๋ ๋ด์ฉ์ด๋ผ๊ณ ๋ณด์๋ฉด ๋ฉ๋๋ค.) ๋ง์๋๋ฆฐ ๊ฐ์ ํ๋ฐ๋ถ ๋ด์ฉ ํ์ธํด๋ณด์๊ณ ๋ ์ดํด๊ฐ ์๋์๋ ๋ถ๋ถ์ด ์์ผ์๋ฉด ๋ค์ ์ง๋ฌธ์ฃผ์ธ์ ! ๊ฐ์ฌํฉ๋๋ค. :)
- 0
- 1
- 63
Q&A
18๊ฐ NSCache ์์ ์ง๋ฌธ
๋ค, sujinnaljin ๋์ฒซ๋ฒ์งธ ์ง๋ฌธ)์, ๋ค๋ค ๋จ์ ์์๋ผ์ ์ ๊ฐ ๊ผผ๊ผผํ๊ฒ ์์ฑํ์ง๋ ์์์๋ค์! ๋ง์ํ์ ๋๋ก ์ ํํ๊ฒ ์์ฑํ์ ๋ค๋ฉด.. ์๋์ ๊ฐ์ ํํ๋ก ์์ฑํ์๋ ๊ฒ์ด ๋น์ฐํ ๋ง์ต๋๋ค. (์ญ์ ๋ ๋์ ๋๋ฆฌ์ ์ ๊ทผํ๋ ๊ฒ์ด๋๊น์.)func clearAll() { lock.lock() cache.removeAll() lock.unlock() } ๋๋ฒ์งธ ์ง๋ฌธ)์ ๋ค, NSCache ์์ฒด๋ ๋ด๋ถ์ ์ผ๋ก ์ผ๋จ Thread-safeํ๊ธฐ ๋๋ฌธ์ @unchecked Sendable ๋ง ์ฌ์ฉํ์ ๋ ๋ฉ๋๋ค. (์๋์ ๊ฐ์ ์ฒ๋ฆฌ๋ฅผ ์ํด๋ ๋๋ค๋ ๊ฒ์ด๊ฒ ์ฃ .)func setValue(_ value: Value, for key: Key) { semaphore.wait() cache[key] = value semaphore.signal() }func setValue(_ value: Value, for key: Key) { lock.lock() cache[key] = value lock.unlock() } ๊ทธ๋ฆฌ๊ณ .. ์ผ๋จ ๊ณต์๋ฌธ์์ Thread-safeํ๋ค๊ณ ๋์์์ผ๋, (์ ๋ผ๋ฉด) ์๋์ฒ๋ผ ๊ทธ๋ฅ ์ง์ ์ ์ผ๋ก ์ฌ์ฉํ ๊ฒ ๊ฐ๊ณ ..func setValue(_ value: Value, for key: Key) { cache[key] = value }๋ง์ฝ์ ๊ทธ ์ ์ (1) NSCache๋ฅผ ์ฌ์ฉํด๋ณธ ์ ์ด ์๊ฑฐ๋, (2) ๊ณต์๋ฌธ์๋ฅผ ๋ฏธ๋ฆฌ ํ์ธํ์ง ์์๋ค๋ ๊ฐ์ ์ ํด๋ณด๋ฉด, ๋น์ฐํ @unchecked Sendable + ์์ ํ๊ฒ ์(semaphore or lock)์ ๊ฐ์ ์ฒ๋ฆฌ๋ฅผ ์ฌ์ฉํ ๊ฒ ๊ฐ์ต๋๋ค. (๋ฌผ๋ก ์๋ฅผ ๋ค์ด, ์์ ๊ฐ์ ๋ฉ์๋ ๋ก์ง์์ NSCache๋ง ์ฌ์ฉํ๋ ๊ฒ์ด ์๋๋ผ, ๋ค๋ฅธ ๋์ ๋๋ฆฌ ๋ฑ๋ ์์ฑ์ผ๋ก ๊ฐ์ด ์ฒ๋ฆฌํด์ฃผ๋ ๋ฑ์ด ์๋ค๋ฉด, ์๋ฌด๋ฆฌ NSCache๋ฅผ ์ฌ์ฉํ๋ค๋๋ผ๋, semaphore ๋ lock ์ ์ฌ์ฉํด์ผ๊ฒ ์ง๋ง์.)๋ต๋ณ์ด ๋์ จ์ผ๋ฉด ์ข๊ฒ ์ต๋๋ค. :) ๊ฐ์ฌํฉ๋๋ค...!
- 0
- 2
- 51
Q&A
Task ์ default ์ฐ์ ์์ ๋ฌธ์ (utility vs medium)
๋ค, sujinnaljin ๋ ๊ฐ์ ๋ด์ฉ์์๋ ๋ง์๋๋ฆฌ๊ณ ์์ง๋ง.. ํฌ๊ฒ ์ค์ํ ๋ด์ฉ์ ์๋ ๊ฒ ๊ฐ์์.. ^^; ์ ๊ฐ ๊ตณ์ด ๋ค์ ์ฐพ์๋ณด์ง๋ ์์์๋ค์. Task ์ default ์ฐ์ ์์๊ฐ medium ์ธ ๊ฒ์ด ๋ง์ต๋๋ค. (์ ๊ฐ ์๊ธฐ๋ก๋ Swift๋ฒ์ ์ด ์ ๋ฐ์ดํธ ๋๋ฉด์ ์ค๊ฐ์ ๋ฐ๋ ๊ฒ ๊ฐ๋ค์. ์ด๋ฐ์ ์๋ฃ๋ฅผ ๋ง๋ค๊ธฐ ์์ํ ๋๋ utility ์๋ ๊ฒ์ผ๋ก ๊ธฐ์ตํ๊ณ ์์ด์์.) ๋ถํธ์ ๋๋ ธ๋ค๋ฉด ์ฃ์กํฉ๋๋ค. ๊ฐ์๋.. ์ ๋ฐ์ ์ธ ๋ด์ฉ ํฐํ์ ์ดํดํ์๋ ๋ฐ๋ ๋์์ด ๋์ค ์ ์์ผ๋, ์์ฃผ ๋ํ ์ผํ ๋ด์ฉ์์๋ ์ง์ ๊ณต์๋ฌธ์ ๋ฑ์ ํตํด์ ์ฐพ์๋ณด์ ๋ด์ฉ์ด ๋น์ฐํ ์ฐ์ ์ ๋๋ฆฌ๋ผ๊ณ ์๊ฐ๋ฉ๋๋ค. ๊ฐ์ฌํฉ๋๋ค :)
- 0
- 2
- 38
Q&A
18๊ฐ ์์ ์์ ์ ๋ฉํ๋ฐ์ดํฐ ์์ ๊ด๋ จ ๊ฐ์ ์๋ฃ ๋ฌธ์
์ ๋ค, ํฐ ์๋ฏธ๊ฐ ์๋ ๊ฒ์ ์๋๊ณ ๊ทธ๋ฅ ๋จ์ํ๊ฒ ๋๊ฐ์ง ์๋ฏธ ๋๋ฌธ์ ์ทจ์์ ์ผ๋ก ํ์ํด ๋์ ๊ฒ์ด๊ธฐ๋ ํ๋ฐ,"๋ฉํ๋ฐ์ดํฐ"๋ผ๋ ๊ฒ์๋ (1) ์ฒซ๋ฒ์งธ๋ก๋ ํ์ฌ ์คํ ์ค์ธ ์กํฐ๊ฐ ์์ ์๋ ์๊ณ ์๋ ์๋ ์์ด์ ์ทจ์์ ์ผ๋ก ํ์ํด๋์ ๊ฒ ์ ๋๋ค. ์ฆ, ๊ตฌ์กฐ์ ๋์์ฑ์ด ์กํฐ ๋ด๋ถ์์ ์คํํ๋ ๊ฒฝ์ฐ - ์กํฐ ์์ํ๊ฒ ๋๊ณ , ์กํฐ ๋ด๋ถ๊ฐ ์๋ ๊ณณ์์ ์คํํ๋ ๊ฒฝ์ฐ - ์์ํ ์กํฐ๊ฐ ์์ด์... ์์ํ ์กํฐ๊ฐ ์๋ ๊ฒฝ์ฐ/์๋ ๊ฒฝ์ฐ ๋๋ฌธ์ ๊ทธ๋ ์ต๋๋ค.(2) (๋ค๋ฅธ ์ธก๋ฉด์์๋) ๊ตฌ์กฐ์ ๋์์ฑ ์์ฒด๊ฐ ๋ณ๋ ฌ์ฒ๋ฆฌ๋ฅผ ๋ชฉ์ ์ผ๋ก ํ๋ ๊ฒ์ด๋ผ.. ๋ถ๋ชจ ์์ ์ ๊ฒฝ์ฐ๋ ์กํฐ์์ ์คํ๋ ์ ์์ง๋ง, ํ์(์์) ์์ ๋ค์ ๋ณ๋ ฌ๋ก ์ฒ๋ฆฌ๋์ด (์กํฐ์ ์๊ด์์ด) ์คํ๋๊ธฐ ๋๋ฌธ์ ๊ทธ๋ฐ ์๋ฏธ์์ ์ด์ง(?) ํ์๋ฅผ ํด๋ ๊ฒ์ด๊ธด ํฉ๋๋ค. ๊ฐ์ฌํฉ๋๋ค. :)
- 0
- 1
- 33
Q&A
withCheckedContinuation ์์ resume ํธ์ถ์ ์์ ์ฑ ๋ณด์ฅ ์ง๋ฌธ
์ ๋ค๋ค, sujinnaljin ๋.๊ฐ์ ๋ด์ฉ์ด ์๋ชป๋ ๊ฒ ๊ฐ๋ค์! ๊ณต์ ๋ฌธ์ ๋ด์ฉ์ ์ ๋ ๋ค์ ํ์ธํด๋ณด๋, ํด๋น ๋ถ๋ถ์ ๋ํ ๋ด์ฉ์ ์ ๊ฐ ์์ธํ๊ฒ ์ฒดํฌํ์ง ๋ชปํ ๋ถ๋ถ์ด ์๋ค์! ๋ง์ํ์ ๋ด์ฉ์ด ๋ง์ต๋๋ค ^^;(์๋ง ์ ๋ ์ด๋ฐ ํ์ต ํ ๋์ ๋ด์ฉ์ ๋ํด ์ถํ์ ์์ธํ๊ฒ ์ดํด๋ณด์ง ์์์ ๋๋ธ ์ฒดํฌ๋ฅผ ๋ชปํ๋ ๋ถ๋ถ์ด๋ค์.) ๊ฐ์ ๋ด์ฉ, ๊ต์ฌ ๋ด์ฉ๋ ์์ ํด ๋์์ผ ๊ฒ ๋ค์!์๋ ค์ฃผ์ ์ ๊ฐ์ฌํฉ๋๋ค :)
- 0
- 1
- 46
Q&A
์ฐธ๊ณ ์ฝ๋ ์๋ฃ 7-StructuredConcurrency(102, 103์ค) ์คํ?
์, ๋ค ๋ง๋ค์ใ ใ ์คํ๊ฐ ์์๋ค์! ๋ค A์ฝ๋์ ํํ๋ ์๋ชป๋์๊ณ , (์๋์ ๊ฐ์) ์ฌ์ฉํ์ B์ ํํ๊ฐ ์ ํํ ๋ง์ต๋๋ค.(์๋ฃ๋ ์์ ํด ๋๊ฒ ์ต๋๋ค.) /// ๊ตฌ์กฐ์ ๋์์ฑ ์์ ์ ์์ฑ (ํ์ ์์ ์ ์์ฑ) async let image1 = fetchImage(num: 1) async let image2 = fetchImage(num: 2)์ง๋ฌธ์ ์ ํํ ๋ต๋ณ์ ๋๋ฆฌ๊ณ ์ถ์ง๋ง..์ ์๊ฐ์๋ ์๋ชป๋ ์ฝ๋๋ฅผ ๋ถ์ํ๋ค๋๊ฒ ํฌ๊ฒ ์๋ฏธ๊ฐ ์์ ๊ฒ ๊ฐ์ต๋๋ค..ใ ใ ์ด์ฐจํผ A์ฝ๋์ ๊ฐ์ ํํ๋ก ์ฌ์ฉํ๋ ๊ฒ์ด ์๋๋ผ, ์๋ชป๋ ์ฝ๋์ผ๋ฟ์ธ ๊ฒ์ด์ฃ . (์๋ชป๋ ์ฝ๋์ธ๋ฐ, ์์ฒด์ ์ผ๋ก ์ปดํ์ผ๋ฌ๊ฐ ์ค๋ฅ๋ฅผ ์ก์์ฃผ์ง ์๋ ๊ฒ์ผ๋ฟ์ด๋ผ๊ณ ๋ณด์๋ฉด ๋ ๊ฒ ๊ฐ์ต๋๋ค.) ๊ทธ๋ฅ ๋จ์ํ, ์ง์ง ์ ๊ฐ์ธ์ ์ธ ๋ํผ์ ๋ก๋ ๋ด๋ถ์ ์ผ๋ก B์ฝ๋์ ์์ ํ ๋์ผํ๊ฒ ๋์ํ ๊ฒ ๊ฐ๊ธดํฉ๋๋ค. /// ๊ตฌ์กฐ์ ๋์์ฑ ์์ ์ ์์ฑ (ํ์ ์์ ์ ์์ฑ) async let image1 = try await fetchImage(num: 1) async let image2 = try await fetchImage(num: 2)์๋๋ฉด, ์์ ๊ฐ์ ์ฝ๋์์ ์ปดํ์ผ ๋ ๋, ์ผ์ชฝ์ ์ฝ๋์ธ.. async let์ ์ฝ๋๋ฅผ ๋จผ์ ์ปดํ์ผ ์ํฌ ๊ฒ์ด๊ธฐ ๋๋ฌธ์, ์ค์ async let image1 ์ฝ๋์์ ์ผ๋จ ๋น๋๊ธฐ ํจ์๋ฅผ ํธ์ถ ์ํค๊ณ ๋ค์ ์ค์ ์ฝ๋๋ก ๋์ด๊ฐ๋ ๋์์ผ๋ก async let image2๋ฅผ ์ปดํ์ผ ์ํฌ ๊ฒ ๊ฐ์ต๋๋ค.(๋ค๋ง, ์ธก์ ํ์ ์๊ฐ์ด ๋ค๋ฅด๊ฒ ๋์จ ์ด์ ๋ ์ ๋ง ๋จ์ํ๊ฒ ํ๋ ์ด๊ทธ๋ผ์ด๋ ์คํ ํ๊ฒฝ์ ๋ฌธ์ ์ด์ง ์์๊น ์ถ์ต๋๋ค. ์๋ฐฑ๋ฒ์ ์คํ์ ํด๋ณด๋ฉด ์ผ์ถ ๋น์ทํ๊ฒ ๋์ฌ ๊ฒ ๊ฐ์ต๋๋ค.) ์ฝ๋ ๋ด์ฉ์ ์ฃผ์ ๊น๊ฒ ๋ด์ฃผ์ ์ ๊ฐ์ฌํฉ๋๋ค. :)
- 0
- 3
- 43
Q&A
๊ธฐ์ด ์ฑ 4๊ฐ Type Any -> UIButton
๋ค ๊ธฐ์ฐ ๋.๋ํ ์ผํ๊ฒ ์ ์ด์ฃผ์ ์ ๊ฐ์ฌํฉ๋๋ค ๐ Anyํ์ ์ ์ถ์์ ์ธ ํ์ ์ด๊ธฐ ๋๋ฌธ์, ๋ง์ฝ ๊ตฌ์ฒด์ ์ธ ํ์ ์ธ UIButton์ผ๋ก ์ง์ ์ง์ ํด์ ์ฌ์ฉํ์ง ์๋ ๊ฒฝ์ฐ๋ ํ์ ์บ์คํ ์ ํด์ UIButton๋ค์ ์์ฑ์ ์ ๊ทผํ ์ ์๊ณ ,์ง์ UIButton์ ์ค์ ํ๋ ๊ฒฝ์ฐ, ๊ตณ์ด ํ์ ์บ์คํ ์ ํ์ง ์์๋ ๋๋.. ์กฐ๊ธ ๋ ํธํ๊ฒ ์ฌ์ฉํ์ค ์ ์์ต๋๋ค. :)
- 0
- 2
- 41
Q&A
3๊ฐ ์ค๋ ๋ ์ ์ด๊ถ ๊ด๋ฆฌ ์ง๋ฌธ๋๋ฆฝ๋๋ค
๋ค ์๋ ํ์ธ์ ๋ฏธ๋ฝ ๋!1. ๋ค ๋ง์ต๋๋ค. ์ฌ๊ฐ(resume)๋ฅผ ํ๊ฒ ๋๋ฉด, ์๋ณดํ๋ ์ฐ๋ ๋ ์ ์ด๊ถ์ ๋ค์ ๋๋ ค๋ฐ์ ์ผ์ฒ๋ฆฌ๋ฅผ ํ๊ฒ ๋ฉ๋๋ค. (์ฐ๋ ๋ ์ ์ด๊ถ์ด๋ ๊ฒ์, "์ง๊ธ ์คํ๋๋ ํจ์"๊ฐ ๊ฐ์ง๊ณ ์์ ์ ๋ฐ์ ์๋ค๊ณ ๋ณด์๋ฉด ๋ฉ๋๋ค. ์๋๋ฉด.. ์ฐ๋ ๋ ์ ์ด๊ถ์ ์ฝ๊ฒ ๋งํ์๋ฉด, "CPU๋ฅผ ๋ด๊ฐ ์ฐจ์งํ๊ณ ์ฌ์ฉํ ๊ป"์ ๊ทธ ๋ด๋ถ ์ปจํธ๋กค์ ๊ด๋ฆฌํ๋ ๊ฐ๋ ์ด๊ธฐ ๋๋ฌธ์ ๋๋ค. ๊ทธ๋ฌ๋๊น, ์ฌ๊ธฐ์ func2๋ ๋ค์ ์ฐ๋ ๋ ์ ์ด๊ถ์ ๋๋ ค๋ฐ์์, ํจ์๋ฅผ ์ฌ๊ฐ์ํจ ๊ฒ์ด๋ค๋ผ๋ ์๋ฏธ๋ก ์ค๋ช ๋๋ฆฌ๊ณ ์๋ ๊ฒ์ ๋๋ค.)2. ๋ค ๋ง์ต๋๋ค. func1์์ func2๋ฅผ ํธ์ถํ ์ํฉ์ด๋ผ๊ณ ๊ฐ์ ํ๊ณ ์ค๋ช ๋๋ ธ๊ณ , (func2๊ฐ CPU๋ฅผ ์ฐจ์งํ๊ณ ์ฌ์ฉํ๋ค๊ฐ) func2๊ฐ ์ผ์ฒ๋ฆฌ๊ฐ ๋ค ๋๋์ ๋ฆฌํดํ๊ฒ ๋๋ฉด ("func1์, ์ด์ CPU ๋๊ฐ ์ฐจ์งํ๊ณ ์ฌ์ฉํด๋ ๋ผ"..์ด๋ฐ ๊ฒ์ฒ๋ผ) ์ฐ๋ ๋ ์ ์ด๊ถ์ ์ด์ func1์ ๋๊ธฐ๊ฒ ๋ฉ๋๋ค.3. ๋ค ๋ง์ต๋๋ค. func1 (Caller)์์ func2 (Callee)๋ฅผ ํธ์ถํ๊ฒ ๋๋ฉด, func1์ด ๊ฐ์ง๊ณ ์๋ ์ฐ๋ ๋ ์ ์ด๊ถ์ func2์๊ฒ ๋๊ฒผ๋ค๊ฐ ์คํ์ด ๋ค ๋๋๋ฉด func1์ด ๋๋ ค๋ฐ๊ฒ ๋๋๋ฐ, ์ด ๊ฐ๋ ์ GCD๋ Swift Concurrency๋ ๋์ผํฉ๋๋ค. ๋ค๋ง, ์ฐจ์ด๋.. GCD์์๋ (func2์ ์ฅ์์ ๋ณด๋ฉด) func2๋ ์ฐ๋ ๋ ์ ์ด๊ถ์ ์ด์์ฒด์ ์๊ฒ ์๋ณดํ ์ ์๋ ๊ฐ๋ ์ด ์๋๋ฐ, (๊ทธ๋์ func2๋ ํ๋ฒ ์ผ์ ์์ํ๋ฉด ๋ฌด์กฐ๊ฑด ๋๋ ๋๊น์ง ๋์ํ ์ ๋ฐ์ ์๋๋ฐ)Swift Concurrency๋ func2๊ฐ ์ด์์ฒด์ ์๊ฒ ์ ๊น ์ฐ๋ ๋ ์ ์ด๊ถ์ ์๋ณดํด์, (์ค๊ฐ์) ์ด์์ฒด์ ๊ฐ ๋ค๋ฅธ ์ผ์ฒ๋ฆฌ๋ฅผ ํด๋ ๋ ์ ์๊ฒ ๋๋ ๊ฐ๋ ์ ๋๋ค. (์ด์์ฒด์ ๋ ๊ทธ ์๋ณด ๋ฐ์ ์ฐ๋ ๋ ์ ์ด๊ถ์ ๋ ๋ค๋ฅธ ์ด๋ค ํจ์์๊ฒ ์ ๊น ๋น๋ ค์ค์ ์ผ์ ์ํค๊ฒ ์ฃ .)4๊ฐ์์ ๋ฉ๋ชจ๋ฆฌ ๊ตฌ์กฐ์ ์ผ๋ก ์ด๋ป๊ฒ ํจ์๊ฐ ์ ๊น ๋ฉ์ท๋ค๊ฐ ์คํ๋ ์ ์๋์ง์ ๋ด์ฉ์ ์ฐธ๊ณ ํ์ ์ ์๊ฐํด ๋ณด์๋ฉด ๋ง์ ๋์์ด ๋์ค๊บผ์์! ์ดํด๊ฐ ์๋์๋ ๋ถ๋ถ์ด ์์ผ์๋ฉด ์ถ๊ฐ์ ์ผ๋ก ์ง๋ฌธ์ฃผ์ธ์ :) ๊ฐ์ฌํฉ๋๋ค. :)
- 0
- 1
- 53
Q&A
10๋ฒ ๊ฐ์ ๊ด๋ จํ์ฌ ์ง๋ฌธ๋๋ฆฝ๋๋ค.
๋ค ์๋ ํ์ธ์ ๊ฐ๋ฐ์ ๋. ๋ค ๋ง์ต๋๋ค. ์๋ฐํ๊ฒ ๋ฐ์ ธ๋ณด๋ฉด, ๊ฐ๋ฐ์ ๋์ด ๋ง์ํ์ ๊ฒ ๋ง์ต๋๋ค. ์ ๊ต์ฌ 29 ํ์ด์ง์๋ ๋ณด์๋ฉด, ํจ์๊ฐ ์ฌ๊ฐ๊ฐ ๋ ๋๋ ๋ค๋ฅธ ์ฐ๋ ๋์์ ์ฌ๊ฐ๊ฐ ๋ ์ ์๋ค๊ณ ๊ทธ๋ฆผ๊น์ง ๊ทธ๋ ค์ ์ค๋ช ๋๋ฆฌ๊ณ ์๊ธฐ๋ ํ๊ณ ์. ๋ค๋ง, ์ฌ๊ธฐ์ ๊ทธ๋ ๊ฒ ์ค๋ช ๋๋ฆฌ๋ฉด, ์ดํดํ ์ ์์ ์ ๋๋ก ์์ฒญ ๋ณต์กํด ์ง์ง ์์๊น์? ๊ทธ๋์ ํด๋น ์ค๋ช ๋๋ฆฌ๊ณ ์๋ ๋ถ๋ถ์์๋ Task ์์ฒด๊ฐ ํน์ ํ ์ฐ๋ ๋์์๋ง ์คํ๋๋ค๊ณ ๊ฐ์ ์ ํด์ผ, ์ด๋ก ์ ์ผ๋ก ์ดํดํ๋ ์ธก๋ฉด์์ ํจ์ฌ "์ง๊ด์ ์ผ๋ก" ์ดํด๊ฐ ์ฌ์์ง๊ธฐ ๋๋ฌธ์, ๊ทธ๋ ๊ฒ ๊ฐ์ ํ๊ณ ๋ง์๋๋ฆฌ๊ณ ์๋ ๋ถ๋ถ์ด๋.. ๊ฐ์ ๋ด์ฉ์์ ๊ทธ๋ฐ ๋ถ๋ถ์ ์ฐธ๊ณ ๋ถํ๋๋ฆฝ๋๋ค. (์ค์ ๋ก๋ ๋ค๋ฅธ ์ฐ๋ ๋์์ ์ฌ๊ฐ(resume)๋์ด ์คํ๋ ์ ์๋ค๋ ๋ถ๋ถ์ ๋น์ฐํ ์์ ๋ค๋ (์ ๋ถ๋ถ์ ๊ฐ์ ๋ด์ฉ์ ๋ค ์ดํดํ์๊ณ ์๋ค๋) ๊ฐ์ ํ์ ์ต๋ํ ์ง๊ด์ ์ธ ์ค๋ช ์ ์ํ ๊ฐ์ ์ผ ๋ฟ์ ๋๋ค.) ๊ฐ์ฌํฉ๋๋ค. :)
- 0
- 2
- 51






![Thumbnail image of the [Understanding with pictures] The most intuitive understanding of the concepts of sync and async](https://cdn.inflearn.com/public/courses/324755/course_cover/ac23c8f7-6fc7-457f-874b-e2bff8ec0d50/infinf.png?w=148)

