개발자의 끄적끄적

[안드로이드] Thread(스레드) 파헤치기 [펌] 본문

개발/android & ios

[안드로이드] Thread(스레드) 파헤치기 [펌]

효벨 2020. 7. 3. 01:00
728x90
반응형

[안드로이드]  Thread(스레드) 파헤치기 [펌]

 

1. Thread 란 무엇일까?

  스레드는 하나의 프로그램 내에서 동작하는 '여러 갈래의 작업 흐름' 입니다. 한마디로 하나의 프로그램에서 여러 작업을 동시에 실행 할 수 있도록 만드는 기능이라고 할 수 있습니다. 

 

  예를 들어, 음악을 다운로드 받고 이를 재생할 수 있는 어플리케이션이 하나 있습니다. 정상적인 어플이라면 음악을 다운로드 받는 동안에도 기존에 있는 음악을 재생 할 수 있을겁니다. 하지만 어떤 음악을 전부 다운 받을때까지 음악 재생이고 검색이고 뭐고 화면이 그냥 우뚝 서있게 된다면 굉장히 불편한 어플이 되겠죠?

 

  이는 음악 어플 내에 기능을 수행할 수 있는 동작 흐름이 '하나뿐' 이기 때문이죠.

스레드는 '여러 갈래의 작업 흐름'을 만듦으로써 이러한 문제를 말끔히 해결 해 줄 수 있습니다.

 

 

" 하나의 프로그램 내에서

여러 동작을 동시에 수행한다 "

 

 

  이를 멀티 스레딩(Multi Threading) 이라고 합니다. 이미 자바나 다른 언어에서도 스레드라는 개념이 있지만  안드로이드에서의 스레드는 주로 서버와의 통신에서 사용되게 됩니다.

2. Thread 의 논리적 구조

  스레드는 하나의 프로세스에서 동작하기 위해 '프로세스의 자원을 공유' 하게 됩니다. 다시 말해, 하나의 프로그램 내에서 정의하고 구현 해 놓은 '변수'나 '메소드'등을 공유하게 됩니다. 자원을 공유한다는 개념이 상당히 중요한데, 그림으로 설명하자면 다음과 같습니다.

 

 

 

멀티 스레딩(Multi Threading) 개념과 자주 비교되는 멀티 프로세싱(Multi Processing) 입니다. 멀티 프로세싱의 경우, 완전히 같은 프로세스라고 할지라도 메모리를 프로세스마다 독립적으로 가지게 됩니다. 하지만 멀티 스레딩의 경우, 하나의 프로세스 안에서 동작하는 형태이기 때문에 프로세스 내에 있는 메모리를 공유해서 동작하게 됩니다.

 

  이와 같이, 스레드 동작을 위해 자원을 복사하는 형태 등으로 따로 떼어 주는것이 아니라, 이를 공유 함으로써 자원 소모를 줄이고 성능 향상을 도모 할 수 있습니다.

3. Thread 구현

 안드로이드에서 스레드를 구현하는 방법은

 

  extends Thread

  implement Runnable

 

이렇게 크게 두가지로 구현 할 수 있습니다. 우선 각각 어떻게 구현을 하는지부터 살펴 보도록 하겠습니다.

1) extends Thread

Thread 를 상속 받는 방법이든 Runnable 을 구현 하는 방법이든 주목해야할 메소드는 run()  start() 입니다.

 

 

 위의 스크린샷과 같이 Thread 클래스를 상속 받은 후, run() 메소드를 Override 하여 스레드가 무엇을 할지를 정해 줍니다. 이후에 메인 액티비티 내에서 스레드를 생성해주고 해당 스레드를 start() 시켜 줌으로써 스레드를 동작 시킬 수 있습니다.

2) implement Runnable

  Runnable 인터페이스를 구현하는 방법 또한 run() 메소드로 스레드 동작을 구현하고 start() 로 스레드를 실행 시키는 주된 흐름은 같지만선언 하는 방식이 약간 달라집니다.

 

  얼핏 보기엔 Runnable 을 사용하는 방법이 훨씬 귀찮아 보이지만 굳이 사용하는 이유는 extends 와 implement 의 차이점에 있습니다. 필요에 따라 다중 상속이 필요한 경우가 생기는데 이때 Runnable 인터페이스를 통해 다중 상속 스레드를 구현 할 수 있습니다. 

4. Thread 동작 예제

 이제 만들게 될 스레드 예제의 로직은 다음과 같습니다.

 

1. Thread 는 Activity 의 생성과 함께 실행이 되며 1초당 한번씩 덧셈 연산을 진행 하고 이를 Thread Result 로 보여준다.

 

2. 버튼을 클릭 할 때마다 값이 1씩 증가하고 이를 Main Result 로 보여준다.

 

  위의 로직을 통해 사용자에게 보여지는 버튼 클릭의 행동과는 별개로 Activity 가 실행 되자마자 background 에서 묵묵히 계산을 수행중인 Thread 의 결과 값을 관찰 할 수 있습니다.

 

그럼 이제 앱이 실행 되고, 10초 후에 버튼을 한번만 클릭해 보겠습니다. 결과 화면은 다음과 같습니다.

 

 

 

 

보시는 바와 같이 하나의 앱이 구동되는동안 두가지의 덧셈 동작이 동시에 이루어 지는 것을 확인 할 수 있었습니다.

다음 포스팅은 스레드와 스레드사이의 통신 또는 스레드가 각종 뷰에 접근 하는데에 필요한 핸들러를 포스팅 해보도록 하겠습니다. 감사합니다!



출처: https://tedrepository.tistory.com/2 [Ted's IT Repository]

반응형
Comments