728x90

1. JavaScript Engine

Call Stack(호출 스택) : 코드들이 짜여진 순서대로 한 줄 한 줄 들어가서 실행되는 공간(single threaded : 한 번에 코드 한번 수행 가능)

Heap : 변수, 함수 등이 할당되는 공간

 

2. Web APIs

setTimeout과 같은 비동기 함수들(APIs)이 정의되어 있는 영역

비동기 함수들이 Call Stack에 들어오면 Web API 영역으로 이동된다고 생각하자. 

이러한 비동기 함수들은 작업이 완료되면 callback 함수를 callback queue에 추가한다. 

 

3. Callback Queue

비동기 함수 작업이 완료된 후, 실행이 되기 위해 다시 Call Stack에 들어가기 전에 대기하는 영역.

해당 함수가 어떤 형태이냐에 따라서 대기 순서가 바뀌는데 순서는 아래와 같다.

1. Microtask Queue(Job Queue) : Promise 함수

2. Animation Frames

3. Task Queue(Event Queue) : setTimeout 함수

console.log(1);

setTimeout(() => console.log("setTimeout"));

Promise.resolve() //
  .then(() => console.log("Promise"));

console.log(2);

// 결과값
// 1
// 2
// "Promise"
// "setTimeout"

 

4. Event Loop

call stack에 작업중인 코드가 있는지 없는지 확인하는 과정.

call stack에 작업중인 코드가 없다면, callback queue에 대기하고 있던 작업들(콜백 함수)을 꺼내와서 call stack에 넘겨주는 역할을 한다.

 

5. JavaScript 내부 동작 원리 간단 정리

JavaScript는 기본적으로 웹 페이지를 작동시키기 위한 프로그래밍 언어이다. 웹페이지는 거의 즉각적이어야 한다.

JavaScript는 동기적으로 작동한다. 한 줄 한 줄(call stack).

그런데 즉각적으로 수행되지 못하는 코드들이 있다.(setTimeout, promise 등등)

그래서 JavaScript는 시간이 오래 걸리는 작업들을 Web APIs에게 넘겨버렸다. 

이러한 코드들은 작업이 완료되면 콜백함수를 callback queue에 추가한다. 

callback queue에 들어온 콜백함수들이 call stack에 들어가서 실행되기 위해서는 call stack에서 작업 중인 코드가 있는지 없는지 확인이 필요하다.

이러한 확인 절차를 거쳐 call stack에 아무것도 없을때 콜백 함수를 call stack에 추가해주는 것이 바로 event loop다. 

 

참고 자료

자바스크립트와 이벤트 루프

우리밋_woorimIT

코딩애플

반응형
728x90

Study Planner(Google Spredsheet)
Book Library(Notion)

 

Today Read Hours Total Read Hours
2.5 596.5

 


Today I Read

 

Book No. Hours
(Sum)
Title Author Date Pages IL BL
79 0.0
(5.5)
P.S. I Still Love You(Audio) Jenny Han 2021.11.01 ~
ING
248 UG 4.3
81 0.0
(9.5)
Fluent Forever: How to Learn Any Language Fast and Never Forget It Gabriel Wyner 2021.11.11 ~ 
ING
111~/326 - -
83 2.5
(18.0)
Son Lois Lowry 2021.11.28 ~
ING
239~286/303 MG+ 5.0

 


 

Son. 코딩 과제만 아니었으면 오늘 중으로 다 읽었을 것 같은데 아쉽다. 정말 시간 가는 줄 모르게 재밌게 읽었다. 그리고 읽고 싶은 책을 정리한 걸 봤는데 74권이나 된다. 언제 이걸 다 읽나 싶다가도 이렇게나 읽을게 많다는게 좋기도 하다. 서두르지 말고 천천히 읽어 나가야겠다.
반응형
728x90

1. 동기(synchronous)와 비동기(asynchronous)

동기란, 호이스팅(선언이 제일 위로 올라가는 것)이 된 이후부터 코드가 작성된 순서대로 작동한다는 의미이다. 

동기란 말을 처음 들었을 때는 동기화란 단어가 생각이 나서 "어떤 작업이 동시에 같이 일어나는 것인가?"라 생각을 했었는데, 전혀 다르다.

반면 비동기는 JavaScript의 동기적인 특성인 코드가 작성된 순서를 따르지 않고, 특정 요청에 의해 해당 코드에 지연이 발생하더라도 기다리지 않고 바로 이어서 다음 코드를 실행한다는 의미이다. 

// Synchronous
function first() {
  console.log("first"); // 첫번째로 실행되고,
}
function second() {
  console.log("second"); // 이어서 바로 실행된다. 
}
first()
second()
	
// Asynchronous
function first() {
  setTimeout(() => console.log(first), 5000); 
  // first 함수가 호출되고, 5초 동안 기다린 다음 결과값을 출력하고, 그 다음으로 second 함수가 실행되는게 아니다.
}
function second() {
  console.log("second"); 
  // first 함수가 호출되고, 5초의 시간이 흐르는 사이에 second 함수를 실행하고, 이후에 first 함수의 결과값이 출력된다.
}
first()
second()

 

2. callback(콜백)

callback 함수는 다른 함수가 실행을 끝낸 뒤 실행되는 즉, call back 되는 함수를 말한다.

함수의 parameter(매개변수)로 들어가서 실행되는 함수이다.

// Synchronous callback
function synchronousPrint(print) {
  print();
}
synchronousPrint(() => console.log("hello")); 
// hello를 출력하는 함수를 인자(argument)로 synchronous 함수에 전달 ==> 곧바로 synchronous 함수 실행(동기)

// Asynchronous callback
function asynchronousPrint(print, timeout) {
  setTimeout(print, timeout);
}
asynchronosPrint(() => console.log("hello"), 2000); 
// hello를 출력하는 함수를 인자(argument)로 asynchronous 함수에 전달 ==> 2초 후 asynchronous 함수 실행(비동기)

callback hell(콜백지옥)의 문제점 

1. 가독성이 떨어진다. => 어디서 어떻게 연결되어지는지 한눈에 알아보기 힘들다. 

2. 디버깅, 에러 분석, 유지/보수가 어렵다. 1번 이유때문.

 

3. Promise

Promise란?

JavaScript에서 제공하는 비동기를 간편하게 처리할 수 있도록 도와주는 object(객체)

네트워크 통신을 하거나, 파일을 읽어오는 행위 등 시간이 걸리는 일들은 promise를 만들어서 비동기적(병렬로 처리한다고 이해하면 쉬울 것 같다.)으로 처리하는 것이 좋다. 

Promise의 state는 뭘까?

promise의 state란 promise의 처리 과정을 의미한다.

기능이 수행 중인지(pending), 완료가 되어서 성공했는지(fulfilled), 실패했는지(rejected)를 나타내는 상태

Producer, Consumers란?

// 1. Producer(원하는 기능을 수행해서 해당하는 데이터를 만들어낸다.)
// Promise가 생성되면 자동적으로 실행된다.
const promise = new Promise((resolve, reject) => {
  console.log("doing somthing...");
  setTimeout(() => {
    resolve("Hello, World!"); // 콜백 함수의 인자 resolve를 호출하면 이행(fulfilled) 상태가 된다.
    // reject(new Error("no network")); // reject를 호출하면 실패(rejected) 상태가 된다. 
  }, 2000);
});

// 2. Consumers(원하는 데이터를 소비한다): then, catch, finally
promise
  .then((value) => {
    console.log(value);
  }) // 이행(fulfilled) 상태가 되면 then()을 이용하여 처리 결과 값을 받는다. 
  .catch((error) => {
    console.log(error);
  }) // 실패(rejected) 상태가 되면 catch()를 이용하여 처리 결과 값을 받는다. 
  .finally(() => {
    console.log("Done");
  }); // promise 이행/실패에 상관없이 마지막에 호출되어진다.

Promise chaining이란?

여러 개의 promise를 연결하는 것.

const fetchNumber = new Promise((resolve, reject) => {
  setTimeout(() => resolve(1), 1000);
}); // 이행 상태가 되어 1초뒤 resolve에 값이 들어온다. 

fetchNumber
  .then((num) => num * 2) // num parameter(매개변수)에 1이 들어오고 해당 콜백함수를 수행한 결과 값 2를 리턴한다.
  .then((num) => num * 3) // num parameter(매개변수)에 2가 들어오고 해당 콜백함수를 수행한 결과 값 6을 리턴한다.
  .then((num) => {
    return new Promise((resolve, reject) => {
      setTimeout(() => resolve(num - 1), 1000);
    });
  }) // 새로운 promise를 만들어 1초 뒤 resolve에 5가 들어온다. 
  .then((num) => console.log(num)); // num parameter(매개변수)에 5가 들어오고 해당 콜백함수를 수행한다.

 

4. async/await

async와 await 이란? 

깔끔하게 promise를 사용할 수 있는 방법

Syntactic sugar

기능은 동일하지만 더 간결한 코드를 사용함으로써 직관성/편의성을 높여주는 프로그래밍 문법

ex) 삼항 연산자(Conditional (ternary) operator), 애로우 함수(arrow function), async 등등

async 사용 방법

// 기존 promise 사용 방법
function fetchUser() {
  return new Promise((resolve, reject) => {
    // do network request in 10 secs...
    resolve("ellie");
  });
}

// async 사용 방법(async = Syntactic sugar), 함수 앞에 async라는 키워드만 넣어주면 끝.
async function fetchUser() {
  // do network request in 10 secs...
  return "ellie";
}

const user = fetchUser();
user.then(console.log);
console.log(user);

await 사용 방법

// delay를 주는 promise 생성
function delay(ms) {
  return new Promise((resolve) => setTimeout(resolve, ms));
}

// 1초뒤 🍎를 받아오는 promise를 async 기능을 사용해서 생성
async function getApple() { // await 키워드는 async가 붙은 함수 안에서만 사용 가능
  await delay(1000);
  return "🍎";
}

// 1초뒤 🍌를 받아오는 promise를 async 기능을 사용해서 생성
async function getBanana() { 
  await delay(1000);
  return "🍌";
}

// 기존 promise를 사용해서 결과 값을 받아오는 방법(callback 지옥과 다를바 없다.)
function pickFruits() {
  return getApple().then((apple) => {
    return getBanana().then((banana) => `${apple} + ${banana}`);
  });
}

// await를 사용해서 결과 값을 받아오는 방법
async function pickFruits() {
  // JavaScript 특성상 동기적으로 🍎, 🍌의 promise를 실행할텐데,(2초가 걸리겠지)
  // 둘 사이의 연관성이 없다면 굳이 동기적으로 받아올 필요가 없다.
  // 따라서 Promise가 생성되면 자동적으로 실행되는 특징을 이용해서 변수(아래 두줄)를 생성해준다.
  // 두 함수가 동시에 실행되므로 시간 단축!(1초!)
  const applePromise = getApple();
  const bananaPromise = getBanana();
  const apple = await applePromise;
  const banana = await bananaPromise;
  return `${apple} + ${banana}`;
}

// 유용한 promise API: Promise.all(모든 promise들이 병렬적으로 작동해서 배열에 전달된다.)
function pickAllFruits() {
  return Promise.all([getApple(), getBanana()]) //
    .then((fruits) => fruits.join(" + "));
}

// 유용한 promise API: Promise.race(배열에 가장 먼저 전달된 promise 값을 받아온다.)
function pickOnlyOne() {
  return Promise.race([getApple(), getBanana()]);
}

 

참고 자료

드림 코딩 유튜브 - 자바스크립트 11~13

Evans Library

[번역] JavaScript: 도대체 콜백이 뭔데?

 

반응형
728x90

Study Planner(Google Spredsheet)
Book Library(Notion)

 

Today Read Hours Total Read Hours
1.5 594.0

 


Today I Read

 

Book No. Hours
(Sum)
Title Author Date Pages IL BL
79 0.0
(5.5)
P.S. I Still Love You(Audio) Jenny Han 2021.11.01 ~
ING
248 UG 4.3
81 0.0
(9.5)
Fluent Forever: How to Learn Any Language Fast and Never Forget It Gabriel Wyner 2021.11.11 ~ 
ING
111~/326 - -
83 1.5
(15.5)
Son Lois Lowry 2021.11.28 ~
ING
217~239/303 MG+ 5.0

 


 

Son. 어제와 똑같다. 확실히 책을 읽는 느낌이고, 책 자체의 IL, BL이 높진 않기 때문에 문장을 받아들이는데 큰 문제는 없다. 물론 모든 문장이 그렇다는 건 아니다. 느낌상 80% 정도는 이해되는 것 같다. 하지만 처음 영어원서읽기 할 때에 비해서는 읽는 게 수월해 진건 맞다.
반응형
728x90

Study Planner(Google Spredsheet)
Book Library(Notion)

 

Today Read Hours Total Read Hours
1.0 592.5

 


Today I Read

 

Book No. Hours
(Sum)
Title Author Date Pages IL BL
79 0.0
(5.5)
P.S. I Still Love You(Audio) Jenny Han 2021.11.01 ~
ING
248 UG 4.3
81 0.0
(9.5)
Fluent Forever: How to Learn Any Language Fast and Never Forget It Gabriel Wyner 2021.11.11 ~ 
ING
111~/326 - -
83 1.0
(14.0)
Son Lois Lowry 2021.11.28 ~
ING
202~217/303 MG+ 5.0

 


 

Son. 이 책을 다 읽고 뭘 읽을지 고민이다. 기존에 읽었던 책들중에 잘 이해가 안갔던 책을 한번 더 읽을지 계속 새로운 책을 읽을지...모두 나름의 장단점을 가지고 있는 것 같은데 아직 판단이 잘 안된다. 계속 새로운걸 읽고 싶은 마음이 더 크긴 한데, 반복학습이라는 측면에서는 다시 한번 읽는 것도 도움이 되니 말이다. 뭐 일단은 이 책 다 읽고 다시 생각해보면 되겠지.
반응형
728x90

Study Planner(Google Spredsheet)
Book Library(Notion)

 

Today Read Hours Total Read Hours
2.0 591.5

 


Today I Read

 

Book No. Hours
(Sum)
Title Author Date Pages IL BL
79 0.0
(5.5)
P.S. I Still Love You(Audio) Jenny Han 2021.11.01 ~
ING
248 UG 4.3
81 0.0
(9.5)
Fluent Forever: How to Learn Any Language Fast and Never Forget It Gabriel Wyner 2021.11.11 ~ 
ING
111~/326 - -
83 2.0
(13.0)
Son Lois Lowry 2021.11.28 ~
ING
170~202/303 MG+ 5.0

 


 

Son. 역시나 복병을 만났다. 스토리 진행이 더뎌지고, 상세한 설명이 나오는 부분. 영어 공부하는 입장에서야 좋을 수도 있지만 책을 읽는 입장에서는 너무 지루해지는 순간이기도 하다. 상세하다보니 단어도 어렵다. 그냥 뭐 계속 읽어나가야지.
반응형
728x90

Study Planner(Google Spredsheet)
Book Library(Notion)

 

Today Read Hours Total Read Hours
1.0 589.5

 


Today I Read

 

Book No. Hours
(Sum)
Title Author Date Pages IL BL
79 0.0
(5.5)
P.S. I Still Love You(Audio) Jenny Han 2021.11.01 ~
ING
248 UG 4.3
81 0.0
(9.5)
Fluent Forever: How to Learn Any Language Fast and Never Forget It Gabriel Wyner 2021.11.11 ~ 
ING
111~/326 - -
83 1.0
(11.0)
Son Lois Lowry 2021.11.28 ~
ING
153~170/303 MG+ 5.0

 


 

요즘 단어에 조금더 집중하고 있다. 
반응형
728x90

Study Planner(Google Spredsheet)
Book Library(Notion)

 

Today Read Hours Total Read Hours
1.0 588.5

 


Today I Read

 

Book No. Hours
(Sum)
Title Author Date Pages IL BL
79 0.0
(5.5)
P.S. I Still Love You(Audio) Jenny Han 2021.11.01 ~
ING
248 UG 4.3
81 0.0
(9.5)
Fluent Forever: How to Learn Any Language Fast and Never Forget It Gabriel Wyner 2021.11.11 ~ 
ING
111~/326 - -
83 1.0
(10.0)
Son Lois Lowry 2021.11.28 ~
ING
139~153/303 MG+ 5.0

 


 

역시 단어는 많이 알면 알수록 좋다. 
반응형
728x90

Study Planner(Google Spredsheet)
Book Library(Notion)

 

Today Read Hours Total Read Hours
1.5 587.5

 


Today I Read

 

Book No. Hours
(Sum)
Title Author Date Pages IL BL
79 0.0
(5.5)
P.S. I Still Love You(Audio) Jenny Han 2021.11.01 ~
ING
248 UG 4.3
81 0.0
(9.5)
Fluent Forever: How to Learn Any Language Fast and Never Forget It Gabriel Wyner 2021.11.11 ~ 
ING
111~/326 - -
83 1.5
(9.0)
Son Lois Lowry 2021.11.28 ~
ING
118~139/303 MG+ 5.0

 


 

Son. 역시나 잘 읽히다가도 이해가 안 가는 부분이 꼭 생긴다. 이건 당연한 거라 딱히 문제가 되진 않는 것 같다. 그리고 내용이 머릿속에 그려지다 보니 단어들에 조금 더 집중을 하게 된다. 역시 단어의 중요성은 아무리 강조해도 지나치지 않는 것 같다. 
반응형
728x90

Study Planner(Google Spredsheet)
Book Library(Notion)

 

Today Read Hours Total Read Hours
1.5 586.0

 


Today I Read

 

Book No. Hours
(Sum)
Title Author Date Pages IL BL
79 0.0
(5.5)
P.S. I Still Love You(Audio) Jenny Han 2021.11.01 ~
ING
248 UG 4.3
81 0.0
(9.5)
Fluent Forever: How to Learn Any Language Fast and Never Forget It Gabriel Wyner 2021.11.11 ~ 
ING
111~/326 - -
83 1.5
(7.5)
Son Lois Lowry 2021.11.28 ~
ING
97~118/303 MG+ 5.0

 


 

이 책(Son)에 한해서인지는 모르겠지만, 뭔가 좀 읽기가 쉬워진 느낌이 든다. 한글책이든 영어책이든 마찬가지인 것 같은데 내용의 큰 줄기를 알게 되고, 책의 배경이 머릿속에서 그려지기 시작하면 읽는 게 수월해지는 것 같다. 지금도 딱 그런 상황인 것 같다. 어떤 장면인지 알고 있으니 모르는 단어가 나오더라도 '아 이런 의미겠구나' 하게 되는 것. 소설책을 읽는 게 도움이 되는 건 이런 상황 때문인 것 같다.
반응형
728x90

Study Planner(Google Spredsheet)
Book Library(Notion)

 

Today Read Hours Total Read Hours
2.0 584.5

 


Today I Read

 

Book No. Hours
(Sum)
Title Author Date Pages IL BL
79 0.0
(5.5)
P.S. I Still Love You(Audio) Jenny Han 2021.11.01 ~
ING
248 UG 4.3
81 0.0
(9.5)
Fluent Forever: How to Learn Any Language Fast and Never Forget It Gabriel Wyner 2021.11.11 ~ 
ING
111~/326 - -
83 2.0
(6.0)
Son Lois Lowry 2021.11.28 ~
ING
66~97/303 MG+ 5.0

 


 

영어원서읽기에 힘이 되는 글을 하나 발견했다. https://www.clien.net/service/board/lecture/16744375
하루에 2시간 이상은 책을 읽고 싶은데 생각만큼 쉽지가 않다. 그래도 꾸준히 하자.
반응형
728x90

Study Planner(Google Spredsheet)
Book Library(Notion)

 

Today Read Hours Total Read Hours
1.0 582.5

 


Today I Read

 

Book No. Hours
(Sum)
Title Author Date Pages IL BL
79 0.0
(5.5)
P.S. I Still Love You(Audio) Jenny Han 2021.11.01 ~
ING
248 UG 4.3
81 0.5
(9.5)
Fluent Forever: How to Learn Any Language Fast and Never Forget It Gabriel Wyner 2021.11.11 ~ 
ING
105~111/326 - -
83 0.5
(4.0)
Son Lois Lowry 2021.11.28 ~
ING
55~66/303 MG+ 5.0

 


 

요즘은 코딩하느라 책을 많이 못 읽고 있다. 그러다보니 진도가 잘 안나간다.
듣기, non-fiction, fiction 모두를 잡고 싶어서 책 세가지를 동시에 읽고 있는데 아무래도 전략을 바꿔야 할 것 같다.
한번에 한 책만 읽기로. 내일부터 시작!
반응형

+ Recent posts