안드로이드에서 Thread가 중요한 이유
728x90
반응형

쓰레드, 쓰레드, 쓰레드...

말은 무지하게 많이 들어봤지만 제대로 들여다본 적은 없는 1인

그래서 알아봈다.

쓰레드가 뭐고 당췌 왜 중요한가...

 

모르면 알아봐야지. 뭐가 저리 당당해.

쓰레드가 뭐시당가

먼저 프로세스(Process)를 이해해봅시다. 간단히 얘기해서 메모리 상에 실행되고 있는 프로그램이 프로세스입니다. 이 프로세스가 간단하다면 하나의 연산만 진행하고 대기상태에 머물겠죠. 텍스트 한줄만 있는 앱이 있다면 텍스트만 보여주기만 하면 되니깐 그럴 수 있습니다. 하지만 보통 2개 이상의 연산을 해야됩니다. UI를 보여주면서 서버와 접속도 해야되고 현재 상태도 확인해야하는 등의 상황이 있죠. 이렇게 독립적으로 실행이 되는 흐름/줄기/가닥을 쓰레드(Thread)라고 부릅니다.

 

출저 : 네이버 사전

 

안드로이드 쓰레드

Java를 공부하면 눈에 익숙한 함수가 나온다. main() 함수. 첫 쓰레드의 실행을 여기서 하게 된다. 그럼 그 쓰레드가 설마? 맞다. (혼자 북치고 장구치고) 메인(Main) 쓰레드. 안드로이드에서는 이 메인 쓰레드를 UI 쓰레드라고 부르기도 한다. 메인쓰레드는 안드로이드의 이벤트를 생성/처리하기도 하지만 뷰와 위젯같은 표현을 담당하기도 하기에 UI 쓰레드라고 부른다. 동일한 프로세스에서 동작하는 모든 컴포넌트는 메인 쓰레드에서 처리한다. (OnClickEvent같은 )이벤트와 뷰 갱신이 교차해서 실행될 때, 바로 메인 쓰레드가 동작하는 것이다.

 

동작하는 쓰레드에서 새로운 쓰레드를 생성할 수 있다. 반드시 메인 쓰레드 위에서 생성할 필요는 없다. 별도의 쓰레드를 생성해서 UI 쓰레드가 동작할 때 별도의 연산을 하고 싶을 것을 거기에 올리면 된다. 그것을 백그라운드 쓰레드라고 부른다. 클릭 이벤트로 다운로드를 수행하고 싶다면 클릭 이벤트는 메인 쓰레드로 다운로드 수행은 백그라운드 쓰레드로 동작하면 된다. 다운로드가 완료될 때까지 아무런 동작을 하지 않아도 되는 상황이라면 둘 모두 메인 쓰레드에 담아도 되겠지만... 그런 경우는 거의(어쩌면 전혀) 없다. 여기서 의문이 생긴다. 백그라운드 쓰레드에서 UI에 영향을 주고 싶다면 어떻게 해야할까? 그건 뒤에서 다루자.

 

쓰레드와 서비스

백그라운드 쓰레드를 얘기할 때 서비스(Service)를 떠올린 사람도 있을 것이다. 하지만 여기서 착각하면 안되는 것이 있다. 서비스는 메인 쓰레드에서 실행된다. 서비스 내에서 별도의 쓰레드를 생성해서 동작한다. 앱이 실행되고 있지 않은 상황에서 수행할 것(ex. 음악 재생)이 있다면 서비스를 이용해야 한다. (물론 앱 실행중이라면 메인 쓰레드 이용) 그렇다면 백그라운드 쓰레드와 다르지 않지 않은가? Nope. 백그라운드 쓰레드는 프로세스의 영향을 받는다. 즉 부모의 영향을 받는 것이다. 하지만 서비스는 액티비티처럼 자체적으로 라이프사이클을 갖는다. 그래서 Manifest에 있는 것이다. 그렇다면 서비스는 어떻게 사용할 수 있을까?

  • startService() : 앱 내 혹은 로컬 서비스. 서비스를 호출한 컴포넌트(ex. 액티비티)가 종료되어도 서비스는 종료되지 않는다. 별도로 Return을 하지 않기 때문에 호출한 컴포넌트와 독립적이다. 그렇기에 서비스는 알아서 종료되어야 한다. 컴포넌트는 처음 intent에 정보를 번들로 묶어서 전달할 수 있지만 그 이후에는 통신을 할 수 없다.
  • bindService() : 호출한 컴포넌트와 상호작용을 한다. 해당 컴포넌트가 unbind되면 서비스는 종료된다. 서비스가 동작 중에도 제어를 할 수 있다. 이 방식으로 프로세스 간 통신이 가능하기에 위치, 알림 서비스 등을 사용할 수 있다.

 

참고자료
- HAMA 블로그 : https://hamait.tistory.com/310
- 백중원님 미디엄

 

728x90
반응형