๐Ÿ’ป ๊ฐœ๋ฐœ์ฐจ๊ธฐ ๐Ÿฅ‹ feat.Android

์•ˆ๋“œ๋กœ์ด๋“œ์—์„œ ์ฝ”๋ฃจํ‹ด / Coroutine ์จ๋ด…์‹œ๋‹ค - 0 ๋ณธ๋ฌธ

์นดํ…Œ๊ณ ๋ฆฌ ์—†์Œ

์•ˆ๋“œ๋กœ์ด๋“œ์—์„œ ์ฝ”๋ฃจํ‹ด / Coroutine ์จ๋ด…์‹œ๋‹ค - 0

Android_DevKick 2023. 4. 24. 18:02

์ฝ”๋ฃจํ‹ด์ด๋ž€!

๋œป : ์ฝ”๋ฃจํ‹ด(Coroutine)์€ Co- Routine์˜ ํ•ฉ์„ฑ์–ด์ธ๋ฐ

Co(์ž˜ ๋ชฐ๋ผ์„œ ์˜๋ฌธ์‚ฌ์ „ ๋งํฌ๋ฅผ ๋“ค๊ณ ์™”๋‹ค) - ํ˜‘๋™, ํ˜‘๋ ฅ, ํ•จ๊ป˜

 

co-

1. together; with: 2. abbreviation for company (= business): 3. written…

dictionary.cambridge.org

Routine - ์ผ๊ณผ ํ˜น์€ ๋ฐ˜๋ณต์ ์ธ ์ž‘์—…(์šฐ๋ฆฌ๊ฐ€ ํ”ํžˆ ์“ฐ๋Š” ํ•จ์ˆ˜๋กœ ์ƒ๊ฐํ•ด๋„ ๊ดœ์ฐฎ๋‹ค)์ด๋ž€ ๋œป์œผ๋กœ ๋งŒ๋“ค์–ด์ง„ ๋‹จ์–ด๋กœ, ์˜์—ญํ•ด "ํ˜‘๋™ ๋ฃจํ‹ด", "ํ˜‘๋™ ํ•จ์ˆ˜"๋กœ ํ‘œํ˜„ํ•˜๊ธฐ๋„ ํ•ฉ๋‹ˆ๋‹ค.

์ด๋ ‡๊ฒŒ Coroutine์˜ ๋œป์„ ๊ธฐ์–ตํ•˜๋Š”๊ฒŒ ์˜ค๋ž˜ ๊ธฐ์–ต์ด ๋‚จ์„ ๊ฒƒ ๊ฐ™๋‹ค.

ํ˜‘๋™ ๋ฃจํ‹ด, ์ฆ‰ Coroutine์„ ํ™œ์šฉํ•ด์„œ ๋ญ˜ ํ•˜๋Š” ๊ฒƒ์ด๋ƒ ๋ผ๊ณ  ํ•˜๋ฉด RxJava๋ผ๋˜๊ฐ€ ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ๋ผ๋˜๊ฐ€ ์•„๋‹˜ ๋‚˜์ค‘์— ์„œ๋ฒ„ํ˜ธ์ถœ์„ ๊ธฐ๋‹ค๋ ธ๋‹ค๊ฐ€ ํ˜ธ์ถœ์ด ์™„๋ฃŒ๋˜๋ฉด ๊ทธ๋•Œ ์‹คํ–‰ํ•˜๋Š” ๋ฌด์–ธ๊ฐ€... ์ด๋Ÿฐ์‹์œผ๋กœ ๋“ค์–ด๋ณธ ๊ฒƒ์ด ํ•˜๋‚˜๋ผ๋„ ์žˆ์„ ๊ฒƒ์ด๋‹ค.

 

์œ„ ๋ณผ๋“œ์ฒ˜๋ฆฌ ๋œ ๋‹จ์–ด๋ฅผ ์‚ฌ์šฉํ•ด๋ณด์ž๋ฉด ์•ˆ๋“œ๋กœ์ด๋“œ์—์„œ ๊ณต์‹ ์–ธ์–ด๋ฅผ Java -> Kotlin์œผ๋กœ ๋ณ€๊ฒฝํ•˜๋ฉด์„œ ๊นƒํ—™์— ์•ˆ๋“œ๋กœ์ด๋“œ์˜ ๋Œ€ํ‘œ์ ์ธ ์ƒ˜ํ”Œ ์˜ˆ์ œ๋“ค์ธ bluprint๐Ÿซ์™€ sunflower๐ŸŒป ์•ฑ์˜ ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ๋ฅผ RxJava์—์„œ Coroutine์œผ๋กœ ๋ฐ”๊ฟ” ๋†“์€ ์ƒํƒœ์ด๋‹ค.

 

๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ์™€ RxJava๋ฅผ ๊ฐ„๋‹จํ•˜๊ฒŒ ์„ค๋ช…ํ•˜์ž๋ฉด

 

๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ : ๋‚ด๊ฐ€ ์˜ค๋Š˜ ํ•ด์•ผํ•  ์ผ์ด ์žˆ๋‹ค๋ฉด ๊ทธ๊ฒƒ์ด ์™„๋ฃŒ๋  ๋•Œ๊นŒ์ง€ ๊ธฐ๋‹ค๋ฆฌ์ง€ ์•Š๊ณ  ๋‹ค๋ฅธ ์ผ์„ ์‹œ์ž‘ํ•˜๋Š” ๊ฒƒ๊ณผ ๋น„์Šทํ•˜๋‹ค. ์˜ˆ๋ฅผ๋“ค์–ด ์ปดํ“จํ„ฐ ๊ฒŒ์ž„์„ ํ•˜๋‹ค๊ฐ€ ์Œ์‹ ๋ฐฐ๋‹ฌ์ด ์™€์„œ ์ž ๊น ์Œ์‹์„ ๋ฐ›๊ณ  ๋‹ค์‹œ ๋Œ์•„์™€ ๊ฒŒ์ž„์„ ํ•˜๋Š” ๊ฒƒ๋„ ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ์™€ ๋Œ€์ž… ์‹œํ‚ฌ ์ˆ˜ ์žˆ๋‹ค.

RxJava : ์•ˆ๋“œ๋กœ์ด๋“œ์—์„œ ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ๋ฅผ ํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋„์™€์ฃผ๋Š” ReactiveX์‚ฌ์—์„œ ๊ฐœ๋ฐœํ•œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์ด๋‹ค.

์ฝ”๋ฃจํ‹ด์ด ํ•˜๋Š” ์ผ

์ฝ”๋ฃจํ‹ด์ด ๊ทธ๋ž˜์„œ ํ•˜๋Š” ์ผ์ด ๋ญ”๋ฐ?

ํ˜‘๋ ฅํ˜• ๋ฉ€ํ‹ฐ ํƒœ์Šคํ‚น / ๋™์‹œ์„ฑ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์ง€์› / ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ๋ฅผ ๋ณด๋‹ค ์‰ฝ๊ฒŒ

์œ„ 3๊ฐœ ์ค‘ ์ค‘์‹ฌ์œผ๋กœ ์žก์•„์•ผํ•  ๊ฐœ๋…์€ ์ฒซ ๋ฒˆ์งธ ํ˜‘๋ ฅํ˜• ๋ฉ€ํ‹ฐ ํƒœ์Šคํ‚น์ด๋‹ค. 

 

์œ„์— ์„ค๋ช…ํ–ˆ๋˜ ๊ฒƒ๊ณผ ๊ฐ™์ด ์ฝ”๋ฃจํ‹ด์€ Co์™€ Routine์˜ ํ•ฉ์„ฑ์–ด์ด๊ณ  ๋ฃจํ‹ด์€ ํ”ํžˆ ์šฐ๋ฆฌ๊ฐ€ ๋งํ•˜๋Š” ํ•จ์ˆ˜๋ผ๊ณ ๋„ ๋งํ•  ์ˆ˜ ์žˆ๋‹ค๊ณ  ํ–ˆ๋Š”๋ฐ

Routine์—๋Š” Main๊ณผ Sub์ด ์กด์žฌํ•œ๋‹ค. ์ด๋Ÿฐ ๋‹จ์–ด๊ฐ€ ์ƒ์†Œํ•˜๊ณ  ๋ญ์ง€ ํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ์šฐ๋ฆฌ๊ฐ€ ๋Š˜ ๋ณด๊ณ  ์ž‘์„ฑํ•˜๋˜ ์ฝ”๋“œ๋ผ๊ณ  ์ƒ๊ฐํ•˜๋ฉด ๋œ๋‹ค.

 

 

๋ณดํ†ต ์šฐ๋ฆฌ๊ฐ€ ์ƒ๊ฐํ•˜๋Š” ๋ฃจํ‹ด(ํ•จ์ˆ˜) ์ง„ํ–‰ ๋ฐฉ์‹์€ ์ง„ํ–‰์„ ํ•˜๊ณ  ๋ฆฌํ„ด์ด ๋  ๋•Œ๊นŒ์ง€ ๋‹ค๋ฅธ ์ž‘์—…์€ ์ง„ํ–‰์ด ๋˜์ง€ ์•Š๋Š”๋‹ค.

์œ„ ์‚ฌ์ง„์„ ๋ณด๋ฉด ๋ญ ๋‹น์—ฐํ•œ๊ฑฐ ์•„๋‹Œ๊ฐ€ ํ•˜๋Š”๋ฐ ์•„๋ž˜ ๋ฐฉ์‹์„ ๋ณด๋ฉด ์˜ค? ์ƒ๊ฐ์ด ๋“ค ์ˆ˜ ์žˆ๋‹ค.

์ฝ”๋ฃจํ‹ด์€ ํ•˜๋‚˜์˜ ์ฝ”๋ฃจํ‹ด ์•ˆ์—์„œ ์—ฌ๋Ÿฌ๊ฐœ์˜ ๋ฃจํ‹ด์ด ์ง„์ž… ํ›„ ํƒˆ์ถœํ•  ์ˆ˜ ์žˆ๋‹ค.

์ฝ”๋“œ๋ฅผ ํ•œ๋ฒˆ ์‚ดํŽด๋ณด์ž.

 

์•„๋ž˜์˜ ์ฝ”๋“œ๋“ค์€ ๊ทธ์ € ์ฝ”ํ‹€๋ฆฐ ํŒŒ์ผ์—์„œ ๋‹ค๋ค„๋ณธ ์ฝ”๋“œ๋“ค์ด๋‹ˆ ์‹ค์ œ๋กœ Activity๋‚˜ Fragment, ViewModel์—์„œ ์‚ฌ์šฉํ•  ๋•Œ๋Š” ๋‹ค๋ฅด๊ฒŒ ์‚ฌ์šฉ๋  ์ˆ˜ ์žˆ๋‹ค.

์ด๋ ‡๊ฒŒ 1์ดˆ, 2์ดˆ, 3์ดˆ ๋’ค์— log๊ฐ€ ์Œ“์ด๋Š” ํ•จ์ˆ˜๋“ค์„ ๋งŒ๋“ค์–ด๋†จ๋‹ค.

์—ฌ๊ธฐ์„œ suspend fun์œผ๋กœ ๋งŒ๋“  ์ด์œ ๋Š” ์ฝ”๋ฃจํ‹ด์„ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” suspend fun(์ผ์‹œ์ค‘๋‹จ์ด ๊ฐ€๋Šฅํ•œ ํ•จ์ˆ˜)๋ฅผ ๋ถ™์—ฌ์ค˜์•ผํ•œ๋‹ค.

 

์™ผ์ชฝ main ํ•จ์ˆ˜์—์„œ ์‹คํ–‰์‹œํ‚จ ํ•จ์ˆ˜์™€ ์ž‘์„ฑ๋œ ๋กœ๊ทธ๋ฅผ ํ™•์ธํ•ด๋ณด๋ฉด 

start -> run(top, bottom) -> launch start -> draw fuction -> launch end -> end

์ˆœ์œผ๋กœ ๋‚˜์˜จ๋‹ค.

๋˜ ํ•˜๋‚˜, ---drawHead๊ฐ€ 1์ดˆ์˜ ๋”œ๋ ˆ์ด ํ›„ ๋กœ๊ทธ์— ์ฐํžˆ๊ณ  ๋‚œ ํ›„ 2์ดˆ๋ฅผ ๋” ๊ธฐ๋‹ค๋ฆฌ๊ณ  ---drawBody ๋กœ๊ทธ๊ฐ€ ์ฐํ˜”๋‹ค.

๊ทธ๋ ‡๋‹ค๋ฉด launch {} ์•ˆ์—์„œ๋Š” ๋”œ๋ ˆ์ด๋ฅผ ๊ณต์œ ํ•˜๊ณ  ์ˆœ์„œ๋Œ€๋กœ ์ง„ํ–‰ํ•œ๋‹ค๊ณ  ๋ณผ ์ˆ˜ ์žˆ๋‹ค.

์ฝ”๋ฃจํ‹ด์„ ์‚ฌ์šฉํ•  ๋•Œ runBlocking ํ•จ์ˆ˜์—์„œ ์‹คํ–‰ํ•ด์•ผํ•˜๊ณ  launch ์•ˆ์—์„œ ํ•˜๋‚˜์˜ ์ฝ”๋ฃจํ‹ด์ด ์ƒ์„ฑ์ด ๋œ๋‹ค

runBlocking -> ์ฝ”๋ฃจํ‹ด์„ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๋Š” ์žฅ์†Œ

launch -> ํ•˜๋‚˜์˜ ์ฝ”๋ฃจํ‹ด

 

์ด์ œ ๋‹ค๋ฅธ ๋ฐฉ์‹์˜ ์ฝ”๋ฃจํ‹ด ์ฒ˜๋ฆฌ๋ฅผ ๋ด๋ณด์ž.

์ด๋ฒˆ์—” ์™ผ์ชฝ์ฒ˜๋Ÿผ launch๋ฅผ ๋ชจ๋‘ ๋‚˜๋ˆ  ๋กœ๊ทธ๋ฅผ ์ฐ์–ด๋ดค๋‹ค.

gif๋กœ ๋ณ€ํ™˜ํ•˜๋ฉด์„œ ์†๋„๊ฐ€ ๋А๋ ค์กŒ์ง€๋งŒ ---drawHead๊ฐ€ ์ฐํžˆ๊ณ ๋‚˜์„œ 1์ดˆ ๋’ค์— ---drawBody๊ฐ€ ์ฐํžˆ๋Š” ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ์—ˆ๋‹ค.

launch head, body, foot๋“ค๋„ ํ•œ ๋ฒˆ์— ๋กœ๊ทธ๊ฐ€ ์ฐํžˆ๋Š” ๊ฒƒ์„ ๋ณด๋ฉด ์œ„์—์„œ ์ˆœ์„œ๋Œ€๋กœ ์‹คํ–‰๋˜๊ธด ํ•˜์ง€๋งŒ ๊ฐ๊ธฐ ๋‹ค๋ฅธ ์ฝ”๋ฃจํ‹ด์œผ๋กœ ์กด์žฌํ•˜๋Š” ๊ฒƒ์„ ํ™•์ธ ํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋˜์—ˆ๋‹ค.

 

์ด๋Ÿฐ์‹์œผ๋กœ ์—ฌ๋Ÿฌ๊ฐœ์˜ ์“ฐ๋ ˆ๋“œ๋ฅผ ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ๋‹ค.

์˜ˆ๋ฅผ ๋“ค๋ฉด ์—ฌ๋Ÿฌ๊ฐœ์˜ ๊ฐ€์Šค๋ ˆ์ธ์ง€์— ๋ผ๋ฉด๋„ ๋“์ด๊ณ  ๋‹ฌ๊ฑ€๋„ ์‚ถ๊ณ  ์‚ผ๊ฒน์‚ด๋„ ๊ตฝ๊ณ  ๊ทธ ์˜†์—์„œ ๋‚˜๋Š” ์„ค๊ฑฐ์ง€๋„ ํ•  ์ˆ˜ ์žˆ๋Š”๊ฒŒ ๊ฐ€๋Šฅํ•ด์ง„ ๊ฒƒ์ด๋‹ค.

 

๋‹ค์Œ ๊ธ€์—์„œ ์ฝ”๋ฃจํ‹ด์„ ์ง์ ‘์ ์œผ๋กœ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์ž‘์„ฑํ•˜๋„๋ก ํ•˜๊ฒ ๋‹ค.

 

์ฐธ์กฐ.

 

์ฝ”ํ‹€๋ฆฐ ์ฝ”๋ฃจํ‹ด(coroutine) ๊ฐœ๋… ์ตํžˆ๊ธฐ · ์พŒ๋ฝ์ฝ”๋”ฉ

์ฝ”ํ‹€๋ฆฐ ์ฝ”๋ฃจํ‹ด(coroutine) ๊ฐœ๋… ์ตํžˆ๊ธฐ 25 Aug 2019 | coroutine study ์•ž์„œ ์ฝ”๋ฃจํ‹ด์„ ์ดํ•ดํ•˜๊ธฐ ์œ„ํ•œ ๋‘ ๋ฒˆ์˜ ๋ฐœ์•…์ด ์žˆ์—ˆ์ง€๋งŒ, ์ด๋ฒˆ์—๋Š” ๋” ์›๋ก ์ ์ธ ์ฝ”๋ฃจํ‹ด์— ๋Œ€ํ•ด์„œ ์•Œ์•„๋ณด๋ ค ํ•œ๋‹ค. ์ฝ”๋ฃจํ‹ด์˜ ๊ฐœ๋…์ด ์ •ํ™•

wooooooak.github.io