overriding, overloading
- overriding - ๋ฉ์๋๋ฅผ ์์๋ฐ์์ ๊ฐ์ ์ด๋ฆ์ ์๋ก์ด ํจ์๋ก ๋ง๋๋ ๊ฒ.
- overloading - ์ด๋ฆ์ด ๊ฐ์ ๋งค๊ฐ๋ณ์ ๊ฐ์/ํ์ ์ด ๋ค๋ฅธ ํจ์๋ฅผ ๋ง๋ค๋ฉด ๋ค๋ฅธ ํจ์๋ก ์ทจ๊ธํ๋ ๊ฒ. (js์๋ ์๋ ๊ฐ๋ . ๋ค์ ๋ง๋ ๊ฑธ๋ก ๋ฎ์ด์ฐ๊ธฐ ๋จ.)
๊ตฌ์กฐ ๋ถํด ํ ๋น
// ์๊ณ , [์ด๋ฆ, ์ฑ]์ ์์๋ก ๊ฐ์ง ๋ฐฐ์ด let arr = [1000, ["Hojun", "Lee"]] // ๊ตฌ์กฐ ๋ถํด ํ ๋น์ ์ด์ฉํด // ๊ณ์ข์๊ณ ์๋ arr[0] // firstName์ arr[1][0]์ // surname์ arr[1][1]์ ํ ๋น let [๊ณ์ข์๊ณ , [firstName, surname]] = arr;
error handling
let json = "{ bad json }"; try { let user = JSON.parse(json); // <-- ์ฌ๊ธฐ์ ์๋ฌ๊ฐ ๋ฐ์ํ๋ฏ๋ก alert( user.name ); // ์ด ์ฝ๋๋ ๋์ํ์ง ์์ต๋๋ค. } catch (e) { // ์๋ฌ๊ฐ ๋ฐ์ํ๋ฉด ์ ์ด ํ๋ฆ์ด catch ๋ฌธ์ผ๋ก ๋์ด์ต๋๋ค. alert( "๋ฐ์ดํฐ์ ์๋ฌ๊ฐ ์์ด ์ฌ์์ฒญ์ ์๋ํฉ๋๋ค." ); alert( e.name ); alert( e.message ); }
try { alert( 'try ๋ธ๋ก ์์' ); if (confirm('์๋ฌ๋ฅผ ๋ง๋์๊ฒ ์ต๋๊น?')) ์ด์ํ_์ฝ๋(); } catch (e) { // ์๋ฌ ์ก์ // e๋ฅผ ์ด์ฉํด์ ์๋ฌ์ ์ข ๋ฅ๋ ์ฒ๋ฆฌ ๊ฐ๋ฅ. alert( 'catch' ); } finally { // ์๋ฌ๊ฐ ์๋ ์๋ ๋ฌด์กฐ๊ฑด ์คํ alert( 'finally' ); }
-> http ํต์ status code ์ธ ๋ custom error ๋ง์ด ๋ง๋ ๋ค.
๋ก๊ทธ์ธ ์ ํจ์ฑ ๊ฒ์ฌ ์์ ์ฝ๋
์ฝ๋ฐฑํจ์
๋์ค์ ์คํํ ํจ์! ํจ์๋ฅผ ์คํํด์ ๋๊ธฐ๋ฉด ์๋จ. ์ด๋ฆ๋ง ๋๊ฒจ์ผํจ.
์ฝ๋ฐฑ ์ง์ฅ... => Promise ๋ก ํด๊ฒฐ.userData.login( id, pw, (user) => { userData.getData( user, (userData) => { ..์ฝ๋ฐฑ์ ์ฝ๋ฐฑ.. }, (fail) => { ..์ฝ๋ฐฑ์ ์ฝ๋ฐฑ.. } ); }, (fail) => { ..์ฝ๋ฐฑ์ ์ฝ๋ฐฑ.. }, (user) => { //์ด๋ฏธ์ง ๋ก๋ ..์ฝ๋ฐฑ์ ์ฝ๋ฐฑ.. }, (user) => { // ๊ณ์ข ์ฐ๋ ..์ฝ๋ฐฑ์ ์ฝ๋ฐฑ.. }, );
Promise - ๋น๋๊ธฐ
์๋ฒ๋ ํต์ ํ ๋ ์ฌ์ฉ.
๋ก๊ทธ์ธ ์ฑ๊ณต, ์ ์์ ์ธ url๋ก ์ ๊ทผํ๋์ง ์ด๋ฐ๊ฑฐ ์ ๋ถ ์ด๊ฑธ๋ก ์ก๋๋ค.// ์ฝ๋ฐฑํจ์๋ฅผ ์ธ์ ๋ถ๋ฅผ์ง ๋ชจ๋ฅด๊ฒ ์ง๋ง ์ธ์ ๋ถ๋ฅด๊ฒ ๋ค๊ณ (๋น๋๊ธฐ) ์ฝ์. // resolve(value) โ ์์ ์ด ์ฑ๊ณต์ ์ผ๋ก ๋ง๋ฌด๋ฆฌ๋๋ฉด ํธ์ถ, ๊ฒฐ๊ณผ๋ value์ ๋ด๊น // reject(error) โ ์์ ์ด ์คํจ์ ํธ์ถ, error๋ error์ ๋ด๊น let promise = new Promise(function(resolve, reject) { // ํ๋ผ๋ฏธ์ค๊ฐ ๋ง๋ค์ด์ง๋ฉด executor ํจ์ ์๋ ์คํ. // 10์ด ๋ค์ ์ผ์ด ์ฑ๊ณต์ ์ผ๋ก ๋๋ฌ๋ค๋ ์ ํธ๊ฐ ์ ๋ฌ๋๋ฉด์ result๋ 'done'์ด ๋ฉ๋๋ค. setTimeout(() => resolve("์ด์ ์ผ ๋๋จ!"), 10000); }); console.log('hello world'); // ๋ฐ๋ก ์ฐํ. promise ์์ ์๋๊ฑด ๋น๋๊ธฐ์ ์ผ๋ก ์ผ์ด๋๊ณ ์๋ค๋ ๊ฒ. console.log(promise); // 10์ด ๋์์ pending console.log('hello world2'); // ์ญ์ ๋ฐ๋ก ์ฐํ.
// ์ด ํํ๋ฅผ ์์ฃผ ๋ง๋๊ฒ ๋ ํ ๋ ์ ๊ธฐ์ตํด๋๊ธฐ. new Promise((resolve, reject) => { ... code ... }) .then(...code...) // Promise ์์ ๊ฒ์ด ์ํ์ด ๋๋์ผ then ์ด ์ํ๋๋ค. .then(...code...) // ์์ then ์ด ๋๋์ผ ์ํ๋๋ค. Promise Chaining .finally(...code...) // ์ฑ๊ณต ์คํจ์ ์๊ด ์์ด Promise ์ฒ๋ฆฌ ํ ์คํ. .catch(...code...)
// ์ ๋ฆฌ ์ loadScript('1.js', function(error, script) { if (error) { handleError(error); } else { // ... loadScript('2.js', function(error, script) { if (error) { handleError(error); } else { // ... loadScript('3.js', function(error, script) { if (error) { handleError(error); } else { // ๋ชจ๋ ์คํฌ๋ฆฝํธ๊ฐ ๋ก๋ฉ๋ ํ, ์คํ ํ๋ฆ์ด ์ด์ด์ง๋๋ค. (*) } }); } }) } }); // ์ ๋ฆฌ ํ - catch๋ ๋ฃ์ด์ฃผ๋ฉด ๋จ. loadScript("/article/promise-chaining/one.js") .then(script => loadScript("/article/promise-chaining/two.js")) .then(script => loadScript("/article/promise-chaining/three.js")) .then(script => { // ์คํฌ๋ฆฝํธ๋ฅผ ์ ์์ ์ผ๋ก ๋ถ๋ฌ์๊ธฐ ๋๋ฌธ์ ์คํฌ๋ฆฝํธ ๋ด์ ํจ์๋ฅผ ํธ์ถํ ์ ์์ต๋๋ค. one(); two(); three(); });
new Promise(function(resolve, reject) { // Promise์ ์คํ์ด callback ์๋๋ฉด ํจ์ ๋ฐ์ผ๋๊น setTimeout(() => reject('error'), 1000); }).then(function(result) { // resolve ์ด๋ฉด catch์ ๋ค์ด๊ฐ์ง ์์ผ๋ฏ๋ก ์ฌ๊ธฐ๊น์ง ๋์ด. alert(result + ' : ์ ์ํ!'); return result + 'one'; }).catch(function(result) { // reject ์ด๋ฉด catch์ ์กํ๋ฏ๋ก ์ฌ๊ธฐ๋ง ๋์ด. alert(result + ' : ์ ๋ฌ ๋ฐ์!'); // 1 return result + 'two'; }).then(function(result) { alert(result + ' : ์ ์ํ!'); // 2 return result + 'three'; });
Promise.all , allSettled ์ด๋ฐ ๋ฉ์๋๋ ์๋ค.
๋์ค์ ์์๋ด์~
fetch
// fetch๋ Promise ๋ฐฉ์์ด๋ผ then, catch, finally ์ธ ์ ์๋ค. fetch('https://์ด์ฉ๊ตฌ.json') .then(function(response) { console.log(1); return response.json(); }) .then(function(json) { console.log(2); console.log(json); return json }) console.log(3); console.log(4);
async, await
Promise์ syntatic sugar.
์๋ await๋ async ์์์๋ง ๋์ํ๋๋ฐ ๋ฐ์์๋ ๋์ํ ์ ์๊ฒ ๋ฐ๋์๋ค.// async๋ฅผ ๋ถ์ด๋ฉด Promise ์ฒ๋ผ ์ฌ์ฉํ ์ ์๋ค. async function f() { let promise = new Promise((resolve, reject) => { setTimeout(() => resolve("์๋ฃ!"), 1000) }); // promise ๊ฐ ๋๋ ๋๊น์ง ๊ธฐ๋ค๋ฆฐ๋ค. let result = await promise; let response await fetch('์ด์ฉ๊ตฌ.json'); // ์ด๋ฐ์์ผ๋ก ์ฌ์ฉ. return 100; } f().then(alert);
ํธ์ถ ์คํ
// ํจ์๊ฐ ํธ์ถ๋ ๋ ๋ง๋ค ์๋ก ์์.
anonymous // ๊ฐ์ ์ ์ญ ์ปจํ ์คํธ. ์์ ์์ ์์ ๋ง์ง๋ง์ ๋น ์ง.
Event Loop
๋ฐฑ๊ทธ๋ผ์ด๋, ํ ์คํฌ ํ, ํธ์ถ์คํ์ ๋ฃจํ๋ฅผ ์ด๋ฒคํธ ๋ฃจํ๋ผ๊ณ ํ๋ค. ์๋ฒฝํ ์ดํด๋ฅผ ํ ๋จ๊ณ์์ ํ ํ์๋ ์์ง๋ง ๋๋จํด์ง๋ ค๋ฉด(?) ๊ผญ ์์์ผํ๋ ๋ด์ฉ!
1. ๋ฉ๋ชจ๋ฆฌ์ ์คํํจ์ ์ ์ฌ
2. ํธ์ถ์คํ์ anonymous๊ฐ ๋ค์ด๊ฐ
3. console.log(1)์ด ํธ์ถ ์คํ์ ์์
4. console.log(1)์ด ์คํ๋์ด console์ 1์ ์ฐ๊ณ ์คํ์์ ์ ๊ฑฐ
5. ๋ฐฑ๊ทธ๋ผ์ด๋์ timer(์คํ, 1) (๊ณ์ ์๊ฐ์ ์นด์ดํ ํ๋ ์ค)
6. console.log(3)์ด ์คํ์ ์์
7. console.log(3)์ด ์คํ๋์ด console์ 3๋ฅผ ์ฐ๊ณ ์คํ์์ ์ ๊ฑฐ
8. anonymous ์ฌ๋ผ์ง
9. 1์ด๊ฐ ์ง๋๊ฐ๋ฉด ๋ฐฑ๊ทธ๋ผ์ด๋์์ ํ์คํฌ ํ๋ก '์คํ' ํจ์๋ฅผ ๊ฐ์ ธ์ด(๋ฐฑ๊ทธ๋ผ์ด๋์์ ์์ด์ง)
10. ํ์คํฌ ํ์์ ์คํํจ์๋ฅผ ํธ์ถ ์คํ์ผ๋ก ๊ฐ์ ธ์ด
11. '์คํ'ํจ์ ์์ console.log(2)๊ฐ ์์
12. console.log(2)์ด ์คํ๋์ด console์ 2๋ฅผ ์ฐ๊ณ ์คํ์์ ์ฌ๋ผ์ง
13. '์คํ' ํจ์๊ฐ ํธ์ถ ์คํ์์ ์ฌ๋ผ์ง
์ปค๋ฐ์ ๋ ผ๋ฆฌ์ ๋ณ๊ฒฝ์ด ์์ ๋!
๊ฐ๋ฅํ๋ฉด ์ปค๋ฐ ํฌ๊ธฐ๋ ์๊ฒ ์ชผ๊ฐ์! ์์ ๋จ์ ๋ณ๋ก ์์ฑํ๊ธฐ.
ํ๋ก์ ํธ ์ด๊ธฐ ๊ตฌ์ฑ / ๊ธฐ๋ฅ ๋ณ๋ก ๋๋๋ ๊ฒฝ์ฐ๊ฐ ๋ง๋ค.
ํ์ผ ์ฌ๋ฌ๊ฐ ๋ญํ ์ด๋ก ๊ฑด๋๋ฆฌ๋ ๊ฑด ์๊ด ์๋๋ฐ, + 1472 ์ค์ธ๋ฐ 'XXX ์์ ' ์ด๋ผ๊ณ ๋ก๊ทธ ์ฐํ์์ผ๋ฉด ๋น์ ์ ๊ทธ ๋ ์ฌ๋งํ๋ค (by ์กฐ์)
prototype ์ ์ด๋ค ๊ฐ์ฒด์ ๋ถ๋ชจ ์ญํ ์ ํ๋๋ฐ, ๋ชจ๋ ๊ฐ์ฒด์์ ๊ณต์ ํ๋ ํจ์๋ ํ๋กํผํฐ๋ฅผ ์ฌ์ฉํ๊ธฐ ์ํด ์ด๋ค. ์์ฑ์ ํจ์์ ์๋ก ์ฐธ์กฐ๋ฅผ ํ๊ณ prototype chain์ ๋ง๋ค๋ฉฐ,,, ์ด๋ฐ ๋ด์ฉ์ด์๋๋ฐ ์ฝ์ด๋ ์ฝ์ด๋ ๋์ด ์์๋ค.
์ผ๋จ ์ดํด๊ฐ ์๊ฐ๋๊ฑด ์๋๋ฐ prototype ๊ฐ๋ ์์ฒด๊ฐ ์ข ์ถ์์ ์ด๋ค๋ณด๋ ์..? ์..? ๋์ด ์๋์ง ํ๋ฉด์ ๊ณ์ ์ฝ์๋ค... ๋ค์ ๋ณด๋ 293~345... 26์ฅ์ ์ฝ์๊ฑฐ์๋ค......
๋์์ ์ฒ๋ฆฌํ๋ ๊ฒ์ฒ๋ผ ๋ณด์ด์ง๋ง ์๋ฐ์คํฌ๋ฆฝํธ๋ ์ฌ์ค ์ฑ๊ธ ์ค๋ ๋ ์ธ์ด๋ผ์ ํ๋ํ๋ ์ฒ๋ฆฌํ๊ณ ์๋ค. ๋น๋๊ธฐ ์์
์ ๋ง๋๋ฉด Web API (ajax, DOM event, Timer) ์๋ค๊ฐ ํด๋น ์์
์ ๋๊ฒจ๋ฒ๋ฆฐ๋ค.
๊ทธ๋ฆฌ๊ณ Web API๊ฐ ๋น๋๊ธฐ ์์
์ ๋๋ด๋ฉด ์์
์ Task Queue์ ๋ฃ์.
์ฑ๊ธ ์ค๋ ๋ == call stack์ด ํ๋๋ค.
Call stack์ ์์ ์ด ์ ๋ถ ๋๋ฌ๊ณ , Call stack ์ด ์์ ํ ๋น๋ฉด (asynchronous ๊น์ง ๋น ์ ธ๋๊ฐ๋ฉด) Task Queue์ ์์ดํ ์ Call Stack ์ ๋ฃ๊ณ ์ฒ๋ฆฌ.
๋น๋๊ธฐ์ธ ์ด์ Web API์ Task Queue๋ฅผ ๊ฑฐ์ณ์ ์ฌ ์ ๋ฐ์ ์์ผ๋ฏ๋ก ์ ์(?) order์ ์๋ ์ ๋ค๋ณด๋ค ๋์ค์ ์คํ๋๋ค.