
프로그래밍에서 한 번쯤은 들어봤을 용어들, Blocking / Non-Blocking / Synchronous / Asynchronous.
처음엔 헷갈릴 수 있다. "동기? 비동기? 블로킹? 안 기다리는 건가?" 헷갈리기 쉬운 이 개념들, "제어권" 과 "시간" 이라는 두 키워드를 통해 확실하게 구분해보자.

함수 A는 함수 B를 호출한다. 그리고 함수 A는 함수 B가 끝날 때까지 아무 것도 하지 못하고 대기한다.
🧠 쉽게 생각하면:
친구한테 파일 보내 달라고 하고 가만히 기다리는 상황
"파일 다 보내주면 그때 알려줘. 나 그거 받고 다음 할 일 할게!"
📊 흐름도:
🖼 예시 코드 (Java):
Scanner scanner = new Scanner(System.in);
String input = scanner.nextLine(); // 입력이 들어오기 전까지 프로그램 멈춤
System.out.println("입력값: " + input);

함수 A는 함수 B를 호출한다. 하지만, 함수 A는 함수 B가 끝나든 말든 자기 할 일을 계속한다.
🧠 쉽게 생각하면:
친구한테 파일 보내 달라고 하고, 다른 작업 먼저 시작하는 상황
"파일 다 되면 알아서 알려줘! 나 그동안 이메일 좀 보낼게"
📊 흐름도:

함수가 끝나자마자 바로 결과를 받아야 하는 경우다. 함수 A는 함수 B가 끝날 때까지 기다리고, 결과를 바로 받아서 다음 일을 처리한다는 말이다.
🧠 쉽게 생각하면:
"친구가 전화를 끊어야 나도 다음 일 할 수 있어"
📊 특징:
🖼 예시 코드 :
int result = calculate(); // 이게 끝나야 다음 줄 실행 가능
System.out.println("결과는 " + result);

함수가 끝난 후, 결과를 나중에 받아도 상관없는 경우다. 함수 A는 함수 B를 호출하고, 함수 B가 언제 끝나든 상관없이 자신의 코드를 진행한다.
🧠 쉽게 생각하면:
"설문조사 보냈고, 언제 회신 올지 모르지만 나는 다른 업무 먼저 할게"
🖼 자바스크립트 예시:
fetch('/api/data')
.then(response => response.json())
.then(data => console.log(data));
console.log("나는 먼저 실행돼요!");
| 조합 | 설명 | 실생활 비유 |
|---|---|---|
| Blocking + Sync | 기다리고, 결과도 바로 받아야 함 | 음식점에서 주문하고, 음식 나올 때까지 서서 기다리는 손님 |
| Non-Blocking + Sync | 기다리진 않지만, 결과는 즉시 확인함 | 주기적으로 전자레인지 들여다보며 음식 다 됐나 확인 |
| Blocking + Async | 기다리긴 하지만, 결과를 즉시 처리하진 않음 | 우체국 줄 서 있다가, 택배 부치고 결과는 다음날 문자로 받음 |
| Non-Blocking + Async | 기다리지도 않고, 결과도 나중에 처리 | 음식 배달 앱으로 주문하고 다른 일 하다 배달 오면 받기 |
Scanner scanner = new Scanner(System.in);
System.out.println("메시지를 입력해주세요:");
String message = scanner.nextLine(); // 사용자가 입력할 때까지 기다림
System.out.println("입력받은 메시지: " + message);
while (!queue.hasData()) {
// 다른 작업 수행
Thread.sleep(100); // 수시로 확인
}
String data = queue.get();
System.out.println("데이터 도착: " + data)
Future<String> future = executor.submit(() -> {
Thread.sleep(1000); // 비동기로 동작하지만
return "완료!";
});
String result = future.get(); // 여전히 get에서 기다림 = 블로킹
System.out.println("결과: " + result);
CompletableFuture.supplyAsync(() -> {
return "결과 도착!";
}).thenAccept(result -> {
System.out.println("받은 결과: " + result);
});
System.out.println("나는 기다리지 않아요.");
| 개념 | 기준 | 핵심 키워드 |
|---|---|---|
| Blocking / Non-Blocking | 제어권 기준 | 함수의 실행 권한을 넘기고 기다리는가? |
| Synchronous / Asynchronous | 시간 기준 | 결과를 즉시 받는가, 나중에 받는가? |