기술 면접 단골 질문: “동기와 블로킹이 같나요?”
이 질문에 제대로 답하기 위해선 개념을 구분하고, 조합해서 설명하는 능력이 필요합니다.
📌 개념 정리
✅ 동기(Synchronous)
- 작업 완료 여부를 확인한 뒤 다음 작업을 수행
- 즉, 순차적 흐름을 강제함
- 예: 함수 호출 → 결과 반환 → 다음 줄 실행
✅ 비동기(Asynchronous)
- 작업 완료 여부를 기다리지 않고, 다음 작업을 수행
- 결과는 콜백/이벤트/프로미스/await 등을 통해 나중에 처리
- 병렬적 작업 흐름에 적합
✅ 블로킹(Blocking)
- 함수 호출 시 작업이 끝날 때까지 기다림 (제어권 반환 X)
- 작업 중인 동안 프로그램 흐름이 멈춤
✅ 논블로킹(Non-blocking)
- 함수가 즉시 리턴됨 (작업이 끝나지 않아도)
- 결과는 나중에 확인하거나, 실패 예외를 통해 처리
🔁 네 가지 조합 설명
조합 설명 예시
| 동기 + 블로킹 | 요청 후 작업이 끝날 때까지 기다리고, 순차적으로 실행 | 일반 함수 호출, 파일 읽기 |
| 비동기 + 논블로킹 | 요청 후 기다리지 않고 다음 작업 수행, 결과는 콜백 등으로 | setTimeout(), Node.js, asyncio |
| 동기 + 논블로킹 | 작업 완료를 기다리지는 않지만, 직접 체크하면서 순차 실행 | while로 반복 체크, 폴링 방식 |
| 비동기 + 블로킹 | 결과는 나중에 처리하지만, 현재 작업은 멈추는 경우 (매우 드묾) | 실무에서 거의 안 씀 |
📎 예시로 보는 개념 조합
🔸 비동기 + 논블로킹
- setTimeout(), fetch(), await
- 웹 브라우저는 파일 다운로드 중에도 다른 탭을 열 수 있다
- 결과는 콜백이나 Promise로 처리됨
🔸 동기 + 블로킹
- socket.recv() (블로킹 모드), read() 함수
- 요청 결과가 올 때까지 아무 일도 하지 않음
🔸 동기 + 논블로킹
- 논블로킹으로 요청하고, 주기적으로 상태를 확인 (폴링)
// Java에서 백그라운드 스레드를 돌리고, 메인에서 계속 체크
while (!thread.isDone()) {
System.out.println("아직 완료되지 않음");
}
// 완료되면 다음 작업 수행
🔸 비동기 + 블로킹
- 이론적으로 존재하나 실무에서는 거의 사용되지 않음
- Async인데 내부 작업은 Blocking (이상적인 구조 아님)
⚠️ 오해 방지 포인트
- 동기 ≠ 블로킹, 비동기 ≠ 논블로킹
→ 각각은 독립적인 개념입니다. - async/await는 코드 구조상 동기처럼 보이게 만들지만,
내부적으로는 비동기 + 논블로킹 방식으로 작동합니다.
🎯 면접에서 이렇게 말해보세요
“동기/비동기는 작업 흐름의 순차 여부를 말하고, 블로킹/논블로킹은 함수 호출이 현재 흐름을 멈추는지 여부입니다. 예를 들어 setTimeout()은 비동기이자 논블로킹 함수이며, 일반적인 파일 입출력은 동기 + 블로킹 방식입니다.”
'Programming > 기술 면접' 카테고리의 다른 글
| [개발자 기술 면접 대비] 🌳 검색 자료구조로서 해시 테이블과 이진 탐색 트리 비교 (1) | 2025.07.25 |
|---|---|
| [개발자 기술 면접 대비] 🧩 Hash 충돌 시 내부 데이터 탐색은 어떻게 이루어질까? (1) | 2025.07.25 |
| [개발자 기술 면접 대비] 🔄 I/O와 Non-blocking I/O의 차이 (2) | 2025.07.25 |
| [개발자 기술 면접 대비] 🧠 메모리 구조의 네 가지 영역 설명 (2) | 2025.07.25 |
| [개발자 기술 면접 대비]💡 블로킹(Blocking)과 논블로킹(Non-blocking)의 차이 (1) | 2025.07.25 |