[Android | Kotlin] Coroutine과 Flow 정리하기(1) - Thread

한시삼십사분·2023년 7월 27일
1

Android

목록 보기
4/10

🧐도입

SSAFY 10기를 준비하고, 입과 후 약 1달 동안은 알고리즘 공부에 집중했다.
백준 티어 골드 3을 달성하고 다시 안드로이드를 공부하기 위해 거의 1달 반 정도만에 안드로이드 스튜디오를 켰더니 머리가 백지가 된 것 처럼 코드가 읽히지 않아 클린 아키텍처를 다시 공부하기로 마음 먹었다.

클린 아키텍처에 대한 글을 몇 개 읽고 간단한 프로젝트를(거의 클론 코딩 수준...) 만들어보는 수준으로 공부를 해봤지만, 개념 공부는 거의 하지 않고 그저 돌아가는 코드를 짜기에 급급했었다. 싸피에서 자바 공부를 하면서 내가 이 클래스, 메소드, 인터페이스 등을 왜 사용하고 어떻게 사용하는지에 대해 공부를 하다보니 지금껏 안드로이드를 공부했던 과정이 너무나도 잘못 되었다는 것을 알았고, 이번에는 개념 공부부터 차근차근 포스팅을 해가며 안드로이드를 제대로 공부해봐야겠다.

ps. 보통 블로그에서 볼 수 있는 흐름을 따라 공부하지는 않을 것 같다. 내 마음대로 기술들을 하나씩 공부해가며 결국 마지막에 여러 기술들을 활용하여 간단한 프로젝트를 하는 방식으로 진행할 것 이다.
(공식문서나 위키 같이 정제되고 정확한 정보를 복붙하지 않고 스스로 이해해보려 노력하고, 이해를 바탕으로 나만의 언어로 포스팅을 할 것이기 때문에 틀린 부분이 정말 많을 것 같은데 지적과 가르침은 언제나 감사하겠슴다...)

Thread가 뭐죠?

ssafy 자바 수업에서 thread를 간단하게 공부했다. thread는 너무나도 익숙한 단어였지만 누군가 "thread가 뭐야?"라고 물어본다면 아마 대답을 못했을 것 같다.

프로세스와 스레드

프로세스(Process)

컴퓨터에서 실행되고 있는 프로그램.

CPU를 할당 받아 컴퓨터에서 실행되고 있는 하나의 프로그램을 프로세스라고 생각하면 될 것 같다.
우리는 당연하게 멀티 프로세스 환경에서 컴퓨터를 사용한다. 유튜브를 보며 카카오톡을 하고, 안드로이드 스튜디오를 켜서 코딩도 한다.

그렇다면 스레드와 멀티 스레드는 무엇일까?

스레드(Thread)

프로세스 내에서 실행되는 흐름의 단위.
일반적으로 한 프로그램은 하나의 스레드를 가지고 있지만, 프로그램 환경에 따라 둘 이상의 스레드를 동시에 실행할 수 있음(멀티스레드)

사용자 입장에서는 어떤 애플리케이션을 실행할 때 하나의 흐름을 통해 사용하고 있다고 느껴지지만 사실은 멀티 스레드 방식으로 여러 작업이 동시에 일어나고 있다.

카카오톡이 실제로 어떻게 돌아가는지는 모르지만 카카오톡을 실행시키면 내 친구 목록도 불러오고, 사용자의 입력도 받고, 채팅방 목록 등 여러 작업들이 실행되는데 이를 동기적으로 실행하지 않을 것이다.
내 친구 목록을 불러오고, 모두 불러와지면 출력하고, 출력이 되면 내 입력을 받고... 이렇게 진행된다면 아무도 사용하지 않을 것이다.

이렇게 여러 작업들을 비동기적으로 실행하기 위한 작은 작업 단위 하나를 스레드라고 생각하면 된다.

동기 비동기

동기 방식

하나의 작업이 완료되면 다음 작업을 실행하는 방식

비동기 방식

여러개의 작업이 스레드를 통해 동시에 실행되며 다른 스레드의 작업 완료가 내 작업 실행에 영향을 끼치지 않는 방식

물론 동기적으로 실행되어도 상관 없는 서비스가 있겠지만, 위의 설명만 읽어봐도 비동기적으로 동작하는 서비스를 만들어야 할 것만 같다!

Thread in JAVA

Kotlin으로 안드로이드를 공부하고 있지만, 결국 kotlin도 JVM 위에서 돌아가고, 기능들이 Java API를 기반으로 만들어졌기 때문에 JAVA에서의 Thread를 간단히 정리하고 넘어가보자.

main 함수 내에서 실행되는 작업을 A, 그리고 B라는 작업을 실행시키는 executeB라는 함수를 만들었다고 가정하자.

class ThreadTest{
    ... 
    main(){
    	//A 실행!
        executeB();
    }
    
    executeB(){
    	//B 실행!
    }
}

대충 위와 같은 구조일 것이다.
프로젝틀를 실행하면 main함수가 실행된다. main 내부에서 executeB를 호출할 것이고 B가 실행될 것이다.
B 작업이 마무리 되고 main이 종료된다.

하지만 우리는 A와 B 작업을 동시에 실행하고 싶다.
쓰레드를 사용해보자.

class ThreadTest extends Thread{
    ... 
    main(){
    	//A 실행!
        
        //thread 객체 생성
        ThreadTest t1 = new ThreadTest();
        //객체.run() 호출
        t1.start()
    }
    
    run(){
    	//B 실행!
    }
}

우선 Thread class를 상속받는다. 상속이 불가한 경우 Runnable Interface를 구현 후 run 메소드를 구현,

new Thread(new ThreadTest());

위와 같이 스레드를 생성하면 된다.

main 함수 내에서 스레드 객체를 생성 후 start() 메소드를 통해 run() 메소드를 실행해 별도의 스레드에서 작업을 수행한다.

main 함수는 main thread에서 실행된다. B 작업은 t1 스레드에서 실행된다.
이제 두 작업은 별도의 스레드에서 비동기적으로 실행된다!!

물론 synchronized, join, wait, notify 등 스레드를 활용하기 위한 여러 기능들이 있지만 자바의 스레드에 대해 깊게 정리할 것은 아니기 때문에 스레드가 이런 식으로 사용된다 정도로 알고 넘어가면 될 것 같다.

✍️ 결론

본격적으로 코루틴에 대해 공부하기 전에 스레드와 멀티 스레드, JAVA로 간단히 알아보는 스레드 생성과 실행에 대해 정리했다.
코루틴은 안드로이드에서(안드로이드 뿐만 아니라 여러 환경에서 사용된다, 하지만 난 안드로이드에서만 사용할 것) 멀티 스레드 환경 비동기적 프로그래밍을 도와주는 솔루션이다. 다음은 코루틴에 대해 공부하고 정리할 것이다.

참고

https://kotlinworld.com/category/Coroutines
여기서 코루틴 관련 글을 쭉 읽어봤다. 초보자도 이해하기 쉬웠고, 많은 도움을 받았다.

profile
인간은 망각의 동물이라지만 이건 너무한 거 아니냐고

1개의 댓글

comment-user-thumbnail
2023년 7월 27일

좋은 정보 감사합니다

답글 달기