다른 주체가 작업을 할 때 자신의 제어권이 있는지 없는지가 관심사.
✅ 참고
제어권
- 자신의 코드를 실행할 권리와 같은 것.
- 제어권을 가진 함수는 자신의 코드를 끝까지 실행하고 자신을 호출한 함수에게 돌려준다.
작업을 진행하다가 다른 주체의 작업이 시작되면 그 작업이 끝날 때까지 기다렸다가 자신의 작업을 다시 시작하는 것. 제어권이 없다.
다른 주체의 작업과 상관없이 자신의 작업을 하는 것. 제어권을 가진다.
호출되는 함수의 작업 완료 여부를 신경쓰냐에 따라 함수 실행-리턴의 순차적인 흐름을 따르냐 안따르냐가 관심사.
작업을 동시에 수행하거나, 동시에 끝나거나, 끝나는 동시에 시작.
시작과 종료가 일치하지 않으며, 끝나는 동시에 시작하지 않음.
함수 A는 함수 B의 리턴값을 필요로하기 때문에(Sync), B를 호출 후 B에게 제어권을 넘겨주고, B가 실행을 완료하고 리턴값과 제어권을 돌려줄때까지 기다린다.(Blocking).
ex) C or Java 코드 실행 후 커맨드에서 입력을 받는 경우, 제어권이 시스템에서 사용자로 넘어가고, 리턴값이 필요해서 사용자가 입력할 때까지 기다린다.
A가 B를 호출한 후 제어권을 넘기지 않고 자신의 코드를 실행한다.(Non-blocking) A는 B의 리턴값이 필요하기 때문에 계속해서 B에게 함수 실행 완료 여부를 묻는다.(Sync).
ex) 게임 데이터 로드율
A가 B를 호출했을 때 제어권을 넘기지 않고 계속해서 자신의 코드를 실행한다(Non-blocking). 또한 B를 호출할 때 callback 함수를 같이 전달해, B 함수는 작업이 끝나면 A에게서 받은 callback 함수를 실행한다(Async).
ex) JavaScript 비동기 callback. 프론트에서 서버로 api 요청을 하고 응답을 기다리지 않고 자신의 일을 계속해서 실행.
A는 B의 리턴에 신경쓰지 않고 callback 함수를 보내는데(Async), B의 작업에 관심이 없음에도 불구하고 A는 B에게 제어권을 넘긴다 (Blocking). 따라서 A는 관련 없는 B의 작업이 끝날 때까지 기다린다.