비동기 프로그래밍은 왜 필요한걸까? 그냥 코드를 작성한대로 순차적으로 프로그램이 흘러가면 코드를 쓰기도 편하고 읽기도 편한데...
나 역시도 비동기 프로그래밍이라는 것이 너무 어려웠고, 아직도 코드를 작성하라고하면 섣불리 키보드를 두드리기 어려운 부분이다. 정말 간단하게 string, int, boolean 등 기본자료형들만 움직이는 프로그램을 만든다면 필요가 없는 것은 맞다.
하지만 어마어마하게 큰 데이터나 어마어마하게 많은 반복작업을 해야할 때는 비동기 작업이 필요하다.
모바일에서 어떤 버튼을 눌렀을 때, 10억번의 반복문이 돌아야한다고 가정해보겠다.
button.setOnClickListener {
var a = 0
for (i in 0..10억) {
a++
}
Toast.makeText(context, "$a", Toast.LENGTH_SHORT).show()
}
이렇게 작성된 앱이 있고 사용자가 아무 생각 없이 이 버튼을 누른다면? 고장이라도 난 것처럼 화면이 움직이지 않고
다른 어떤 버튼을 눌러도 반응을 하지 않을 것이다.
안드로이드는 기본적으로 쓰레드를 정해주지 않는다면 UI가 작동하는 Main 쓰레드에서 작동하기 때문에,
Main 쓰레드는 UI를 조작하지 못하고 계속 for 반복문을 돌게 되는 것이다. 그 후 짧게는 몇초, 길게는 몇십초 후에
반복문이 끝나고 Toast로 a의 값을 표시해주게 될 것이다.
뭐 시간이 많다면 기다려도 되겠지만, 어쨋든 버튼을 누른 후에도 다른 기능들을 사용해야하지 않겠는가!
때문에 Main 쓰레드가 아닌 별도의 쓰레드를 생성하여 UI가 작동하지 않는 영역에서 반복문을 수행하고
Main 쓰레드는 자유롭게 다른 UI의 이벤트를 처리하게 해주는 것이다.
button.setOnClickListener {
var a = 0
Thread {
for (i in 0..10억) {
a++
}
}.start()
Toast.makeText(context, "$a", Toast.LENGTH_SHORT).show()
}
자 이렇게 a의 값을 10억번 증가하는 반복문이 다른 쓰레드에서 실행이 되었고, Main 쓰레드는 버튼 클릭후에 다른
기능들을 수행할 수 있게 되었다. 라는 착각
a의 값은 정상적으로 증가하고, 그 와중에도 다른 UI의 이벤트를 처리할 수 있다. 하지만 한가지 큰 문제가 있다.
Toast로 출력되는 메세지에는 a의 값이 0이 찍히게 된다. (가능한 경우인지는 모르겠지만, 10정도까지는 올라갈수도 있지 않을까..?)
이번 포스팅의 주제가 비동기 프로그래밍이다. 비동기란 무엇인가? 동기화를 지원하지 않는다는 이야기다.
동기 프로그래밍을 A 작업자의 K라는 결과물을 B 작업자가 받아서 처리하는 것이라고 하면,
비동기 프로그래밍은 A 작업자가 K를 끝냈던 못 끝냈던 B 작업자가 현재 K의 상태를 보고 처리하는 것이다.
동기 프로그래밍

비동기 프로그래밍

때문에 Toast는 10억이 아닌 0을 출력하게 되는 것이다.
이와 같은 상황을 방지하기 위해선 Toast역시 다른 쓰레드에서 작동하도록 구현해야하고 결과는 다음과 같다.
button.setOnClickListener {
var a = 0
Thread {
for (i in 0..10억) {
a++
}
Toast.makeText(context, "$a", Toast.LENGTH_SHORT).show()
}.start()
}
물론 Toast는 UI요소이기 때문에 Main 쓰레드에서만 작동하지만 println을 사용한다고 하면 이렇게 쓰레드를 작성할 수 있겠다.
이처럼 비동기 프로그래밍은 이전 코드의 결과물은 신경쓰지 않으며 독립적인 공간에서 오래 걸리는 작업을 하기 위해 존재하는 개념입니다. 결과물 또한 다음 코드에 영향을 주지 않죠.
정말 처음 접하면 이해하기도 어려운 개념이고 아무리 봐도 이해가 잘 안되지만, 개발을 하는데 있어 반드시 필요한
지식이기 때문에 지속적으로 알아보고 찾아보면 좋겠네요.
네트워크나 데이터베이스를 다루는 부분에서는 특히 신경을 써야하기도 합니다. (물론 트래픽이 적고
데이터의 크기가 크지 않다면 비동기로 다루지 않아도 큰 문제는 없긴....하죠)
틀린 부분이나 이해가 안되는 부분은 댓글로 남겨주세요 > 3<
'CS' 카테고리의 다른 글
| [CS] Call By Value와 Call By Reference (값에 의한 호출, 참조에 의한 호출) (0) | 2021.09.30 |
|---|