728x90
반응형
🚀 오늘 배운 것
- isNotEmpty()는 길이 체크, isNotBlank()는 공백 여부까지 체크.
- launch는 단순 실행, async는 await()로 결과 반환 가능.
- runBlocking은 스레드 차단, CoroutineScope는 비동기 실행.
🔹 isNotEmpty() vs isNotBlank()
Method 대상 동작 방식
isNotEmpty() | String & Collection | 문자열 또는 컬렉션이 비어있지 않으면 true |
isNotBlank() | String | 공백(' ', '\\\\t', '\\\\n')을 제외한 문자가 하나라도 있으면 true |
📌 예제
val str1 = " "
val str2 = "abc"
println(str1.isNotEmpty()) // true
println(str1.isNotBlank()) // false
println(str2.isNotEmpty()) // true
println(str2.isNotBlank()) // true
✅ isNotEmpty()는 단순히 길이(0 초과)를 체크하지만, isNotBlank()는 공백만 있는 경우도 false를 반환함.
🔹 async vs launch
기능 async launch
반환값 | Deferred<T> (결과를 반환) | Job (결과 없음) |
실행 방식 | 병렬 실행 + await()로 결과 반환 | 병렬 실행 후 결과 기다리지 않음 |
예외 처리 | await() 시 예외 발생 | 내부에서 바로 예외 발생 |
📌 예제
suspend fun example() {
val scope = CoroutineScope(Dispatchers.IO)
val job = scope.launch {
println("Launch 실행")
}
val deferred = scope.async {
println("Async 실행")
"결과값"
}
job.join() // 단순 실행 후 종료 기다림
println(deferred.await()) // "결과값" 출력
}
✅ launch는 단순히 수행만 하고 결과를 반환하지 않음.
✅ async는 Deferred를 반환하며, await()을 호출해야 결과를 얻을 수 있음.
🔹 runBlocking vs CoroutineScope
기능 runBlocking CoroutineScope
동작 방식 | 현재 스레드를 차단 (Blocking) | 비동기 실행 (Non-blocking) |
사용 목적 | main() 등 최상위에서 코루틴 호출 시 | 비동기 코드 실행을 위한 컨테이너 |
성능 영향 | 메인 스레드 블로킹 | 메인 스레드 유지 |
📌 예제
fun main() {
runBlocking {
println("runBlocking 시작")
delay(1000)
println("runBlocking 끝")
}
println("메인 종료")
}
fun main() {
val scope = CoroutineScope(Dispatchers.Default)
scope.launch {
delay(1000)
println("CoroutineScope 실행")
}
println("메인 종료")
Thread.sleep(1500) // 메인 종료를 방지하기 위해 추가
}
✅ runBlocking은 스레드를 차단하여 내부 코드가 완료될 때까지 기다림.
✅ CoroutineScope는 비동기 실행을 제공하며 메인 스레드를 차단하지 않음.
728x90
반응형
'Blog > TIL' 카테고리의 다른 글
2025-03-18 (화) (2) | 2025.03.18 |
---|---|
2025-03-14 (금) (0) | 2025.03.14 |
2025-03-13 (목) (0) | 2025.03.13 |
2025-03-11 (화) (1) | 2025.03.11 |
2025-03-10 (월) (1) | 2025.03.10 |
댓글