BOID

[iOS] 비동기와 동기에 대해 - HoonIOS 본문

IOS 시작기

[iOS] 비동기와 동기에 대해 - HoonIOS

HoonIOS 2021. 5. 10. 10:16

안녕하세요, HoonIOS입니다. :)

 

비동기와 동기에 대해서는 개발 공부를 하다가 보면 많이 보이는 단어입니다. 

 

비동기는 클로저에서 대표적으로 실행되는 처리입니다.

동기는 음....... 🤨 대표적으로 뭐가 있을까요... 흠....

 

우선 비동기와 동기 처리의 뜻을 먼저 살펴보겠습니다.

 

비동기 & 동기  처리 구분

  1. 비동기 처리 기법

  2. - 동시에 처리를 하는것으로 여러 일을 중복으로 처리하면서 실행을 하는 것을 말합니다.

    - 앞 명령이 일처리를 하고 있다가 추가 일처리가 생기면 아예 새로운 흐름의 일처리가 생기게 됩니다.
  3. 동기 처리 기법
    - 일이 내려오면 들어오는 순서대로 차근차근 처리하는것을 뜻해 하나의 일을 완료할때까지 다음 일로 넘기지 않는다.
    ( 자료구조중에서 선입선출 역할일 큐라고 생각이 듭니다. )

    - 앞 명령이 끝날때까지 기다렸다가 다음 명령을 처리하는 방식입니다.

 

우선 간단하게 일처리를 어떻게 하는지 한번 살펴봤는데요, 비동기 & 동기 일처리를 하는것을 보면 누가 봐도 비동기 처리 기법이 효율적으로 처리를 할 수 있는 게 눈으로 딱 보입니다.

 

만약... 안 보이면 내가 카페 사장이다 상상을 해보시고 알바생이 한번에 3 4개의 커피를 동시에 만드는 분과 한번에 1개씩 밖에 못만드는 알바생이 있으면 어느 알바생이 더 효율적인지 생각을 해보시면 됩니다. :)

 

동기 처리는 간단하고 그냥 들어오는 순서대로 구현하는 코드이니 이번 포스팅에서 개념으로만 이해를 하고 비동기 처리 기법에 대해 더 알아보겠습니다.

 

 비동기 처리 기법

 

비동기 처리 기법의 장점으로는 뭐가 있을까요?

  •  여러 일을 동식에 처리하기 때문에 동기 방식보다 대기시간을 줄여줄 수가 있어서 매우 효율적인 면입니다.

놀랍게 이 위의 장점에서 단점도 생겨나는 데요

  • 중간에 이벤트가 발생해 버리면 이것도 처리를 해줘야 하기 때문에 구성에 있어 복잡해질 수 있습니다.

DispatchQueue.main.async 함수가 함수 내부에 있을 경우 바깥에 있는 함수가 종료가 되어도 DispatchQueue.main.async함수는 영향을 받지 않습니다. 왜냐하면 새로운 흐름으로 구현되기 때문입니다.

 

예시를 한번 살펴보겠습니다.

* 코드 설명

  • 이 코드를 보시면 for문을 처음 타자마자 함수가 return 되지만 DispatchQueue의 코드들은 끝까지 실행되는 것을 볼 수 있습니다.

스위프트에서는 비동기를 구현하는 기능이 총 2가지가 있다고 합니다.

* 첫 번째로 델리게이트 패턴을 구현한 방식입니다.

  • 네트워크 통신에만 비동기 처리로서 NSURLConectionDelegate객체를 이용하는데 델리게이트 객체에 이미지 내려받기에 대한 처리를 위임하고 내려받기가 완료되면 델리게이트 객체가 특정 메서드를 호출하게 해 이 메서드 내부에서 처리할 작업을 정의하는 방식으로 구현이 됩니다.

* 두 번째로 범용 비동기 함수를 이용하는 것입니다.

  • 스위프트에서는 비동기 실행 함수 DispatchQueue.main.async()를 제공해 개발자가 직접 스레드에 접근하지 않고 비동기 방식으로 메인 스레드에서 비동기 방식으로 처리를 할 수 있도록 지원하는 것입니다.
    . async는 비동기로,. sync는 동기로 처리해주게 해주는 메서드입니다.
  • 병렬 처리와 스레드 풀에 기반을 둔 비동기 방식을 구현을 해줍니다.
  • 해당 코드 안에 구현을 하면 멀티코어 프로세서에 적절한 앱을 만들어지게 되는데 이렇게 코드를 구현해주면 독립적인 형태가 됩니다.
  • 이렇게 비동기 함수를 이용하면 새로운 실행 흐름을 따로 아예 만들어내게 됩니다. 따라서 이 방식으로 처리된 코드는 기존 실행 흐름 하고는 별도로 처리돼 실행 순서를 보장하지 못합니다.

    예를 들어서 설명해 보겠습니다.

    DispatchQueue.main.async 클로저에 있는 코드가 먼저 작성했다고 해서 이 뒤에 작성된 코드보다 먼저 실행이 될 것이다 이런 보장이 없습니다. ㅎㅎ

    그렇기 때문에 만약에 비동기에 구현한 코드의 결과를 가지고 무엇인가 작성을 해야 된다면 이 코드밖에 실행하는 것보다 실행 안에서 구현을 해야 합니다. 왜냐하면 이 코드 밖에 실행해버리면 이게 코드가 먼저 실행될지 후에 실행될지 모르기 때문이죠

  • main 스레드에서 비동기 처리를 해봤는데 async 코드 안에 있는 코드를 호출하면서 밖에 있는 코드도 같이 호출을 합니다.

    참고사항으로 main스래드로 동기 처리 sync코드를 호출하면 데드락이 걸리므로 유의해야 합니다.

※ 참고

  • DispatchQueue는 main큐와 Global큐가 있습니다.
  • main 큐는 메인 스레드에서 작동하는 큐입니다.
  • Global큐는 우선순위에 따라 작동하는 큐입니다.
    (high, default, low, background의 우선수가 있습니다.)
  • 위의 코드를 globa큐로 비동기 실행을 하면 요래 뒤죽 박죽 나오게 됩니다.

 

 

동기와 비동기 처리에 대해 알아봤습니다. 

UI 쪽은 비동기 처리로 처리를 해줘야 하기 때문에 매우 중요한 내용입니다.

 

공부하다가 추가할 내용 있으면 더 추가하겠습니다. 혹시 제가 잘못된 정보를 적어놨으면 댓글로 알려주시면 감사하겠습니다.!

반응형
Comments