728x90
동시성(Concurrency)과 병렬성(Parallelism)
- 동시성
- 동시에 실행되는 것처럼 보이게 하는 것
- 하나의 코어에서 여러 개의 스레드를 동작시키기 위한 방식
- 여러 개 스레드를 컨텍스트 스위치(context switch)로 번갈아 가면서(interleaved) 실행
- 싱글 코어, 멀티 코어에서 모두 구현 가능
- 병렬성
- 여러 개의 코어가 실제로 각각 여러 개의 스레드를 맡아 동시에 처리하는 것
- 물리적 코어가 필요하므로 멀티 코어에서만 구현 가능
즉, 동시성과 병렬성 주제는 물리적 하드웨어 이슈에 더 가깝다.
콜백 지옥과 콜백 함수
콜백 함수
콜백 함수: 다른 함수의 매개변수에 함수의 이름을 적어 넘겨준 함수이다. 함수를 명시적으로 호출하는 것이 아니라 이벤트 발생하면 이벤트 핸들러가 어떤 상태를 바꾸는 콜백 함수를 호출하게 된다.
매개변수로 콜백 함수를 넘겨 받은 함수는 콜백 함수를 필요에 따라 즉시(동기적으로 sync) 실행할 수도 있지만 보통은 나중에 어떤 이벤트 발생 이후에 나중에(비동기적으로 async) 실행하는 게 일반적이다.
콜백 지옥
asyncFunc1("something", (err, data) => {
asyncFunc2("something", (err, data) => {
asyncFunc3("something", (err, data) => {
asyncFunc4("something", (err, data) => {
asyncFunc5("something", (err, data) => {
asyncFunc6("something", (err, data) => {
// 최종적으로 작업 처리
});
});
});
});
});
}); // 문장 끝에는 세미콜론도 꼭 붙여줄 것
위와 같은 코드는 의미적으로는 아래와 비슷하다. 하지만 조건 표시도 없고 복잡한 괄호와 중괄호, 세미콜론 기호로 코드를 보기가 너무나 어렵다.
if (a) {
if (b) {
if (c) {
if (d) {
if (e) {
if (f) {
// 최종적으로 할 일
}
}
}
}
}
}
만약에 에러 처리 구문이라도 들어있다면 코드 보기가 훨씬 더 어려워진다.
asyncFunc("something", (err, data) => {
if (err) throw new Error("something wrong");
asyncFunc("something", (err, data) => {
if (err) throw new Error("something wrong");
asyncFunc("something", (err, data) => {
if (err) throw new Error("something wrong");
asyncFunc("something", (err, data) => {
if (err) throw new Error("something wrong");
asyncFunc("something", (err, data) => {
if (err) throw new Error("something wrong");
asyncFunc("something", (err, data) => {
if (err) throw new Error("something wrong");
// 최종적으로 작업 처리
});
});
});
});
});
}); // 문장 끝에는 세미콜론도 꼭 붙여줄 것
이렇게 중첩된 콜백 함수 호출 형태로 코드를 작성하다보면 실수하기 쉽고 오류를 찾기 어려워 디버깅이 힘들다.
따라서 다트는 콜백 지옥을 벗어날 수 있는 Future와 async, await를 제공한다.
728x90
LIST
'Flutter' 카테고리의 다른 글
Flutter - WebScoket (2) | 2023.11.07 |
---|---|
Flutter - JWT (1) | 2023.11.07 |
Flutter - Generators (제너레이터) (0) | 2023.11.07 |
Flutter - Timer (1) | 2023.11.06 |
Flutter - Future , async , await (2) | 2023.11.06 |