** π μλ°μ€ν¬λ¦½νΈλ 무μμΈκ°?**
νλͺ© | λ΄μ© | λΉμ |
---|---|---|
ποΈ νμ | 1995λ , λ·μ€μΌμ΄ν, 10μΌ λ§μ κ°λ° | βκΈμ‘°λ μ²μ¬ μκΈ°β |
π μ¬μ©μ² | μΉ, μλ²(Node.js), λ°μ€ν¬ν, λͺ¨λ°μΌ, IoT | βμΉμ μΈμ΄, μ μ²ν μμ§β |
𧬠μΈμ΄ νμ | μΈν°ν리ν°, λμ νμ΄ν, μ±κΈ μ€λ λ | βμ μ°ν ν΅μμ¬, νΌμ μΌνλ μ °νβ |
π₯ μμ§ | V8(Chrome/Node.js), SpiderMonkey(Firefox), JavaScriptCore(Safari) | βλΈλΌμ°μ μ μ¬μ₯, V8μ νλΌλ¦¬ μμ§β |
π§© νΉμ§ | μ΄λ²€νΈ κΈ°λ°, λΉλκΈ°, κ°μ²΄ μ§ν₯(νλ‘ν νμ ), λμ , μ½ν νμ | βκΈ°λ―Όν μΉ΄λ©λ μ¨β |
π 2οΈβ£ μ μλ°μ€ν¬λ¦½νΈμΈκ°?
π ν΅μ¬ μ΄μ :
- λΈλΌμ°μ λ΄ κΈ°λ³Έ μΈμ΄ (νλ‘ νΈμλ νμ)
- Node.jsλ‘ μλ² κ°λ°κΉμ§ νμ₯
- νμ€ν, μ±, IoT, AIκΉμ§ νμ© λ²μ λμ
π 3οΈβ£ μ£Όμ νΉμ§ κΉκ² νν€μΉκΈ°
𧬠A. μΈν°νλ¦¬ν° & JIT μ»΄νμΌ
μ©μ΄ | μ€λͺ |
---|---|
μΈν°νλ¦¬ν° | μ½λ ν μ€μ© μ€μκ° ν΄μ, λΉ λ₯Έ μ€ν κ°λ₯ |
JIT μ»΄νμΌ | V8 μμ§μ΄ μμ£Ό μ°μ΄λ μ½λλ₯Ό 미리 κΈ°κ³μ΄λ‘ λ³ννμ¬ μλ ν₯μ |
π ꡬ쑰 λΉμ :
π¨βπ³ βμ£Όλ°©μ₯βμ΄ μΈν°νλ¦¬ν° β μ€μκ° μ리
π€ JITμ βλ μνΌ μκΈ°β β λ°λ³΅λλ λ©λ΄λ 미리 μ€λΉν΄ μλ μ
μ¬ν:
- V8μ Inline Caching, Hidden Classλ‘ λ°νμ μ΅μ ν μν.
π λ©΄μ ν¬μΈνΈ:
βμλ°μ€ν¬λ¦½νΈλ μΈν°νλ¦¬ν° μΈμ΄μΈκ° μ»΄νμΌλ¬ μΈμ΄μΈκ°?β β λ λ€ (νμ΄λΈλ¦¬λ)
π’ B. λμ νμ΄ν & μ½ν νμ
μ©μ΄ | μ€λͺ |
---|---|
λμ νμ΄ν | λ³μ μ μΈ μ νμ μ§μ X, μ€ν μ€ νμ κ²°μ |
μ½ν νμ | λ€λ₯Έ νμ κ° μλ λ³ν νμ© (μ묡μ νλ³ν) |
μμ:
let a = 1;
a = "λ¬Έμμ΄"; // OK
console.log(1 + '2'); // '12' (λ¬Έμμ΄ λ³ν)
νΈλ© ν¬μΈνΈ:
[] + {} // "[object Object]"
{} + [] // 0
β μ€λ¬΄μμ μ£Όμν΄μΌ ν¨!
π λ©΄μ λλΉ:
βλμ νμ΄νμ΄ κ°μ Έμ€λ μ₯λ¨μ μ?β
λ¨μ : Type μμ μ± β β TypeScriptλ‘ λ³΄μ
π νλμ 보λ μλ° μ€ν¬λ¦½νΈ
<!DOCTYPE html>
<html lang="ko">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width", initial-scale="1.0">
<title>JavaScript κ°μ μ¬ν μμ±ν</title>
</head>
<body>
<!--
π HTML: μΉ νμ΄μ§μ "ꡬ쑰" (λΌλ)
π¨ CSS: μΉ νμ΄μ§μ "μ€νμΌ" (νΌλΆ, μ·)
βοΈ JavaScript: μΉ νμ΄μ§μ "λμ, κΈ°λ₯" (κ·Όμ‘, νλ)
π ν΅μ¬:
- HTML & CSS: μ μ (Static) β λ³νμ§ μμ
- JavaScript: λμ (Dynamic) β μ€μκ° λ³ν κ°λ₯
-->
<h1>β¨ μλ°μ€ν¬λ¦½νΈ(JavaScript) κ°μ</h1>
<p>
π HTML νμ΄μ§μ **λμ, κΈ°λ₯μ μ μ΄**<br>
π λΈλΌμ°μ μμ μ€νλλ **λνμ μΈ ν΄λΌμ΄μΈνΈ μ¬μ΄λ μΈμ΄**<br>
π **μΈν°νλ¦¬ν° λ°©μ** (ν μ€μ© ν΄μν΄ μ¦μ μ€ν)<br>
π₯ μ΅κ·Όμλ **Node.js**λ‘ μλ² μ¬μ΄λμμλ μ¬μ© κ°λ₯<br>
</p>
<!--
π μλ°μ€ν¬λ¦½νΈ νΉμ§ (μ¬ν μ 리)
1οΈβ£ μΈν°νλ¦¬ν° λ°©μ:
- λ³λ μ»΄νμΌ μμ΄ ν μ€μ© ν΄μ, λ°λ‘ μ€ν
- λ¬Έλ² μ€λ₯λ μ€ν μμ μμλ§ νμΈ κ°λ₯
2οΈβ£ μλ°μμ μ°¨μ΄:
- Java: μ μ νμ
+ μ»΄νμΌ νμ β JVMμμ μ€ν
- JavaScript: λμ νμ
+ μΈν°νλ¦¬ν° λ°©μ β λΈλΌμ°μ μμ μ€ν
3οΈβ£ λμ νμ
(Dynamic Typing):
- λ³μ μ μΈ μ νμ
λͺ
μ X β μ€ν μ€ νμ
κ²°μ
- μ μ°νμ§λ§ νμ
μ€λ₯ μν β
4οΈβ£ μ±κΈ μ€λ λ + λΉλκΈ° μ²λ¦¬:
- ν λ²μ νλμ μμ
(μ±κΈ μ€λ λ)
- λΉλκΈ° μ²λ¦¬λ Event Loop, Callback Queue νμ©
5οΈβ£ μ€ν νκ²½:
- λΈλΌμ°μ (ν΄λΌμ΄μΈνΈ) + Node.js(μλ²) + λͺ¨λ°μΌ, IoT λ± νμ₯ κ°λ₯
6οΈβ£ μ€μ½ν(Scope):
- var: ν¨μ μ€μ½ν (μ§μ)
- let, const: λΈλ‘ μ€μ½ν (κΆμ₯)
7οΈβ£ κ°μ²΄ μ§ν₯ + ν¨μν νλ‘κ·Έλλ° μ§μ
-->
<script>
// π’ μ½μμ "Hello World" μΆλ ₯
console.log("β
Hello World");
// π‘ λ³μ μ μΈ (λμ νμ
νΉμ§)
let variable = 10; // μ«μν
console.log("π λ³μ (μ«μ):", variable);
variable = "λ¬Έμμ΄"; // μ¬ν λΉ β λ¬Έμμ΄νμΌλ‘ λ³κ²½
console.log("π λ³μ (λ¬Έμμ΄):", variable);
// π― ν¨μ μ μΈμ μμ
function greet(name) {
console.log(`π μλ
νμΈμ, ${name}λ!`);
}
greet("νκΈΈλ");
// π¦ 쑰건문 μμ
let score = 75;
if (score >= 90) {
console.log("π
Aνμ ");
} else if (score >= 80) {
console.log("π Bνμ ");
} else {
console.log("π Cνμ μ΄ν");
}
// π λ°λ³΅λ¬Έ (for, while, forEach)
console.log("π forλ¬Έ:");
for (let i = 1; i <= 3; i++) {
console.log(`λ°λ³΅ ${i}`);
}
console.log("π whileλ¬Έ:");
let i = 1;
while (i <= 3) {
console.log(`λ°λ³΅ ${i}`);
i++;
}
console.log("π forEachλ¬Έ:");
const animals = ["πΆ", "π±", "π¦"];
animals.forEach((animal, index) => {
console.log(`${index + 1}λ²μ§Έ λλ¬Ό: ${animal}`);
});
// ποΈ κ°μ²΄ μ¬μ© (νλ‘νΌν° + λ©μλ)
const person = {
name: "μ² μ",
age: 25,
greet: function() {
console.log(`πββοΈ ${this.name}μ λμ΄λ ${this.age}μ΄`);
}
};
person.greet();
// βοΈ ν¨μ ννμ & νμ΄ν ν¨μ
const multiply = (a, b) => a * b;
console.log("βοΈ 3 x 4 =", multiply(3, 4));
// π λΉλκΈ° μ²λ¦¬ (setTimeout + μ΄λ²€νΈ 루ν κ°λ
)
console.log("β±οΈ 2μ΄ ν λ©μμ§ μΆλ ₯ μμ ...");
setTimeout(() => {
console.log("β
2μ΄ κ²½κ³Ό: λΉλκΈ° μ²λ¦¬ μλ£ (Event Loop μλ)");
}, 2000);
// π§ ν΄λ‘μ κΈ°λ³Έ μμ (μ¬ν)
function outer() {
let outerVar = "μΈλΆ λ³μ";
function inner() {
console.log(`π ν΄λ‘μ : ${outerVar}`);
}
return inner;
}
const closureFunc = outer();
closureFunc(); // μΈλΆ λ³μ μ κ·Ό
</script>
<h3>π μλ°μ€ν¬λ¦½νΈ νΉμ§ (μ 리)</h3>
<ul>
<li>β μ κ·Όμ νμ(public/private λ±) μμ β ES6 class μΌλΆ μ 곡</li>
<li>π‘ λμ νμ
β λ³μ νμ
μ€ν μ€ κ²°μ (μ₯μ : μ μ°, λ¨μ : νμ
λΆμμ )</li>
<li>π 보μμ JS μμ€κ° λ
ΈμΆ (F12 κ°λ°μλκ΅¬λ‘ νμΈ κ°λ₯)</li>
<li>β οΈ λ¬Έλ² μ€λ₯ μ€ν μμ μμλ§ λ°κ²¬ (μ»΄νμΌ X)</li>
<li>π κ°μ²΄ μ§ν₯ + ν¨μν νΌν©ν μΈμ΄</li>
<li>π± Node.js, React Nativeλ‘ μλ², λͺ¨λ°μΌ, IoT νμ₯</li>
<li>π¦ λ°©λν λΌμ΄λΈλ¬λ¦¬/νλ μμν¬ (React, Vue, Express λ±)</li>
</ul>
<h3>π μλ°μ€ν¬λ¦½νΈ μ¬μ© λ°©λ²</h3>
<ul>
<li>πΈ <strong>μΈλΌμΈ(Inline)</strong>: HTML νκ·Έμ μ§μ μ½μ
(λΉμΆμ² β μ μ§λ³΄μ μ΄λ €μ)</li>
<li>πΈ <strong>λ΄λΆ(Internal)</strong>: HTML λ΄λΆ <script> μ¬μ© (μκ·λͺ¨μ μ ν©)</li>
<li>πΈ <strong>μΈλΆ(External)</strong>: λ³λ .js νμΌ μμ± ν λΆλ¬μ€κΈ° (β
κ°λ ₯ μΆμ²)</li>
</ul>
<h4>π― μΈλΌμΈ λ°©μ μμ</h4>
<!-- π’ λ²νΌ ν΄λ¦ μ μλ¦Όμ°½ μΆλ ₯ (μΈλΌμΈ λ°©μ) -->
<button onclick="window.alert('π μλ
νμΈμ!')">μλ¦Όμ°½ μΆλ ₯</button>
<!-- π’ μ½μ μΆλ ₯ (μΈλΌμΈ) -->
<button onclick="console.log('π μ½μ μΆλ ₯')">μ½μ μΆλ ₯</button>
<!-- π’ λ§ν¬μμ μλ°μ€ν¬λ¦½νΈ μ€ν -->
<a href="javascript:alert('λ°κ°μ΅λλ€')">λ§ν¬μμ μλ¦Όμ°½ μΆλ ₯</a>
<a href="javascript:btnClick()">λ§ν¬μμ μ½μ μΆλ ₯</a>
<h4>π λ΄λΆ μ€ν¬λ¦½νΈ μμ</h4>
<button id="btn">λ΄λΆ μ€ν¬λ¦½νΈ μλ¦Ό μΆλ ₯</button>
<button onclick="btnClick()">λ΄λΆ μ€ν¬λ¦½νΈ μ½μ μΆλ ₯</button>
<script>
// π― λ΄λΆ λ°©μ: λ²νΌμ μ΄λ²€νΈ 리μ€λ μ°κ²°
let btn = document.getElementById("btn");
btn.onclick = function() {
window.alert("π’ λ΄λΆ μ€ν¬λ¦½νΈ μλ¦Όμ°½ μΆλ ₯λ¨");
};
// μ½μ μΆλ ₯ ν¨μ
function btnClick() {
console.log("β
μ½μ μΆλ ₯ λ²νΌ ν΄λ¦λ¨");
}
</script>
<H4>μΈλΆλ°©μ</H4>
<script src="sample.js" rel="javascript"></script>
<button onclick="text()">μΈλΆν¨μ νΈμΆ</button>
<!-- π μΈλΆ μ€ν¬λ¦½νΈ μμ -->
<!-- <script src="main.js"></script> -->
<!--
π μ€λ¬΄/λ©΄μ μ¬ν ν¬μΈνΈ:
1. μ±κΈ μ€λ λ β λΉλκΈ° μ²λ¦¬(Event Loop, Callback Queue, Web API ꡬ쑰 μ΄ν΄)
2. μ€μ½ν(ν¨μ/λΈλ‘) + ν΄λ‘μ (Closure) β λ©΄μ μμ μμ£Ό μ§λ¬Έ
3. νλ‘ν νμ
κΈ°λ° β μμ, λ©λͺ¨λ¦¬ ν¨μ¨ (prototype chain)
4. var λμ let/const μ¬μ© κΆμ₯ (ES6 μ΄ν)
5. Node.js β λ°±μλ, λͺ¨λ°μΌ, IoT νμ₯ κ°λ₯
6. ν¨μν ν¨ν΄, κ³ μ°¨ ν¨μ, async/await λ± μ΅μ λ¬Έλ²λ μ΅νκΈ°
-->
</body>
</html>
ποΈ C. μ±κΈ μ€λ λ + μ΄λ²€νΈ 루ν ꡬ쑰 μμ ν΄λΆ
μμ | μν | λΉμ |
---|---|---|
Call Stack | ν¨μ μ€ν μμ μ€ν | μ μ 창ꡬ |
Web APIs | λΉλκΈ° μμ μ²λ¦¬ κ³΅κ° (setTimeout, fetch λ±) | μ£Όλ°© μΈ μλ° |
Callback Queue | μμ μλ£λ μ½λ°± λκΈ°μ΄ | λκΈ° μλ |
Event Loop | Call Stack λΉλ©΄ λκΈ°μ΄ κ°μ Έμ΄ | μ¨μ΄ν° |
π μκ°ν:
π₯ Call Stack β π Web APIs β π¦ Callback Queue β π Event Loop β π₯ Call Stack
π‘ μ¬ν: Microtask vs Macrotask
κ΅¬λΆ | μμ |
---|---|
Microtask | Promise.then() , MutationObserver |
Macrotask | setTimeout , setInterval , UI μ΄λ²€νΈ |
μ°μ μμ:
Microtaskκ° νμ λ¨Όμ μ€νλ¨!
π§© D. κ°μ²΄ μ§ν₯ & νλ‘ν νμ μμ λΆμ
μλ°μ€ν¬λ¦½νΈ | ν΄λμ€ κΈ°λ° μΈμ΄ |
---|---|
κ°μ²΄ β νλ‘ν νμ μ²΄μΈ | ν΄λμ€ β μμ |
λμ νμ₯ κ°λ₯ | μ μ ꡬ쑰 |
function Animal(name) {
this.name = name;
}
Animal.prototype.sound = function() {
console.log('sound');
};
const dog = new Animal('Dog');
dog.sound();
π Prototype Chain μκ°ν:
dog β Animal.prototype β Object.prototype β null
π λ©΄μ ν¬μΈνΈ:
βνλ‘ν νμ μμκ³Ό ν΄λμ€ μμμ μ°¨μ΄μ μ?β
πΉοΈ E. μμ§ μ¬ν (V8 κΈ°μ€)
π₯ V8 μμ§μ κ°μ
- JIT μ»΄νμΌ β λΉ λ¦
- Garbage Collector β λ©λͺ¨λ¦¬ κ΄λ¦¬ μλ
- Hidden Class β κ°μ²΄ μ΅μ ν
- Inline Cache β λμΌ μ°μ° κ°μ
π μ€λ¬΄:
Node.jsλ V8 κΈ°λ° β μλ°μ€ν¬λ¦½νΈ μλ²μμ λμ
π κΈ°μ λ©΄μ λλΉ & μ€λ¬΄ ν¬μΈνΈ
μ§λ¬Έ | ν΅μ¬ |
---|---|
μ±κΈ μ€λ λμΈλ° λΉλκΈ° μ²λ¦¬ λ°©λ²μ? | μ΄λ²€νΈ 루ν, Web API, μ½λ°± ν ꡬ쑰 |
νλ‘ν νμ 체μΈμ΄λ? | κ°μ²΄κ° λΆλͺ¨ μν κ°μ²΄ μ°Έμ‘° |
TypeScriptκ° μ νμνκ°? | λμ νμ΄νμΌλ‘ μΈν νμ λΆμμ μ± ν΄κ²° |
V8 μμ§ νΉμ§? | JIT μ»΄νμΌ, λ©λͺ¨λ¦¬ μ΅μ ν |
Javaμ JavaScript μ°¨μ΄? | ꡬ쑰/λͺ©μ /νμ μ λΆ λ€λ¦, μ΄λ¦λ§ λΉμ· |
1οΈβ£ μ±κΈ μ€λ λμΈλ° λΉλκΈ° μ²λ¦¬ λ°©λ²μ?
π ν΅μ¬
- μλ°μ€ν¬λ¦½νΈλ μ±κΈ μ€λ λ β ν λ²μ ν μμ λ§ μ€ν κ°λ₯
- κ·Έλ°λ° λΉλκΈ° μμ (setTimeout, Ajax, Event) λ κ°λ₯ν¨!
π― μ΄λ»κ² κ°λ₯?
π μ΄λ²€νΈ 루ν(Event Loop), Web API, μ½λ°± ν ꡬ쑰 λλΆ!
𧩠ꡬ쑰 νλ¦
- μ±κΈ μ€λ λ: λ©μΈ μ€λ λμμ μ½λ ν μ€μ© μ€ν.
- Web API μμ (λΈλΌμ°μ μ 곡):
- λΉλκΈ° μμ (setTimeout, DOM μ΄λ²€νΈ, fetch λ±) μ²λ¦¬λ₯Ό λ§‘μ.
- μ½λ°± ν(Callback Queue):
- λΉλκΈ° μμ λλ ν, μ½λ°± ν¨μκ° νμ λ€μ΄κ°.
- μ΄λ²€νΈ 루ν(Event Loop):
- λ©μΈ μ€νμ΄ λΉλ©΄, μ½λ°± νμ μλ μμ μ κ°μ Έμ μ€ν!
π‘ μ 리
κ΅¬μ± μμ | μν |
---|---|
μ±κΈ μ€λ λ | ν λ²μ νλμ© μ½λ μ€ν |
Web API | λΉλκΈ° μμ μ²λ¦¬ (setTimeout λ±) |
μ½λ°± ν | μλ£λ λΉλκΈ° μμ λκΈ° μ₯μ |
μ΄λ²€νΈ 루ν | λ©μΈ μ€νμ΄ λΉλ©΄, μ½λ°± νμμ μμ κ°μ Έμ΄ |
2οΈβ£ νλ‘ν νμ 체μΈμ΄λ?
π ν΅μ¬
- κ°μ²΄κ° λΆλͺ¨ μν κ°μ²΄(νλ‘ν νμ )λ₯Ό μ°Έμ‘°νλ ꡬ쑰!
π― μ΄λ»κ² λμ?
- κ°μ²΄κ° μ΄λ€ μμ±μ μ°Ύμ λ:
- λ¨Όμ μκΈ° μμ μκ²μ μ°Ύμ.
- μμΌλ©΄ μκΈ° λΆλͺ¨μΈ νλ‘ν νμ κ°μ²΄μμ μ°Ύμ.
- κ³μ μλ‘ λ°λΌκ° β νλ‘ν νμ 체μΈ!
- λκΉμ§ μμΌλ©΄
undefined
.
π λΉμ
let parent = { skill: "coding" };
let child = Object.create(parent);
console.log(child.skill); // "coding" (λΆλͺ¨μμ μμλ°μ)
β μμμ²λΌ μλ, κ°μ²΄ κ° μ°κ²° κ³ λ¦¬!
3οΈβ£ TypeScriptκ° μ νμνκ°?
π ν΅μ¬
- λμ νμ΄ν λλ¬Έμ νμ μ΄ λΆμμ β λ²κ·Έ λ°μ μν λμ.
- TypeScript β μ μ νμ + νμ κ²μ¬ μ 곡 β μμ μ± ν보!
π― μ₯μ
μ₯μ | μ€λͺ |
---|---|
μ μ νμ | λ³μ, ν¨μμ νμ λͺ νν λͺ μ κ°λ₯ |
μ»΄νμΌ λ¨κ³μμ μ²΄ν¬ | νμ μλ¬ λ―Έλ¦¬ λ°κ²¬ β λ°νμ μ€λ₯ μ€μ |
μ½λ κ°λ μ± β | νμ μ νμ λͺ ν β μ μ§λ³΄μ μ¬μ |
μλμμ± β | IDEμμ νμ μ 보 κΈ°λ°μΌλ‘ μΆμ² κ°λ₯ |
4οΈβ£ V8 μμ§ νΉμ§?
π ν΅μ¬
- V8 = ν¬λ‘¬, Node.jsμ μ¬μ©λλ μλ°μ€ν¬λ¦½νΈ μμ§
- νΉμ§:
- JIT μ»΄νμΌ(Just-In-Time) β λΉ λ₯Έ μ€ν μλ
- λ©λͺ¨λ¦¬ μ΅μ ν β κ°λΉμ§ 컬λ μ μν¨
π― μμΈ
νΉμ§ | μ€λͺ |
---|---|
JIT μ»΄νμΌ | μλ°μ€ν¬λ¦½νΈ β κΈ°κ³μ΄λ‘ λ°λ‘ λ³ν β λΉ λ¦ |
κ°λΉμ§ 컬λ μ | μ μ°λ λ©λͺ¨λ¦¬ μλ μ 리 β λ©λͺ¨λ¦¬ λμ λ°©μ§ |
μ΅μ νλ μ€ν | μμ£Ό μ°λ μ½λ β λ λΉ λ₯΄κ² μ¬μ»΄νμΌ |
5οΈβ£ Javaμ JavaScript μ°¨μ΄?
π ν΅μ¬
μ΄λ¦λ§ λΉμ·νκ³ μμ ν λ€λ₯Έ μΈμ΄!
π― μ£Όμ μ°¨μ΄μ
κ΅¬λΆ | Java | JavaScript |
---|---|---|
ꡬ쑰 | μ»΄νμΌ μΈμ΄, κ°νμ , ν΄λμ€ κΈ°λ° | μΈν°νλ¦¬ν° μΈμ΄, λμ νμ , νλ‘ν νμ κΈ°λ° |
μ€ν νκ²½ | JVM (Java Virtual Machine) | λΈλΌμ°μ , Node.js |
λͺ©μ | μλ², μν°νλΌμ΄μ¦, μ± κ°λ°μ© | μΉ κ°λ° (μ£Όλ‘ ν΄λΌμ΄μΈνΈ), νμ€ν κ°λ₯ |
νμ | μ μ νμ (νμ λͺ μ νμ) | λμ νμ (νμ μμ λ‘μ) |