í¨ìì ëí´ ì¢ ë ê¹ì´ ììë³´ëë¡ íê² ìµëë¤.
í¨ì ì¬ííìµ, 첫 ë²ì§¸ 주ì ë ì¬ê·(recursion) ì ëë¤.
íë¡ê·¸ëë°ì ìë¡ê² íìµíë ì´ì¬ìê° ìëë¼ ì´ ì£¼ì ì ìµìíìë¤ë©´, 본 ì±í°ë¥¼ ê±´ëë°ì´ë ê´ì°®ìµëë¤.
ì¬ê·ë í° ëª©í ìì íë를 ëì¼íë©´ì ê°ë¨í ìì ì¬ë¬ ê°ë¡ ëë ì ìì ë ì ì©í íë¡ê·¸ëë° í¨í´ì ëë¤. 목í ìì ì ê°ë¨í ëì íëì 목í ìì ì ë³íí ìì ì¼ë¡ ë¨ìíìí¬ ì ìì ëë ì¬ê·ë¥¼ ì¬ì©í ì ììµëë¤. ê³§ ì´í´ë³´ê² ì§ë§, í¹ì ìë£êµ¬ì¡°ë¥¼ ë¤ë¤ì¼ í ëë ì¬ê·ê° ì¬ì©ë©ëë¤.
문ì í´ê²°ì íë¤ ë³´ë©´ í¨ììì ë¤ë¥¸ í¨ì를 í¸ì¶í´ì¼ í ëê° ììµëë¤. ì´ë í¨ìê° ì기 ìì ì í¸ì¶í ìë ìëë°, ì´ë¥¼ ì¬ê· ë¼ê³ ë¶ë¦ ëë¤.
ë ê°ì§ ì¬ê³ ë°©ì
ê°ë¨í ìì를 ììì¼ë¡ ì¬ê·ì ëí´ ììë³´ê² ìµëë¤. x를 n ì ê³±í´ ì£¼ë í¨ì pow(x, n)를 ë§ë¤ì´ë´
ìë¤. pow(x, n)ë x를 në² ê³±í´ì£¼ê¸° ë문ì ìë 결과를 ë§ì¡±í´ì¼ í©ëë¤.
pow(2, 2) = 4
pow(2, 3) = 8
pow(2, 4) = 16
구ííë ë°©ë²ì ë ê°ì§ê° ììµëë¤.
-
ë°ë³µì ì¸ ì¬ê³ 를 íµí ë°©ë²:
for루ífunction pow(x, n) { let result = 1; // ë°ë³µë¬¸ì ëë©´ì x를 në² ê³±í¨ for (let i = 0; i < n; i++) { result *= x; } return result; } alert( pow(2, 3) ); // 8 -
ì¬ê·ì ì¸ ì¬ê³ 를 íµí ë°©ë²: ìì ì ë¨ìííê³ ì기 ìì ì í¸ì¶í¨
function pow(x, n) { if (n == 1) { return x; } else { return x * pow(x, n - 1); } } alert( pow(2, 3) ); // 8
ì¬ê·ë¥¼ ì´ì©í ììê° ë°ë³µë¬¸ì ì¬ì©í ììì ì´ë¤ ë¶ë¶ìì 근본ì ì¸ ì°¨ì´ê° ìëì§ ì ì¬í ì´í´ë³´ì기 ë°ëëë¤.
pow (x, n)ì í¸ì¶íë©´ ìëì ê°ì´ ë ê°ëë¡ ëëì´ ì½ëê° ì¤íë©ëë¤.
if n==1 = x
/
pow(x, n) =
\
else = x * pow(x, n - 1)
n == 1ì¼ ë: 모ë ì ì°¨ê° ê°ë¨í´ì§ëë¤. ëª íí ê²°ê´ê°ì ì¦ì ëì¶íë¯ë¡ ì´ë¥¼ ì¬ê·ì ë² ì´ì¤(base) ë¼ê³ í©ëë¤.pow(x, 1)ëxì ëë¤.n == 1ì´ ìë ë:pow(x, n)ìx * pow(x, n - 1)ì¼ë¡ ííí ì ììµëë¤. ìíìì¼ë¡xn = x * xn-1ë¡ ííí ì ìê² ì£ . ì´ë¥¼ ì¬ê· ë¨ê³(recursive step) ë¼ê³ ë¶ë¦ ëë¤. ì¬ê¸°ì 목í ììpow(x, n)ì ê°ë¨í ëì(x를 ê³±í기)ê³¼ 목í ìì ì ë³íí ìì (pow(x, n - 1))ì¼ë¡ ë¶í íììµëë¤. ì¬ê· ë¨ê³ënì´1ì´ ë ëê¹ì§ ê³ì ì´ì´ì§ëë¤.
ì¦, powë n == 1ì´ ë ëê¹ì§ ì¬ê·ì ì¼ë¡ ìì ì í¸ì¶í©ëë¤.
pow (2, 4)를 ê³ì°íë ¤ë©´ ìëì ê°ì ì¬ê· ë¨ê³ê° ì°¨ë¡ëë¡ ì´ì´ì§ëë¤.
pow(2, 4) = 2 * pow(2, 3)pow(2, 3) = 2 * pow(2, 2)pow(2, 2) = 2 * pow(2, 1)pow(2, 1) = 2
ì´ë ê² ì¬ê·ë¥¼ ì´ì©íë©´ í¨ì í¸ì¶ì ê²°ê³¼ê° ëª íí´ì§ ëê¹ì§ í¨ì í¸ì¶ì ë ê°ë¨í í¨ì í¸ì¶ë¡ ê³ì ì¤ì¼ ì ììµëë¤.
ì¬ê·ë¥¼ ì¬ì©í ì½ëë ë°ë³µì ì¬ê³ ì 근거íì¬ ìì±í ì½ëë³´ë¤ ëê° ì§§ìµëë¤.
if ëì ì¡°ê±´ë¶ ì°ì°ì ?를 ì¬ì©íë©´ pow (x, n)를 ë ê°ê²°íê³ ì½ê¸° ì½ê² ë§ë¤ ìë ììµëë¤.
function pow(x, n) {
return (n == 1) ? x : (x * pow(x, n - 1));
}
ê°ì¥ ì²ì íë í¸ì¶ì í¬í¨í ì¤ì²© í¸ì¶ì ìµë ê°ìë ì¬ê· ê¹ì´(recursion depth) ë¼ê³ í©ëë¤. pow(x, n)ì ì¬ê· ê¹ì´ë nì
ëë¤.
ìë°ì¤í¬ë¦½í¸ ìì§ì ìµë ì¬ê· ê¹ì´ë¥¼ ì íí©ëë¤. ë§ê° ì ëê¹ì§ íì¤í íì©íê³ , ìì§ì ë°ë¼ ì´ë³´ë¤ ë ë§ì ê¹ì´ë¥¼ íì©íë ê²½ì°ë ììµëë¤. íì§ë§ ëë¤ìì ìì§ì´ ìë§ê¹ì§ë ë¤ë£¨ì§ 못í©ëë¤. ì´ë° ì íì ìííë ¤ê³ ìì§ ë´ë¶ìì ìëì¼ë¡ 'tail calls optimizationâë¼ë ìµì í를 ìíí긴 íì§ë§, 모ë ê³³ì ì ì©ëë ê²ì ìëê³ ê°ë¨í ê²½ì°ìë§ ì ì©ë©ëë¤.
ì¬ê· ê¹ì´ ì í ë문ì ì¬ê·ë¥¼ ì¤ì ì ì©íëë° ì ì½ì´ ì긴 íì§ë§, ì¬ê·ë ì¬ì í ê´ë²ìíê² ì¬ì©ëê³ ììµëë¤. ì¬ê·ë¥¼ ì¬ì©íë©´, ê°ê²°íê³ ì ì§ë³´ìê° ì¬ì´ ì½ë를 ë§ë¤ ì ì기 ë문ì ëë¤.
ì¤í 컨í ì¤í¸ì ì¤í
ì¤ì ì¬ê· í¸ì¶ì´ ì´ë»ê² ëìíëì§ ììë´ ìë¤. ì´ë¥¼ ìí´ì í¨ìì ë´ë¶ ëìì ëí´ ì´í´ë³´ëë¡ íê² ìµëë¤.
ì¤í ì¤ì¸ í¨ìì ì¤í ì ì°¨ì ëí ì ë³´ë í´ë¹ í¨ìì ì¤í 컨í ì¤í¸(execution context) ì ì ì¥ë©ëë¤.
ì¤í 컨í
ì¤í¸ë í¨ì ì¤íì ëí ì¸ë¶ ì 보를 ë´ê³ ìë ë´ë¶ ë°ì´í° 구조ì
ëë¤. ì ì´ íë¦ì íì¬ ìì¹, ë³ìì íì¬ ê°, thisì ê°(ì¬ê¸°ì ë¤ë£¨ì§ ìì) ë± ìì¸ ë´ë¶ ì ë³´ê° ì¤í 컨í
ì¤í¸ì ì ì¥ë©ëë¤.
í¨ì í¸ì¶ ì¼ íë¹ ì íí íëì ì¤í 컨í ì¤í¸ê° ìì±ë©ëë¤.
í¨ì ë´ë¶ì ì¤ì²© í¸ì¶ì´ ìì ëë ìëì ê°ì ì ì°¨ê° ìíë©ëë¤.
- íì¬ í¨ìì ì¤íì´ ì¼ì ì¤ì§ë©ëë¤.
- ì¤ì§ë í¨ìì ì°ê´ë ì¤í 컨í ì¤í¸ë ì¤í 컨í ì¤í¸ ì¤í(execution context stack) ì´ë¼ë í¹ë³í ìë£ êµ¬ì¡°ì ì ì¥ë©ëë¤.
- ì¤ì²© í¸ì¶ì´ ì¤íë©ëë¤.
- ì¤ì²© í¸ì¶ ì¤íì´ ëë ì´í ì¤í 컨í ì¤í¸ ì¤íìì ì¼ì ì¤ë¨í í¨ìì ì¤í 컨í ì¤í¸ë¥¼ 꺼ë´ì¤ê³ , ì¤ë¨í í¨ìì ì¤íì ë¤ì ì´ì´ê°ëë¤.
ì´ì pow (2, 3)ê° í¸ì¶ëë©´ ì¤í 컨í
ì¤í¸ìì ë¬´ì¨ ì¼ì´ ì¼ì´ëëì§ ì´í´ë´
ìë¤.
pow(2, 3)
pow (2, 3)를 í¸ì¶íë ìê°, ì¤í 컨í
ì¤í¸ì ë³ì x = 2, n = 3ì´ ì ì¥ëê³ , ì¤í íë¦ì í¨ìì 첫 ë²ì§¸ ì¤ì ìì¹í©ëë¤.
ì´ë¥¼ ëìííë©´ ë¤ìê³¼ ê°ìµëë¤.
- Context: { x: 2, n: 3, 첫 ë²ì§¸ ì¤ } pow(2, 3)
ì 그림ì í¨ì ì¤íì´ ììëë ìê°ì ëíë¸ ê²ì
ëë¤. ì§ê¸ ìíë¡ ì¡°ê±´ n == 1ì ë§ì¡±íì§ ëª»íë¯ë¡ ì¤í íë¦ì ifì ë ë²ì§¸ ë¶ê¸°ë¡ ëì´ê°ëë¤.
function pow(x, n) {
if (n == 1) {
return x;
} else {
return x * pow(x, n - 1);
}
}
alert( pow(2, 3) );
ë³ìë ëì¼íì§ë§, ì¤í íë¦ì ìì¹ê° ë³ê²½ëë©´ì ì¤í 컨í ì¤í¸ë ë¤ìê³¼ ê°ì´ ë³ê²½ë©ëë¤.
- Context: { x: 2, n: 3, ë¤ì¯ ë²ì§¸ ì¤ } pow(2, 3)
x * pow (x, n - 1)ì ê³ì°íë ¤ë©´ ìë¡ì´ ì¸ìê° ë¤ì´ê°ë powì ìë¸ í¸ì¶(subcall), pow (2, 2)ì ë§ë¤ì´ì¼ í©ëë¤.
pow(2, 2)
ì¤ì²© í¸ì¶ì í기 ìí´, ìë°ì¤í¬ë¦½í¸ë ì¤í 컨í ì¤í¸ ì¤í ì íì¬ ì¤í 컨í ì¤í¸ë¥¼ ì ì¥í©ëë¤.
ì§ê¸ ë³´ê³ ìë ìììì ì¤í 컨í
ì¤í¸ ì¤íì ëì¼í í¨ì pow를 í¸ì¶íìëë°, ì´ë ì¤ìì¹ ììµëë¤. 모ë í¨ìì ëí´ ìë íë¡ì¸ì¤ê° ëê°ì´ ì ì©ë©ëë¤.
- ì¤í ìµìë¨ì íì¬ ì»¨í ì¤í¸ê° '기ë¡âë©ëë¤.
- ìë¸ í¸ì¶ì ìí ìë¡ì´ 컨í ì¤í¸ê° ë§ë¤ì´ì§ëë¤.
- ìë¸ í¸ì¶ì´ ìë£ëë©´. 기존 컨í ì¤í¸ë¥¼ ì¤íìì 꺼ë´(pop) ì¤íì ì´ì´ëê°ëë¤.
ë¤ìì ìë¸ í¸ì¶ pow (2, 2)ì´ ììë ëì ì¤í 컨í
ì¤í¸ ì¤íì
ëë¤.
- Context: { x: 2, n: 2, 첫 ë²ì§¸ ì¤ } pow(2, 2)
- Context: { x: 2, n: 3, ë¤ì¯ ë²ì§¸ ì¤ } pow(2, 3)
êµµì í ëë¦¬ë¡ íìí ì ì¤í 컨í ì¤í¸ë ìë¨ì, 기존 컨í ì¤í¸ë íë¨ì ìë¤ì.
ì´ì 컨í ì¤í¸ì ë³ì ì ë³´, ì½ëê° ì¼ì ì¤ë¨ë ì¤ì ëí ì ë³´ê° ì ì¥ëì´ì기 ë문ì ìë¸ í¸ì¶ì´ ëë¬ì ë ì´ì 컨í ì¤í¸ê° 문ì ìì´ ë¤ì ììë©ëë¤.
ììì í ì¤ì ìë¸ í¸ì¶ íëë§ ì기 ë문ì, 그림ìì 'ì¤âì´ë¼ë ë¨ì´ë¥¼ ì¬ì©íìµëë¤. íì§ë§ í ì¤ìë pow(â¦) + pow(â¦) + somethingElse(â¦) ê°ì´ ë³µìì ìë¸ í¸ì¶ì´ ìì ì ììµëë¤.
ë°ë¼ì ì¢ ë ì ííë ì¤íì´ 'ìë¸ í¸ì¶ ë°ë¡ ì§íâì ììëë¤ê³ ì´ì¼ê¸° í ì ììµëë¤.
pow(2, 1)
ëì¼í ê³¼ì ì´ ë¤ì ë°ë³µë©ëë¤. ë¤ì¯ ë²ì§¸ ì¤ìì ì¸ì x = 2, n = 1ê³¼ í¨ê» ìë¡ì´ ìë¸ í¸ì¶ì´ ë§ë¤ì´ì§ëë¤.
ìë¡ì´ ì¤í 컨í ì¤í¸ê° ë§ë¤ì´ì§ê³ , ì´ì ì¤í 컨í ì¤í¸ë ì¤í ìµìë¨ì ì¬ë¼ê°ëë¤(push).
- Context: { x: 2, n: 1, 첫 ë²ì§¸ ì¤ } pow(2, 1)
- Context: { x: 2, n: 2, ë¤ì¯ ë²ì§¸ ì¤ } pow(2, 2)
- Context: { x: 2, n: 3, ë¤ì¯ ë²ì§¸ ì¤ } pow(2, 3)
기존 컨í
ì¤í¸ ë ê°ê° ë°ì, pow (2, 1)ì ììíë 컨í
ì¤í¸ê° 맨 ìì ìë ê²ì íì¸í ì ììµëë¤.
ì¤í ì¢ ë£
pow (2, 1)ê° ì¤íë ë ìí©ì´ ë¬ë¼ì§ëë¤. ì´ì ê³¼ë ë¬ë¦¬ ì¡°ê±´ n == 1ì ë§ì¡±ìí¤ë¯ë¡ if문ì 첫 ë²ì§¸ ë¶ê¸°ê° ì¤íë©ëë¤.
function pow(x, n) {
if (n == 1) {
return x;
} else {
return x * pow(x, n - 1);
}
}
ì´ì í¸ì¶í´ì¼ í ì¤ì²© í¸ì¶ì´ ììµëë¤. ë°ë¼ì í¨ìë ì¢
ë£ëê³ 2ê° ë°íë©ëë¤.
í¨ìê° ì¢ ë£ëì기 ë문ì ì´ì ììíë ì¤í 컨í ì¤í¸ë ì¸ëª¨ê° ìì´ì¡ìµëë¤. ë°ë¼ì í´ë¹ ì¤í 컨í ì¤í¸ë ë©ëª¨ë¦¬ìì ìì ë©ëë¤. ì¤í 맨 ìì ì´ì ì ì¤í 컨í ì¤í¸ê° ìì¹íê² ë©ëë¤.
- Context: { x: 2, n: 2, ë¤ì¯ ë²ì§¸ ì¤ } pow(2, 2)
- Context: { x: 2, n: 3, ë¤ì¯ ë²ì§¸ ì¤ } pow(2, 3)
pow (2, 2)ì ì¤íì´ ë¤ì ììë©ëë¤. ìë¸ í¸ì¶ pow (2, 1)ì 결과를 ìê³ ìì¼ë¯ë¡, ì½ê² x * pow (x, n - 1)를 ê³ì°í´ 4를 ë°íí©ëë¤.
ê·¸ë¦¬ê³ ë¤ì ì´ì 컨í ì¤í¸ê° ì¤í ìµìë¨ì ìì¹íê² ë©ëë¤.
- Context: { x: 2, n: 3, ë¤ì¯ ë²ì§¸ ì¤ } pow(2, 3)
ë§ì§ë§ ì¤í 컨í
ì¤í¸ê¹ì§ ì²ë¦¬ëë©´ pow (2, 3) = 8ì´ë¼ë ê²°ê³¼ê° ëì¶ë©ëë¤.
ì§ê¸ ë³´ì ììì ì¬ê· ê¹ì´ë 3 ì ëë¤.
ëìì íµí´ ì´í´ë³´ìë¯ì´, ì¬ê· ê¹ì´ë ì¤íì ë¤ì´ê°ë ì¤í 컨í ì¤í¸ ìì ìµëê°ê³¼ ê°ìµëë¤.
ì¤í 컨í
ì¤í¸ë ë©ëª¨ë¦¬ë¥¼ ì°¨ì§íë¯ë¡ ì¬ê·ë¥¼ ì¬ì©í ë ë©ëª¨ë¦¬ ì구ì¬íì ì ìí´ì¼ í©ëë¤. nì ë리면 nì´ ì¤ì´ë¤ ëë§ë¤ ë§ë¤ì´ì§ë nê°ì ì¤í 컨í
ì¤í¸ê° ì ì¥ë ë©ëª¨ë¦¬ ê³µê°ì´ íìí기 ë문ì
ëë¤.
íí¸, ë°ë³µë¬¸ ê¸°ë° ìê³ ë¦¬ì¦ì ì¬ì©íë©´ ë©ëª¨ë¦¬ê° ì ì½ë©ëë¤.
function pow(x, n) {
let result = 1;
for (let i = 0; i < n; i++) {
result *= x;
}
return result;
}
ë°ë³µì ì¬ì©í´ ë§ë í¨ì powë 컨í
ì¤í¸ë¥¼ íëë§ ì¬ì©í©ëë¤. ì´ ì»¨í
ì¤í¸ìì iì resultê° ë³ê²½ë©ëë¤. ì¤í 컨í
ì¤í¸ê° íëì´ê¸° ë문ì nì ìì¡´ì ì´ì§ ìê³ , íìí ë©ëª¨ë¦¬ê° ì ìµëë¤. ì¬ì© ë©ëª¨ë¦¬ ê³µê°ë ê³ ì ë©ëë¤.
ì¬ê·ë¥¼ ì´ì©í´ ìì±í ì½ëë ë°ë³µë¬¸ì ì¬ì©í ì½ëë¡ ë¤ì ìì±í ì ììµëë¤. ë°ë³µë¬¸ì ì¬ì©íë©´ ëê° í¨ì í¸ì¶ì ë¹ì©(ë©ëª¨ë¦¬ ì¬ì©)ì´ ì ì½ë©ëë¤.
íì§ë§ ì½ë를 ë¤ì ìì±í´ë í° ê°ì ì´ ìë ê²½ì°ê° ììµëë¤. ì¡°ê±´ì ë°ë¼ í¨ìê° ë¤ë¥¸ ì¬ê· ìë¸ í¸ì¶ì íê³ ê·¸ 결과를 í©ì¹ ëê° ê·¸ë ìµëë¤. ë¶ê¸°ë¬¸ì´ ë³µì¡íê² ì½íìì ëë ë©ëª¨ë¦¬ê° í¬ê² ì ì½ëì§ ììµëë¤. ì´ë° ê²½ì°ì ìµì íê° íìíì§ ìì ì ìê³ ìµì íì ëë ë ¸ë ¥ì´ ë¬´ì©ì§ë¬¼ì¼ ì ììµëë¤.
ì¬ê·ë¥¼ ì¬ì©íë©´ ì½ëê° ì§§ìì§ê³ ì½ë ì´í´ëê° ëìì§ë©° ì ì§ë³´ììë ì´ì ì´ ììµëë¤. 모ë ê³³ìì ë©ëª¨ë¦¬ ìµì í를 ì ê²½ ì¨ì ì½ë를 ìì±í´ì¼ íë ê²ì ìëëë¤. ì°ë¦¬ê° íìí ê²ì ì¢ì ì½ëì ëë¤. ì´ë° ì´ì ë문ì ì¬ê·ë¥¼ ì¬ì©í©ëë¤.
ì¬ê·ì ìí
ì¬ê·ë ì¬ê·ì ìí(recursive traversal)를 구íí ë ì¬ì©íë©´ ì¢ìµëë¤.
í íì¬ê° ìë¤ê³ ê°ì í´ ë´ ìë¤. ìì§ìì ìëì ê°ì´ ê°ì²´ë¡ ííí´ ë³´ììµëë¤.
let company = {
sales: [{
name: 'John',
salary: 1000
}, {
name: 'Alice',
salary: 1600
}],
development: {
sites: [{
name: 'Peter',
salary: 2000
}, {
name: 'Alex',
salary: 1800
}],
internals: [{
name: 'Jack',
salary: 1300
}]
}
};
íì¬ì ë¶ìê° ììµëë¤.
-
ë¶ììë ì¬ë¬ ëª ì ì§ìì´ ìëë°, ì´ë¥¼ ë°°ì´ë¡ ííí ì ììµëë¤.
salesë¶ìì Johnê³¼ Aliceë¼ë 2ëª ì ì§ìì ë°°ì´ ììë¡ ííí´ ë³´ììµëë¤. -
ë¶ìë íì ë¶ì를 ê°ì§ ì ììµëë¤.
developmentë¶ìësitesìinternalsë¼ë ë ê°ì íì ë¶ì를 ê°ìµëë¤. ê° íìë¶ììë ì§ìì´ ììµëë¤. -
íì ë¶ìê° ì»¤ì§ë©´ ë ìì ë¨ìì íì ë¶ì(ëë í)ë¡ ìª¼ê°ì§ ê°ë¥ì±ë ììµëë¤.
sitesë¶ìë 미ëìsiteAìsiteBë¡ ëë ì ììµëë¤. ì´ë ê² ëë ì§ ë¶ìê° ë¯¸ëì ë ì¸ë¶íë ìë ìì£ . 미ëì ë²ì´ì§ ì¼ê¹ì§ ëíë´ì§ ììì§ë§, ì´ë¬í ê°ë¥ì±ë ìë¤ë 걸 ì¼ëì ëì´ì¼ í©ëë¤.
ì, ì´ì 모ë ìì§ìì ê¸ì¬ë¥¼ ëí ê°ì 구í´ì¼ íë¤ê³ í´ë´ ìë¤. ì´ë»ê² í ì ììê¹ì?
êµ¬ì¡°ê° ë¨ìíì§ ì기 ë문ì ë°ë³µë¬¸ì ì¬ì©í´ì 구í기 ì½ì§ ìì ë³´ì
ëë¤. ê°ì¥ 먼ì ë ì¤ë¥´ë ìê°ì company를 ëìì¼ë¡ ëìíë for ë°ë³µë¬¸ì ë§ë¤ê³ í ë¨ê³ ìëì ë¶ìì ì¤ì²© ë°ë³µë¬¸ë¥¼ ë리ë ê²ì¼ ê²ëë¤. ê·¸ë°ë° ì´ë ê² íë©´ sites ê°ì ë ë¨ê³ ìëì ë¶ìì ìí ìì§ìì ê¸ì¬ë¥¼ ë½ìë¼ ë ë ë¤ë¥¸ ì¤ì²© ë°ë³µë¬¸ì´ íìí©ëë¤. ì¸ ë¨ê³ ìëì ë¶ìê° ë¯¸ëì ë§ë¤ì´ì§ë¤ê³ ê°ì íë©´ ë ë¤ë¥¸ ì¤ì²© ë°ë³µë¬¸ì´ íìíê² ì£ . ì¼ë§ë§í¼ì ê¹ì´ê¹ì§ ì¤ì²© ë°ë³µë¬¸ì ë§ë¤ ì ììê¹ì? ê°ì²´ë¥¼ ìííë ì¤ì²© ë°ë³µë¬¸ì ê¹ì´ê° 3~4ê°ê° ëë ìê° ì½ëë ì ë§ ì§ì ë¶í´ì§ ê²ëë¤.
ì¬ê·ë¥¼ ì´ì©í íì´ë²ì ìëí´ ë´ ìë¤.
ìì 본 ë°ì ê°ì´ ìì§ì ê¸ì¬ í©ê³ë¥¼ 구í ëë ë ê°ì§ ê²½ì°ë¡ ëëì´ ìê°í ì ììµëë¤.
- ìì§ì ë°°ì´ ì ê°ì§ âë¨ìíâ ë¶ì â ê°ë¨í ë°ë³µë¬¸ì¼ë¡ ê¸ì¬ í©ê³ë¥¼ 구í ì ììµëë¤.
Nê°ì íì ë¶ìê° ìë ê°ì²´ â ê° íì ë¶ìì ìí ìì§ìì ê¸ì¬ í©ê³ë¥¼ ì»ê¸° ìí´Në²ì ì¬ê· í¸ì¶ì íê³ , ìµì¢ ì ì¼ë¡ 모ë íìë¶ì ìì§ìì ê¸ì¬ë¥¼ ëí©ëë¤.
ë°°ì´ì ì¬ì©íë 첫 ë²ì§¸ ê²½ì°ë ê°ë¨í ê²½ì°ë¡, ì¬ê·ì ë² ì´ì¤ê° ë©ëë¤.
ê°ì²´ë¥¼ ì¬ì©íë ë ë²ì§¸ ê²½ì°ë ì¬ê· ë¨ê³ê° ë©ëë¤. ë³µì¡í ìì ì ìì ìì (íì ë¶ìì ëí ë°ë³µë¬¸)ì¼ë¡ 쪼갤 ì ììµëë¤. ë¶ìì ê¹ì´ì ë°ë¼ ë ìì ìì ì¼ë¡ 쪼갤 ì ìëë°, ê²°êµ ë§ì§ë§ì 첫 ë²ì§¸ ê²½ì°ê° ë©ëë¤.
ì½ë를 ì§ì ì½ì´ë³´ë©´ì ì¬ê· ìê³ ë¦¬ì¦ì ì´í´í´ë´ ìë¤.
let company = { // ëì¼í ê°ì²´(ê°ê²°ì±ì ìí´ ì½ê° ìì¶í¨)
sales: [{name: 'John', salary: 1000}, {name: 'Alice', salary: 1600 }],
development: {
sites: [{name: 'Peter', salary: 2000}, {name: 'Alex', salary: 1800 }],
internals: [{name: 'Jack', salary: 1300}]
}
};
// ê¸ì¬ í©ê³ë¥¼ 구í´ì£¼ë í¨ì
function sumSalaries(department) {
if (Array.isArray(department)) { // 첫 ë²ì§¸ ê²½ì°
return department.reduce((prev, current) => prev + current.salary, 0); // ë°°ì´ì ìì를 í©í¨
} else { // ë ë²ì§¸ ê²½ì°
let sum = 0;
for (let subdep of Object.values(department)) {
sum += sumSalaries(subdep); // ì¬ê· í¸ì¶ë¡ ê° íì ë¶ì ìì§ìì ê¸ì¬ ì´í©ì 구í¨
}
return sum;
}
}
alert(sumSalaries(company)); // 7700
ì§§ê³ ì´í´í기 ì¬ì´ ì½ëë¡ ìíë 기ë¥ì 구ííììµëë¤. ì¬ê·ì ê°ë ¥í¨ì ì¬ê¸°ì ììµëë¤. íì ë¶ìì ê¹ì´ì ìê´ìì´ ìíë ê°ì 구í ì ìê² ëìë¤ì.
ìëë í¸ì¶ì´ ì´ë»ê² ì¼ì´ëëì§ë¥¼ ëíë¸ ê·¸ë¦¼ì ëë¤.
그림ì ë³´ë©´ ê·ì¹ì ì½ê² íì¸í ì ììµëë¤. ê°ì²´ {...}를 ë§ëë©´ ìë¸ í¸ì¶ì´ ë§ë¤ì´ì§ë ë°ë©´, ë°°ì´ [...]ì ë§ëë©´ ë ì´ìì ìë¸ í¸ì¶ì´ ë§ë¤ì´ì§ì§ ìê³ ê²°ê³¼ê° ë°ë¡ ê³ì°ë©ëë¤.
í¨ì ë´ë¶ìì ìì íìµí ë 문ë²ì ì¬ì©íê³ ìë ê²ë ëì¬ê²¨ë³´ì기 ë°ëëë¤.
- ë°°ì´ê³¼ ë©ìë ì±í°ìì íìµí ë©ìë
arr.reduceë ë°°ì´ì í©ì ê³ì°í´ ì¤ëë¤. for(val of Object.values (obj))ìì ì°ì¸Object.valuesë íë¡í¼í°ì ê°ì´ ë´ê¸´ ë°°ì´ì ë°íí©ëë¤.
ì¬ê·ì 구조
ì¬ê·ì ì¼ë¡ ì ìë ìë£êµ¬ì¡°ì¸ ì¬ê·ì ìë£ êµ¬ì¡°ë ì기 ìì ì ì¼ë¶ë¥¼ ë³µì íë ííì ìë£ êµ¬ì¡°ì ëë¤.
ììì ì´í´ë³¸ íì¬ êµ¬ì¡° ìì ì¬ê·ì ìë£ êµ¬ì¡° ííì ëë¤.
íì¬ì ë¶ì ê°ì²´ë ë ê°ì§ ì¢ ë¥ë¡ ëë©ëë¤.
- ì¬ëë¤ë¡ 구ì±ë ë°°ì´
- íì ë¶ìë¡ ì´ë£¨ì´ì§ ê°ì²´
ì¹ ê°ë°ììê² ìµìí HTMLê³¼ XMLë ì¬ê·ì ìë£ êµ¬ì¡° íí를 ë±ëë¤.
HTML 문ììì HTML íê·¸ë ìëì ê°ì í목ì¼ë¡ 구ì±ë기 ë문ì ëë¤.
- ì¼ë° í ì¤í¸
- HTML-주ì
- ì´ ì¸ì HTML íê·¸ (ì´ ìëì ì¼ë° í ì¤í¸, HTML-주ì, ë¤ë¥¸ HTML íê·¸ê° ì¬ ì ììµëë¤.)
ì´ë ê² ë¤ìí ê³³ìì ì¬ê·ì ì¼ë¡ ì ìë ìë£êµ¬ì¡°ê° ì°ì ëë¤.
ë¤ìì 'ì°ê²° 리ì¤í¸âë¼ë ì¬ê·ì ìë£ êµ¬ì¡°ë¥¼ ì´í´ë³´ë©´ì ì¬ê·ì 구조ì ëí´ ë ììë³´ëë¡ íê² ìµëë¤. ëªëª ìí©ìì ë°°ì´ ëì ì°ê²° 리ì¤í¸ë¥¼ ì¬ì©íë©´ ë ì¢ì ê²½ì°ê° ììµëë¤.
ì°ê²° 리ì¤í¸
ê°ì²´ë¥¼ ì ë ¬íì¬ ì´ëê°ì ì ì¥íê³ ì¶ë¤ê³ ê°ì í´ ë´ ìë¤.
ê°ì¥ 먼ì ë ì¤ë¥´ë ìë£ êµ¬ì¡°ë ìë§ ë°°ì´ì¼ ê²ëë¤.
íì§ë§ ë°°ì´ì ìì 'ìì âì 'ì½ì
âì ë¤ì´ê°ë ë¹ì©ì´ ë§ì´ ë ë¤ë 문ì ê° ììµëë¤. arr.unshift(obj) ì°ì°ì ìííë ¤ë©´ ìë¡ì´ obj를 ìí ê³µê°ì ë§ë¤ê¸° ìí´ ëª¨ë ììì ë²í¸ë¥¼ ë¤ì ë§¤ê²¨ì¼ íì£ . ë°°ì´ì´ 커ì§ë©´ ì°ì° ìí ìê°ì´ ë ê±¸ë¦¬ê² ë©ëë¤. arr.shift()를 ì¬ì©í ëë ë§ì°¬ê°ì§ì
ëë¤.
ìì ì ì²´ì ë²í¸ë¥¼ ë¤ì ë§¤ê¸°ì§ ììë ëë ì¡°ìì ë°°ì´ ëì íë ì°ì°ì¸ arr.push/pop ë¿ì´ì£ . ì쪽 ììì 무ì¸ê°ë¥¼ í ë ë°°ì´ì ì´ì²ë¼ 꽤 ë립ëë¤.
ë¹ ë¥´ê² ì½ì í¹ì ìì 를 í´ì¼ í ëë ë°°ì´ ëì ì°ê²° 리ì¤í¸(linked list)ë¼ ë¶ë¦¬ë ìë£ êµ¬ì¡°ë¥¼ ì¬ì©í ì ììµëë¤.
ì°ê²° 리ì¤í¸ì ìì ë ê°ì²´ì ìë íë¡í¼í°ë¤ì ì¡°í©í´ ì ìí ì ììµëë¤.
valuenext: ë¤ì ì°ê²° 리ì¤í¸ ìì를 참조íë íë¡í¼í°. ë¤ì ììê° ìì ënullì´ ë©ëë¤.
ìì:
let list = {
value: 1,
next: {
value: 2,
next: {
value: 3,
next: {
value: 4,
next: null
}
}
}
};
ì ì°ê²° 리ì¤í¸ë¥¼ 그림ì¼ë¡ íííë©´ ë¤ìê³¼ ê°ìµëë¤.
ìëì²ë¼ ì½ë를 ìì±í´ë ëì¼í ì°ê²° 리ì¤í¸ê° ë©ëë¤.
let list = { value: 1 };
list.next = { value: 2 };
list.next.next = { value: 3 };
list.next.next.next = { value: 4 };
list.next.next.next.next = null;
ì´ë ê² ì°ê²° 리ì¤í¸ë¥¼ ë§ëë ê°ì²´ê° ì¬ë¬ê° ìê³ , ê° ê°ì²´ì valueì ì´ì ê°ì²´ë¥¼ ê°ë¦¬í¤ë íë¡í¼í°ì¸ nextê° ìë ê² ëª
íí ë³´ì´ë¤ì. ì²´ì¸ì ìì ê°ì²´ë ë³ì listì ì ì¥ëì´ ììµëë¤. ì°ë¦¬ë listì next íë¡í¼í°ë¥¼ ì´ì©í´ ì´ì´ì§ë ê°ì²´ ì´ëë ëë¬í ì ììµëë¤.
ì°ê²° 리ì¤í¸ë¥¼ ì¬ì©íë©´ ì ì²´ 리ì¤í¸ë¥¼ ì¬ë¬ ë¶ë¶ì¼ë¡ ì½ê² ëë ì ìê³ , ë¤ì í©ì¹ë ê²ë ê°ë¥í©ëë¤.
let secondList = list.next.next;
list.next.next = null;
í©ì¹ê¸°:
list.next.next = secondList;
ê·¸ë¦¬ê³ ì½ê² ìì를 ì¶ê°íê±°ë ìì í ì ììµëë¤,
리ì¤í¸ì ì²ì ê°ì²´ë¥¼ ë°ê¾¸ë©´ 리ì¤í¸ 맨 ìì ìë¡ì´ ê°ì ì¶ê°í ì ìì£ .
let list = { value: 1 };
list.next = { value: 2 };
list.next.next = { value: 3 };
list.next.next.next = { value: 4 };
// listì ìë¡ì´ value를 ì¶ê°í©ëë¤.
list = { value: "new item", next: list };
ì¤ê° ìì를 ì ê±°íë ¤ë©´ ì´ì ììì next를 ë³ê²½í´ì£¼ë©´ ë©ëë¤.
list.next = list.next.next;
list.nextê° 1ì´ ìë 2를 valueë¡ ê°ë ê°ì²´ë¥¼ ê°ë¦¬í¤ê² ë§ë¤ì´ë³´ììµëë¤. ì´ì value 1ì ì²´ì¸ìì ì ì¸ë©ëë¤. ì´ ê°ì²´ë ë¤ë¥¸ ê³³ì ë°ë¡ ì ì¥íì§ ìì¼ë©´ ìëì¼ë¡ ë©ëª¨ë¦¬ìì ì ê±°ë©ëë¤.
ì§ê¸ê¹ì§ ì´í´ë³¸ ë°ì ê°ì´ ì°ê²° 리ì¤í¸ë ë°°ì´ê³¼ë ë¬ë¦¬ ëëì¼ë¡ ìì ë²í¸ë¥¼ ì¬í ë¹íì§ ìì¼ë¯ë¡ ìì를 ì½ê² ì¬ë°°ì´í ì ìë¤ë ì¥ì ì´ ììµëë¤.
ë¬¼ë¡ ì°ê²° 리ì¤í¸ê° íì ë°°ì´ë³´ë¤ ì°ìíì§ë ììµëë¤. ê·¸ë ì§ ììë¤ë©´ 모ë ì¬ëë¤ì´ ì°ê²° 리ì¤í¸ë§ ì¬ì©íê² ì£ .
ì°ê²° 리ì¤í¸ì ê°ì¥ í° ë¨ì ì ë²í¸(ì¸ë±ì¤)ë§ ì¬ì©í´ ììì ì½ê² ì ê·¼í ì ìë¤ë ì ì
ëë¤. ë°°ì´ì ì¬ì©íë©´ arr[n]ì²ë¼ ë²í¸ në§ì¼ë¡ë ìíë ììì ë°ë¡ ì ê·¼í ì ììµëë¤. ê·¸ë¬ë ì°ê²° 리ì¤í¸ìì Në²ì§¸ ê°ì ì»ê¸° ìí´ ì²« ë²ì§¸ í목ë¶í° ììí´ Në² nextë¡ ì´ëí´ì¼ í©ëë¤.
ê·¸ë°ë° ì¤ê°ì ìì를 ì½ì íê±°ë ìì íë ì°ì°ì´ íì íìí ê²ì ìëëë¤. ì´ë´ ë ììê° ìë ìë£í ì¤ì í(queue)ë ë°í¬(deque)를 ì¬ì©í ì ììµëë¤. ë°í¬ë¥¼ ì¬ì©íë©´ ì ëìì ì½ì ê³¼ ìì 를 ë¹ ë¥´ê² ìíí ì ììµëë¤.
ììì 구íí ì°ê²° 리ì¤í¸ë ìëì ê°ì 기ë¥ì ëí´ ê°ì í ì ììµëë¤.
- ì´ì ìì를 참조íë íë¡í¼í°
prev를 ì¶ê°í´ ì´ì ììë¡ ì½ê² ì´ëíê² í ì ììµëë¤. - 리ì¤í¸ì ë§ì§ë§ ìì를 참조íë ë³ì
tail를 ì¶ê°í ì ììµëë¤. ë¤ë§ ì´ë 주ìí ì ì 리ì¤í¸ ë§ì§ë§ì ìì를 ì¶ê°íê±°ë ìì í ëtailë ê°±ì í´ ì¤ì¼ í©ëë¤. - ì´ ì¸ìë ì구ì¬íì ë°ë¼ 구조를 ë³ê²½í ì ììµëë¤.
ìì½
ì§ê¸ê¹ì§ ëì¨ ì©ì´ë¥¼ ì 리í´ë´ ìë¤.
-
ì¬ê·(recursion) â í¨ì ë´ë¶ìì ì기 ìì ì í¸ì¶íë ê²ì ëíë´ë íë¡ê·¸ëë° ì©ì´ì ëë¤. ì¬ê· í¨ìë ì°ìíê² ìíë 문ì 를 í´ê²°í ë ì주 ì°ì´ê³¤ í©ëë¤.
í¨ìê° ìì ì í¸ì¶íë ë¨ê³ë¥¼ ì¬ê· ë¨ê³(recursion step) ë¼ê³ ë¶ë¦ ëë¤. basisë¼ê³ ë ë¶ë¦¬ë ì¬ê·ì ë² ì´ì¤(base) ë ìì ì ì주 ê°ë¨íê² ë§ë¤ì´ì í¨ìê° ë ì´ìì ìë¸ í¸ì¶ì ë§ë¤ì§ ìê² í´ì£¼ë ì¸ìì ëë¤.
-
ì¬ê·ì ì¼ë¡ ì ìë ìë£ êµ¬ì¡°ë ì기 ìì ì ì´ì©í´ ìë£ êµ¬ì¡°ë¥¼ ì ìí©ëë¤.
ì¬ê·ì ì¼ë¡ ì ìë ìë£êµ¬ì¡°ì ìíë ì°ê²° 리ì¤í¸ë 리ì¤í¸ í¹ì nullì 참조íë ê°ì²´ë¡ ì´ë£¨ì´ì§ ë°ì´í° 구조를 ì¬ì©í´ ì ìë©ëë¤.
list = {value, next -> list}HTML 문ìì HTML ìì í¸ë¦¬ë ììì ë¤ë£¬ ë¶ì를 ëíë´ë í¸ë¦¬ ìì ì¬ê·ì ì¸ ìë£ êµ¬ì¡°ë¡ ë§ë¤ììµëë¤. ì´ë ê² ì¬ê·ì ì¸ ìë£ êµ¬ì¡°ë¥¼ ì¬ì©íë©´ ê°ì§ê° ì¬ë¬ ê°ì¸ë° ê° ê°ì§ê° ì¬ë¬ ê°ì§ë¡ ë»ì³ ëê°ë ííë¡ ìë£ êµ¬ì¡°ë¥¼ ë§ë¤ ì ììµëë¤.
ìììì 구íí
sumSalaryê°ì ì¬ê· í¨ì를 ì¬ì©íë©´ ê° ë¶ê¸°(ê°ì§)를 ìíí ì ììµëë¤.
모ë ì¬ê· í¨ìë ë°ë³µë¬¸ì ì¬ì©í í¨ìë¡ ë¤ì ìì±í ì ììµëë¤. ìµì í를 ìí´ ë°ë³µë¬¸ì¼ë¡ ë¤ì ìì±í´ì¼ í ìë ìì£ . ê·¸ë¬ë ìë¹ì ìì ì ì¬ê·ë¥¼ ì¬ì©í´ë ë§ì¡±í ë§í¼ ë¹ ë¥´ê² ëìí©ëë¤. ì¬ê·ë¥¼ ì¬ì©íë©´ 구íê³¼ ì ì§ë³´ìê° ì½ë¤ë ì¥ì ë ììµëë¤.
ëê¸
<code>í그를, ì¬ë¬ ì¤ë¡ 구ì±ë ì½ë를 ì½ì íê³ ì¶ë¤ë©´<pre>í그를 ì´ì©íì¸ì. 10ì¤ ì´ìì ì½ëë plnkr, JSBin, codepen ë±ì ìëë°ì¤ë¥¼ ì¬ì©íì¸ì.