본문 바로가기
Android/Android Development

Android Thread, Coroutine 기초 개념 정리

by 2Plus 2020. 5. 10.

 오늘은 thread와 Coroutine에 대해 간단하게 정리해본다. 안드로이드 위주로 알아볼 것이며 Coroutine에 대해서는 추후에 다른 포스팅에서 더 자세하게 다룰 예정이다.

 

 

Threading

 thread(스레드)는 프로그램이 실행되는 한 흐름이며, 코드 라인이 실행되는 Queue라고 생각할 수 있다. 안드로이드는 하나의 메인 스레드에서 앱이 시작하고 동작하게 되는데, 이를 UI 스레드라고 한다. 안드로이드를 조금이라도 만져봤으면 한번쯤은 들어본 스레드일 것이다. 기본적으로 안드로이드의 코드는 UI 스레드에서 돌아가고, UI와 관련된 View, Activity, click listener 등은 여기서 생성되고 실행된다.

 

 

Multi-threading

 요즘의 컴퓨터나 스마트폰에서 돌아가는 프로그램, 앱들은 하나의 작업이 쭉 수행되는 것이 아니라, 여러 개의 많은 작업들이 동시에 진행되고 있다. 대부분 DB 쿼리나, network request 등을 사용하고 있고 이 작업은 시간이 얼마나 걸릴지도 알 수 없다. 이런 작업들은 요청이 진행되는 동안 진행 중이던 스레드를 붙잡고 있기 때문에 단일 스레드에서 이를 진행한다면 그 동안 다른 작업을 하지 못하고 있어야 한다. UI 스레드에서 이를 실행하면 뷰를 그리거나 터치 이벤트도 받을 수 없게 되는 것이다. 앱을 사용하는 사람의 입장에서는 앱을 잘못 만들어서 멈춘 것 같아 보일 것이다. 이렇게 한다면 잘못 만든 앱은 맞다. 그래서 이러한 작업들을 할 때는 UI 스레드의 동작을 보장하기 위해서 다른 스레드를 만들어서 수행해야 한다. UI나 이벤트, 필요한 작업들은 계속하여 동작하고 있고, 다른 스레드에서 시간이 걸리는 작업들을 진행하는 것이다. 물론 스레드 간에 통신도 가능하기 때문에 앱 자체의 입장에서도 문제될 것이 없다.

 

 

Callback (콜백)

 DB 쿼리나, network request가 완료되고 나면 받은 결과를 가지고 이를 요청했던 곳에서 다시 진행하려는 작업을 해야 한다. 결과를 가지고 뭔가를 하기 위해서 요청을 했을 테니까 당연한 이야기이다. 콜백이라는 것을 이용하여 이러한 작업을 할 수 있다. 함수를 인자로 전달하는 방식인데, 여러 곳에서 유용하게 쓰일 수 있다.

 

 

 

 

 위와 같이 콜백을 인자로 받아서, 결과가 나왔을 때 콜백을 통해 이후의 동작을 수행하도록 결과를 인자로 전달해줄 수 있다.

 

 

 

 

 콜백은 람다식으로 위와 같이 표현해서 사용할 수 있다. 결과가 왔을 때 결과에 따라 원하는 동작을 수행할 수 있다. 콜백을 너무 남용하면 읽기 어려울 수 있는 문제가 있기는 하다. 개인적으로는 콜백도 좋지만 상황에 따라서 굳이 콜백을 사용해야 하는 경우가 아니라면 Coroutine이나 RxKotlin의 Reactive 기능을 사용하는 것이 더 좋다고 생각한다.

 

 

Coroutine (코루틴)

 코루틴은 Kotlin에서 제공하는 기능으로 앞서 봤던 콜백을 sequential한 코드로 만들어 준다. suspend 키워드를 사용하여 코루틴 형태의 함수를 선언하고, 이 함수를 실행하면 결과가 나올 때까지 실행이 일시 중단되도록 해 준다. 결과가 돌아오면 중단된 부분이 자동으로 다시 시작된다. 코루틴을 사용하기 위해서는 CoroutineScope가 필요한데 이를 통해 suspend로 선언한 함수를 실행하고, 취소하는 등의 작업을 실행할 수 있다.
 
 코루틴에 대해서는 더 자세히 작성하면 이 글이 길어질 것 같아서 별도의 글로 작성하였다. 코루틴에 대한 글은 아래의 링크를 참조하기 바란다.

 

2020/05/12 - [Android/Kotlin] - Android Kotlin Coroutines 사용하기

 

Android Kotlin Coroutines 사용하기

기존에는 async task를 하기 위해서 스레드, 실행, 콜백 등을 구현했다. 물론 이를 구현하는 데 있어서 큰 불편함은 없지만 코드를 많이 짜야 하고 지저분해지기가 쉽다. 특히나 콜백을 많이 사용하

dev-repository.tistory.com

 

 

 

반응형

댓글