-
안드로이드 코루틴 Scope안드로이드 학습/Android 기술면접 대비 2024. 11. 15. 17:43
코루틴 스코프 (Coroutine Scope)란 ?
- 코루틴은 코루틴 스코프 안에서만 동작한다. 각 스코프는 특정 생명 주기를 가지며, 코루틴 실행을 위한 컨텍스트를 제공합니다.
- 코루틴 스코프를 사용하기 위해서는 미리 정의된 코루틴 스코프를 사용하거나 직접 생성하는 방법이 있다.
- 코루틴 스코프 종류 : CoroutineScope, viewModelScope, lifecycleScope, GlobalScope 등등
1. CoroutineScope
- 특징 :
- 명시적으로 정의한 스코프. 일반적으로 Job이나 Dispatchers를 사용하여 컨텍스트를 설정.
- 부모-자식 관계를 설정할 수 있어 구조화된 동시성을 지원.
- Dispatcher 종류 :
- Main : 메인 스레드, 화면 ui 작업 등을 하는 곳
- IO : 네트워크, DB 등 백그라운드에서 필요한 작업을 하는 곳
- Default : 정렬이나 무거운 계산 작업 등을 하는 곳
class DataLoader { private val scope = CoroutineScope(Dispatchers.IO + Job()) fun loadData() { scope.launch { val data = fetchDataFromNetwork() println("Data loaded: $data") } } fun clear() { scope.cancel() // 작업 취소 } private suspend fun fetchDataFromNetwork(): String { delay(1000) return "Network Data" } }
2. viewModelScope
- 특징:
- ViewModel의 생명주기와 연결된 스코프입니다.
- ViewModel이 메모리에서 해제되면 자동으로 코루틴이 취소됩니다.
- 장점: ViewModel에 적합하며, 구조화된 동시성을 제공.
class MyViewModel : ViewModel() { fun fetchData() { viewModelScope.launch { // 비동기 작업 (예: 네트워크 요청) val result = fetchDataFromNetwork() println("Data fetched: $result") } } private suspend fun fetchDataFromNetwork(): String { // 네트워크 요청 시뮬레이션 kotlinx.coroutines.delay(1000) return "Network Data" } }
3. lifecycleScope
- 특징:
- LifecycleOwner(Activity 또는 Fragment)의 생명주기와 연결된 스코프입니다.
- onDestroy() 등의 이벤트에서 자동으로 코루틴이 취소됩니다.
- 장점: UI와 직접 연결된 작업 처리에 적합.
- 사용 사례: Activity나 Fragment에서 UI 업데이트, 데이터 로드 등
class MainActivity : AppCompatActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) lifecycleScope.launch { // 비동기 작업 val result = loadData() println("Data loaded: $result") } } private suspend fun loadData(): String { // 데이터 로드 시뮬레이션 kotlinx.coroutines.delay(1000) return "Loaded Data" } }
lifecycleScope를 사용하면 수명 주기와 연관된 안드로이드 구성 요소(예: 액티비티, 프래그먼트)의 수명 주기를 기반으로 코루틴을 실행 가능
이는 구성 요소의 수명 주기가 활성 상태인 동안에만 코루틴이 실행되고, 구성 요소가 파괴되거나 비활성 상태가 되면 자동으로 해당 코루틴이 취소됩니다.
4. GlobalScope
- 특징
- GlobalScope는 CoroutineScope의 한 종류로써 가장 큰 특징은 Application이 시작하고 종료될 때까지 계속 유지
- Singletone 이기 때문에 따로 생성하지 않아도 되며 어디에서든 바로 접근이 가능
- 애플리케이션의 생명 주기와 함께 지속됨.
- 주의할 점 :
- 메모리 누수의 원인이 될 수 있기 때문에 신중히 사용해야 한다.
- 즉 앱이 실행된 이 후 계속 수행이 되어야 한다면 GlobalScope 를 사용해야 하는 것이고 특정 Activity나 Service 에서만 잠깐 사용하는 것이라면 GlobalScope를 사용하면 안된다.
fun main() { GlobalScope.launch { delay(1000) println("GlobalScope: 실행 완료") } Thread.sleep(2000) // 코루틴 실행 대기 }
'안드로이드 학습 > Android 기술면접 대비' 카테고리의 다른 글
(DI - 3편) DI 라이브러리 Hilt Annotations (0) 2024.11.16 (DI - 2편) 안드로이드 의존성 수동 주입 (0) 2024.11.16 안드로이드 코루틴 (Coroutine) (0) 2024.11.08 안드로이드 앱 아키텍처 (App Architecture) (0) 2024.10.17 AAC - ViewModel (0) 2024.10.07