728x90
์ฝ๋ฃจํด(coroutine)
- ๋น๋๊ธฐ๋ก ์ฌ๋ฌ๊ฐ์ ๋ฃจํด์ ๋์์ ์ฒ๋ฆฌํ ์ ์๋ค.
- ๋ฉ์ธ ๋ฃจํด์ ๋ฐ๋ก๋๊ณ , ๋ณ๋๋ก ์งํ์ด ๊ฐ๋ฅํ ๋ฃจํด์ด๋ค.
- ๊ฐ๋ฐ์๊ฐ ์คํ, ์ข ๋ฃ๋ฅผ ๋ง์๋๋ก ์ ์ดํ ์ ์๋ค.
- ์ฝ๋ฃจํด์ ์ฌ์ฉํ๊ธฐ์ ์ต์๋จ์ "import kotlinx.coroutines.*" ์ ์จ์ค์ผํ๋ค.
์ฝ๋ฃจํด์ scope
- ์ ์ด๋ฒ์ ๋ฐ ์คํ ๋ฒ์๋ฅผ ์ง์ ํ ์ ์๋ค.
- GlobalScope์ CoroutineScope๋ก ๋๋๋ค.
- GlobalScope
- ํ๋ก๊ทธ๋จ ์ด๋์์๋ ์ ์ด์ ๋์์ด ๊ฐ๋ฅํ ์ฝ๋ฃจํด์ ๊ธฐ๋ณธ ๋ฒ์๋ค.
- CoroutineScope
- ํน์ ํ ๋ชฉ์ ์ Dispatcher๋ฅผ ์ง์ ํ์ฌ ์ ์ด ๋ฐ ๋์์ด ๊ฐ๋ฅํ ์๋ก์ด ์ฝ๋ฃจํด์ ๋ฒ์๋ค.
- CoroutineScope๋ฅผ ๋ง๋ค ๋ ์ ์ฉ ๊ฐ๋ฅํ Dispatcher๋ ์ธ๊ฐ์ง๊ฐ ์๋ค.
- Dispatchers.Default : ๊ธฐ๋ณธ์ ์ธ ๋ฐฑ๊ทธ๋ผ์ด๋ ๋์ํ๋ ๋์คํจ์ณ
- Dispatchers.IO : ๋คํธ์ํฌ๋ ๋์คํฌ ๋ฑ I/O์ ์ต์ ํ๋ ๋์ํ๋ ๋์คํจ์ณ
- Dispatchers.Main : ๋ฉ์ธ(UI) ์ค๋ ๋์์ ํจ๊ป ๋์ํ๋ ๋์คํจ์ณ
- ์ด๋ฌํ ๋์คํจ์ณ๋ค์ ๋ชจ๋ ํ๋ซํผ์์ ์ง์๋์ง ์์ผ๋ ์ง์๋๋ ํ๋ซํผ์ ๋ฐ๋ผ์ ์ฌ์ฉํด์ผํ๋ค.
- GlobalScope
launch & async
- ์ฝ๋ฃจํด์ ์ด๋ฌํ ์ค์ฝํ์์ ์ ์ด๋๋๋ก ์์ฑ๋ ์ ์๋๋ฐ, ์์ฑ๋ ์ค์ฝํ์์ laucn{}๋ async{}ํจ์๋ฅผ ํตํด ์ฝ๋ฃจํด์ ์์ฑํ ์ ์๋ค.
val scope = CoroutineScope(Dispatcher.Defaunt)
val coroutineA = scope.launch{}
val coroutineB = scope.async{}
- launch์ async์ ์ฐจ์ด๋ ๋ฐํ๊ฐ์ด ์๋์ง์ ์ฌ๋ถ์ ๋ฐ๋ผ ๋ค๋ฅด๋ค.
- launch๋ ๋ฐํ๊ฐ์ด ์๋ Job๊ฐ์ฒด๋ฅผ ๋ฐํํ๋ค.
- async๋ ๋ฐํ๊ฐ์ด ์๋ Deffered๊ฐ์ฒด๋ฅผ ๋ฐํํ๋ค.
- launch์ async ๋ ๋ค ๋๋คํจ์ ํ์์ ๊ฐ์ง๊ณ ์๊ธฐ ๋๋ฌธ์ ๋ฐํ๊ฐ์ด ์๋ async์ ๊ฒฝ์ฐ ๋งจ ๋ง์ง๋ง ๊ตฌ๋ฌธ์ ๊ฐ์ ๋ฐํํ๋ค.
์์
import kotlinx.coroutines.*
fun main() {
val scope = GlobalScope
scope.launch{
for(i in 1..5){
println(i)
}
}
}
- ๋ฐ์น ํจ์๊ฐ ์คํ๋์ง ์์ ์ด์
- ์ฝ๋ฃจํด์ ์ ์ด๋๋ ์ค์ฝํ ๋๋ ํ๋ก๊ทธ๋จ ์ ์ฒด๊ฐ ์ข ๋ฃ๋๋ฉด ํจ๊ป ์ข ๋ฃ๋๊ธฐ ๋๋ฌธ์ ์ฝ๋ฃจํด์ด ๋๊น์ง ์คํ๋๋๊ฒ์ ๋ณด์ฅํ๋ ค๋ฉด ์ผ์ ํ ๋ฒ์์์ ์ฝ๋ฆฐํด์ด ๋ชจ๋ ์คํ๋ ๋๊น์ง ์ ์ ๊ธฐ๋ค๋ ค์ฃผ์ด์ผ ํ๋ค.
- ์ง๊ธ ์์ ์ ๊ฒฝ์ฐ, ๋ฉ์ธ ํจ์ ๋ด์์ ์ฝ๋๊ฐ ๋์๊ฐ๊ธฐ ๋๋ฌธ์ ํ๋ก์ธ์ค๊ฐ ๊ฑฐ์ ์คํ ์ฆ์ ์ข ๋ฃ ๋๋ฏ๋ก ์ฝ๋ฃจํด๋ ๋์๋์ง ๋ชปํ๊ฒ์ด๋ค.
- ์ด๋ด๋๋ runBlocking ๋ธ๋ญ์ ๋ง๋ค๊ณ ์ด ์์์ ๋ฐ์น๋ ์ด์ฑํฌ๋ฅผ ์ง์ ์์ฑํ๋ฉด ์ฝ๋ฃจํด์ด ์ข ๋ฃ๋ ๋๊น์ง ๋ฉ์ธ ๋ฃจํด์ ์ ์ ๋๊ธฐ์์ผ์ค๋ค.
- ์ฃผ์ํ ์ ์ ์๋๋ก์ด๋์์๋ ๋ฉ์ธ์ค๋ ๋์์ runBlocking์ ๊ฑธ์ด์ฃผ๋ฉด ์ผ์ ์๊ฐ ์ด์ ์๋ต์ด ์๋ ๊ฒฝ์ฐ ANR(Application Not Responding : ์๋ต ์์)์ด ๋ฐ์ํ๋ฉฐ ์ฑ์ด ๊ฐ์ ์ข ๋ฃ ๋๋ค.
- ๋ค์์ ์์ ๋ runBlocking์ ํ์ฉํ ์์ ๋ค.
runBlocking ์์
import kotlinx.coroutines.*
fun main() {
val scope = GlobalScope
runBlocking{
scope.launch{
for(i in 1..5){
println(i)
}
}
}
}
1
2
3
4
5
๋ฃจํด์ ๋๊ธฐ๋ฅผ ์ํ ์ถ๊ฐ์ ์ธ ํจ์
- dlay()
- ๋ฐ๋ฆฌ์ด ๋จ์๋ก ๋ฃจํด์ ์ ์ ๋๊ธฐ์ํค๋ ํจ์๋ค.
- join()
- Job ๊ฐ์ฒด์์ ํธ์ถํ์ฌ Job์ ์คํ์ด ๋๋ ๋๊น์ง ๋๊ธฐํ๋ ํจ์๋ค.
- await()
- Deferred ๊ฐ์ฒด์์ ํธ์ถํ์ฌ Deferred์ ์คํ์ด ๋๋ ๋๊น์ง ๋๊ธฐํ๋ ํจ์๋ค.
- Deferred์ ๊ฒฐ๊ณผ๋ ๋ฐํํ๋ค.
- ์ธ ํจ์๋ค์ ์ฝ๋ฃจํด ๋ด๋ถ ๋๋ runBlocking๊ณผ ๊ฐ์ ๋ฃจํด์ ๋๊ธฐ๊ฐ ๊ฐ๋ฅํ ๊ตฌ๋ฌธ ์์์๋ง ๋์์ด ๊ฐ๋ฅํ๋ค.
์์
import kotlinx.coroutines.*
fun main() {
runBlocking{
val a = launch{
for(i in 1..5){
println(i)
delay(10)
}
}
val b = async{
"async ์ข
๋ฃ"
}
println("async ๋๊ธฐ")
println(b.await())
println("launch ๋๊ธฐ")
a.join()
println("launch ์ข
๋ฃ")
}
}
async ๋๊ธฐ
1
async ์ข
๋ฃ
launch ๋๊ธฐ
2
3
4
5
launch ์ข
๋ฃ
async์ ๊ฒฐ๊ณผ๋ฅผ ๊ธฐ๋ค๋ฆฐ ํ await()ํจ์์์ ๊ฒฐ๊ณผ๋ฅผ ๋ฐ์ ์ถ๋ ฅํ๊ณ ๋ค์ launch๊ฐ ๋๊น์ง ์ํ๋๊ธฐ๋ฅผ ๊ธฐ๋ค๋ฆฐ ํ launch๊ฐ ์ข ๋ฃ ๋์์์ ์ถ๋ ฅํ๋ค.
cancel()
- ์ฝ๋ฃจํด ์คํ ๋์ค ์ค๋จํ๋ ํจ์๋ค.
- ์ฝ๋ฃจํด์ cancle()์ ๊ฑธ์ด์ฃผ๋ฉด ๋ค์ ๋ ๊ฐ์ง ์กฐ๊ฑด์ด ๋ฐ์ํ๋ฉฐ ์ฝ๋ฃจํด์ ์ค๋จ์ํฌ ์ ์๋ค.
- ์ฝ๋ฃจํด ๋ด๋ถ์ delay()ํจ์ ๋๋ yield()ํจ์๊ฐ ์ฌ์ฉ๋ ์์น๊น์ง ์ํ๋ ๋ค ์ข ๋ฃ๋๋ค.
- cancel()๋ก ์ธํด ์์ฑ์ธ isActive๊ฐ false๊ฐ ๋๋ฏ๋ก ์ด๋ฅผ ํ์ธํ์ฌ ์๋์ผ๋ก ์ข ๋ฃํ๋ค.
์์
import kotlinx.coroutines.*
fun main() {
runBlocking{
val a = launch{
for(i in 1..5){
println(i)
delay(10)
}
}
val b = async{
"async ์ข
๋ฃ"
}
println("async ๋๊ธฐ")
println(b.await())
println("launch ์ทจ์")
a.cancel()
println("launch ์ข
๋ฃ")
}
}
async ๋๊ธฐ
1
async ์ข
๋ฃ
launch ์ทจ์
launch ์ข
๋ฃ
cancel() ๋๋ฌธ์ ์ซ์๊ฐ ๋์ค๋ค๊ฐ ์ค๊ฐ์ ๋์ด์ง๋ค.
withTimeoutOrNull()
- ์ ํ์๊ฐ ๋ด์ ์ํ๋๋ฉด ๊ฒฐ๊ณผ๊ฐ์ ๋ฐํํ๊ณ ์๋๊ฒฝ์ฐ null์ ๋ฐํํ๋ค.
- ๊ดํธ์์ ๋ฐ๋ฆฌ์ด ๋จ์์ ์ ํ์๊ฐ์ ์ ์ด๋๊ณ ์ค๊ดํธ ์์ ์ฝ๋ฃจํด ๊ตฌ๋ฌธ๋ค์ ๋ง๋ค๊ณ ๋ง์ง๋ง ๊ตฌ๋ฌธ์ ๊ทธ ๊ฒฐ๊ณผ๊ฐ์ ๋ฐ๋ ํํ๋ก ์ฌ์ฉํ๋ค.
- join()์ด๋ await()์ฒ๋ผ blocking ํจ์๋ค.
์์
import kotlinx.coroutines.*
fun main() {
runBlocking{
var result = withTimeoutOrNull(50){
for(i in 1..10){
println(i)
delay(10)
}
"Finish"
}
println(result)
}
}
1
2
3
4
null
50ms ๋ด์ ์คํํ ์ ์์ด์ null์ด ์ถ๋ ฅ๋๋ค.
728x90
'์๋๋ก์ด๋๐ค' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[์๋๋ก์ด๋] ํด๋ฆญ์ ๋ฐ์ํ๊ธฐ & ํ ์คํธ ๋ฉ์ธ์ง ๋์ฐ๊ธฐ (1) | 2024.07.11 |
---|---|
[์๋๋ก์ด๋] Linear Layout & ์ฌ์ง ์ฝ์ (0) | 2024.07.10 |
[์ฝํ๋ฆฐ] ๋นํธ์ฐ์ฐ (0) | 2024.07.09 |
[์ฝํ๋ฆฐ] ์์, ๋ฆ์ ์ด๊ธฐํ, ์ด๊ธฐํ ์ง์ฐ (0) | 2024.07.08 |
[์ฝํ๋ฆฐ] ์ปฌ๋ ์ ํจ์ (0) | 2024.07.08 |