# javascript-postbox
<table>
<tr>
<td align="center">
<a href="https://github.com/mansaout">
<img src="https://avatars.githubusercontent.com/u/41741221?v=4" width="100px;" alt="Yellow"/><br />
<sub><b>Yellow</b><br></sub>
</a>
</td>
<td align="center">
<a href="https://github.com/healtheloper">
<img src="https://avatars.githubusercontent.com/u/58503584?v=4" width="100px;" alt="Park"/><br />
<sub><b>Park</b><br></sub>
</a>
</td>
</tr>
</table>
<br>
## π§ μ΄λ€ μκ°μΌλ‘ λ―Έμ
μμ?
- νκΈμ½λ©
- `μ?` : λλΌμ΄λ²κ° μ½λλ₯Ό μ€λͺ
ν λ νκΈλ‘ μ€μΌλ ν€ μ½λλ₯Ό μμ±νλ©΄μ 보μ¬μ£Όλ€κ° μ€νλ € νκΈ μ½λκ° λ μ΄ν΄κ° μλλ λλμ λ°μμ μ€μ λ‘ <a href="https://youtu.be/edWbHp_k_9Y?t=865">νκΈλ‘ μ½λ©μ νλ μ¬λ‘</a> λ μλ€κ³ λ€μ΄μ νλ² ν΄λ³΄λ©΄ μ¬λ°κ² λ€λΌλ μκ°μΌλ‘ νκΈμ½λ©μ μμ νμ΅λλ€.
- μ€κ°μ λ€λΉκ²μ΄ν°μ λ‘μ§μ΄ μ΄ν΄κ° μλλ€λ©΄ λ©μΆκ³ μκ°νκΈ°
- λ μ¬λμ΄ μλ²½ν μ½λμ λν΄μ μ΄ν΄λ₯Ό ν΄μΌ νΌλλ°±μ΄ μνν μ΄λ£¨μ΄μ§ μ μλ€λ μκ°μΌλ‘ μ§ννμ΅λλ€.
<br>
## π λ―Έμ
λ³ μ΄κΈ° μ€κ³
### λ―Έμ
1
- html λΌλ λ¨Όμ λ§λ€κΈ°
- λ§μμ§λ, λ²νΌ, λ§μ μ 보(μ΄ ~κ°μ λ§μμ
λλ€)
- λ§μ class λ§λ€κΈ°
- μμ±: Width, Height, Positions, box:object
- λ©μλ: ν¬ν¨λλ λ§μ λ§λ€κΈ°
- λλ€ν λ²μ μ§μ ν΄μ£Όλ ν¨μ λ§λ€κΈ°
- validation ν¨μ(λ€λ₯Έ λ§μκ³Ό κ²ΉμΉμ§ μλμ§) λ§λ€κΈ°
### ꡬννλ©΄μ λ°λμ
- λ§μ class μμ±
- κ°λ‘κΈΈμ΄, μΈλ‘κΈΈμ΄, μ’ν(->μλμ’ν), μ°μ²΄ν΅:object(`new μ°μ²΄ν΅`)
- οΉ’μ°μ²΄ν΅ν¬κΈ°, λ§μμ΄λ¦, μμλ§μ
- μ°μ²΄ν΅ν¬κΈ° λν λλ€μΌλ‘ λ§λ€μ΄ μ ΈμΌ ν΄μ μλ²μμ λ°μ΄ν°λ₯Ό λ°λ ꡬ쑰λ₯Ό μκ°νμ λ μ°μ²΄ν΅ ν¬κΈ° λν ν¬ν¨λμ΄μΌ νλ€κ³ μκ°μ΄ λ¦
- λ§μμ΄λ¦μ΄ ν¬ν¨λμ΄μΌ νλ€λ κ²μ λ¦κ² νμΈν¨...
- λ§μμ΄ μμλ§μμ μ 보λ₯Ό κ°λλ€κ³ ν λ, λ°°μ΄ ννλ‘ κ°κ³ λ§μκ³Ό λμΌν μμ±μ κ°κ² λ κ²μ΄λΌκ³ μκ°ν΄μ μλ²μμ μ¬κ·μ μΌλ‘ μμ±ν΄ λ°μ΄ν°λ₯Ό λ£μ΄ μ€ μ μλλ‘ νμμ
- μ¬κ·μ μΌλ‘ μμ±ν λ 무νν λ§λ€μ΄ μ§ μ μλλ‘ λ§μμ μ΅μ κΈΈμ΄λ₯Ό μ€μ ν΄μ ν΄λΉ λ²μλ₯Ό λ²μ΄λλ©΄ μ¬κ·ν¨μλ₯Ό `return` νλλ‘ νμ΅λλ€.
<br>
```javascript
const λ§μμ΅μκΈΈμ΄ = 100;
const λ§μμμ± = ({ κΈ°μ€κ°λ‘κΈΈμ΄, κΈ°μ€μΈλ‘κΈΈμ΄, κΈ°μ€μ¬λΆλ©΄ }) => {
if (κΈ°μ€κ°λ‘κΈΈμ΄ < λ§μμ΅μκΈΈμ΄ || κΈ°μ€μΈλ‘κΈΈμ΄ < λ§μμ΅μκΈΈμ΄) return;
return Array(λ§μκ°μλλ€μμ±())
.fill(0)
.map((_, i) => {
...
const μμλ§μ = λ§μμμ±({
κΈ°μ€κ°λ‘κΈΈμ΄: κ°λ‘κΈΈμ΄,
κΈ°μ€μΈλ‘κΈΈμ΄: μΈλ‘κΈΈμ΄,
κΈ°μ€μ¬λΆλ©΄: μμμ¬λΆλ©΄,
});
...
})
};
```
- λ©μλ: ν¬ν¨λλ λ§μ λ§λ€κΈ°
- λ©μλ λμ μλ²μμ μ¬κ·μ μΌλ‘ μμ±νμ¬ λ겨주λ λ°©μμΌλ‘ λ³κ²½
- validation ν¨μ
- μ²μμ μμλ‘ λλ€ν μ’νλ₯Ό μ§μ νκ³ , μ’νλ₯Ό κΈ°μ€μ νμ λ κ°λ‘+μΈλ‘κΈΈμ΄λ₯Ό λν΄μ ν΄λΉ μμμ μ¬κ°νμ΄ μλμ§λ₯Ό νλ¨νλ μκ³ λ¦¬μ¦μ λ§λ€μ΄ `validation` μ ν΄μΌν κ²μ΄λΌκ³ μκ° νμ΅λλ€
- μ μκ³ λ¦¬μ¦μ΄ λ§€μ° λ³΅μ‘ν κ²μ΄λΌκ³ μκ°μ΄ λ€μκ³ , λ§μ μμ ν¬ν¨λλ μμλ§μμ ννλ‘ κ΅¬νμ νκ³ , κ·Έ λ§μμ μμμ 4λ±λΆ ν΄μ μ¬μ©νμκ³ μ μ½μ κ±Έλ©΄ ν¬κ² κ²ΉμΉ μΌλ μμ κ²μ΄λΌκ³ μκ°νμ¬ λ°λ‘ λ§λ€μ§ μμμ΅λλ€
<br>
### λ―Έμ
2
- λΉ¨κ° μ°μ²΄ν΅μ΄ μλ λ§μ μΆλ ₯, μ°μ²΄ν΅ ν¬κΈ° μ μΆλ ₯, 2μ΄ λ€ λ§μ μμ λ³κ²½
1. μ°μ²΄ν΅μ΄ μλ λ§μμ λ νμν΄ μλ‘μ΄ λ°°μ΄(`μ°μ²΄ν΅λ§μλ€`)λ‘ λͺ¨μΌκΈ°
- `μ°μ²΄ν΅λ§μλ€` μ΄λΌλ λ°°μ΄μ ν΄λΉ λ§μλ€μ μΆκ°
2. μ°μ²΄ν΅μ΄ μλ λ§μ μ΄λ¦ μΆλ ₯
- `μ°μ²΄ν΅λ§μλ€` λ°°μ΄μ μννλ©΄μ μμ κ° λ§μμ μ΄λ¦κ³Ό, μ΄ λ§μ κ°μλ₯Ό κ°μ Έμ μΆλ ₯
3. μ°μ²΄ν΅λ§μμ μ°μ²΄ν΅ν¬κΈ° μμΌλ‘ λ²λΈμ λ ¬ ν ν¬κΈ°μ μ΄λ¦ μΆλ ₯
- `μ°μ²΄ν΅λ§μλ€` λ°°μ΄μ μ°μ²΄ν΅ ν¬κΈ° μμΌλ‘ λ²λΈ μ λ ¬
- μννλ©΄μ λ§μ μ΄λ¦ μΆλ ₯
7. 2μ΄ λλ μ΄ ν μ°μ²΄ν΅λ§μμ μμ λ³κ²½
- 2μ΄ λλ μ΄
- `μ°μ²΄ν΅λ§μλ€` λ°°μ΄ μννλ©΄μ κ° λ§μμ `style.border`μ μΈλΌμΈ λ³κ²½
```javascript=
λ²νΌ.addEventListener("click", async () => {
μ°μ²΄ν΅λ§μμ°ΎκΈ°(ν΄λμ€λ‘μμμ°ΎκΈ°("townMap"));
λ§μμ 보μΆλ ₯();
await λλ μ΄(2000);
μ°μ²΄ν΅λ§μλ€.forEach((λ§μ) => {
μ°μ²΄ν΅λ§μμμλ³κ²½(λ§μ);
});
});
const λ§μμ 보μΆλ ₯ = () => {
const μ°μ²΄ν΅λ§μμ΄λ¦λ€ = μ°μ²΄ν΅λ§μμ΄λ¦λ€νμΈ(μ°μ²΄ν΅λ§μλ€);
ν΄λμ€λ‘μμμ°ΎκΈ°("townCount").innerHTML = `${μ°μ²΄ν΅λ§μμ΄λ¦λ€.join(", ")} μ΄ ${μ°μ²΄ν΅λ§μμ΄λ¦λ€.length}κ°μ λ§μμ
λλ€.`;
μ°μ²΄ν΅λ§μλ€.νν¬μλ‘μ°μ λ ¬((a, b) => μ°μ²΄ν΅ν¬κΈ°νμΈ(b) - μ°μ²΄ν΅ν¬κΈ°νμΈ(a));
ν΄λμ€λ‘μμμ°ΎκΈ°("boxSize").innerHTML = `μ°μ²΄ν΅μ ν¬κΈ°λ ${μ°μ²΄ν΅λ§μμ΄λ¦λ€νμΈ(μ°μ²΄ν΅λ§μλ€)} μμ
λλ€.`;
};
```
<br>
### λ―Έμ
3
- `Express` μμ λλ€ν λ‘μ§μΌλ‘ λ§μ λ°μ΄ν° μμ±ν΄μ μ λ¬
- λ―Έμ
1κ³Ό λμμ μ§ννλ©΄μ, λ§μ λ°μ΄ν°μ ꡬ쑰λ₯Ό μ§λ³΄κ³ μμμ νμ΅λλ€.
- λ§μ λ°μ΄ν° ꡬ쑰λ₯Ό λ¨Όμ μ§λ `Client` μμ ν΄λΉ λ°μ΄ν° ꡬ쑰λ₯Ό λ°νμΌλ‘ `Class` ꡬ쑰λ₯Ό ꡬμνκΈ°κ° μμνμ΅λλ€.
- `fetch` μμ²μ 보λ΄λ©΄ μλ²μμ λ§μλ°μ΄ν°λ₯΄λ₯΄ μμ±ν΄ jsonμΌλ‘ μ λ¬
```javascript
// μλ²
app.get("/town", (req, res) => {
res.setHeader("Access-Control-Allow-Origin", "*");
res.json(λ°μ΄ν°μ»κΈ°());
});
// ν΄λΌμ΄μΈνΈ
const λ§μμ 보κ°μ Έμ€κΈ° = async () => {
const res = await fetch("http://127.0.0.1:3000/town");
return res.json();
};
```
### λ―Έμ
μΉμ
μΈ κ΅¬ν
- `querySelector` -> `ν΄λμ€λ‘μμμ°ΎκΈ°`
- `querySelector` λΌλ `DOM API` κ° `Document` λΌλ `DOM Tree` λ₯Ό μννλ©° `μμ`λ₯Ό μ°Ύλ κ² μ΄λΌκ³ μκ°ν΄μ, `Tree` λ₯Ό νμνκΈ° μν `DFS μκ³ λ¦¬μ¦` μ μ¬μ©νλ©΄ λμ§ μμκΉ? λΌλ μκ°μΌλ‘ μμνμ΅λλ€.
- `DFS` κ° μ½μ€νμ κ³μ μμ¬μ `Return` λ°λ κ°μ μμνκΈ°κ° μ‘°κΈ μ΄λ €μ λλ°, λλ²κΉ
ν΄λ‘ νμΈμ ν΄λ μ΄ν΄λ₯Ό νκΈ° μ½μ§ μμ λΆλΆμ΄ μμ΄μ `DFS μκ³ λ¦¬μ¦` μ μ’ λ 곡λΆν΄λ³΄λ €κ³ ν©λλ€.
- `DFS` λ‘μ§ μμμ λ λ²μ§Έ μΈμλ‘ λ°λ `ν΄λμ€` λ₯Ό `μ
λ ν°` κ°μ μ΄λ¦μΌλ‘ λ°κΎΈμ΄μ λ΄λΆ λ‘μ§μ `μ
λ ν°`μ λ°λΌ `μ°Ύμλ
Έλ` λ₯Ό μ°Ύλ ν¨μλ₯Ό λ³λλ‘ λ§λ λ€λ©΄ λ€μν `μ
λ ν°`λ‘ `μμ`λ₯Ό μ°Ύμ μ μμ§ μμκΉλ μκ°μ νκ³ μ΄ λΆλΆμ μ²μ²ν νμ₯ν΄λ³΄λ €κ³ ν©λλ€.
```javascript
const dfs = (μμμ , ν΄λμ€) => {
const μμλ
Έλλ€ = [...μμμ .children];
const μ°Ύμλ
Έλ = μμλ
Έλλ€.find((μμλ
Έλ) =>
μμλ
Έλ.classList.contains(ν΄λμ€)
);
if (μ°Ύμλ
Έλ) {
return μ°Ύμλ
Έλ;
} else {
return μμλ
Έλλ€.map((μμλ
Έλ) => dfs(μμλ
Έλ, ν΄λμ€)).find((v) => v);
}
};
const ν΄λμ€λ‘μμμ°ΎκΈ° = (ν΄λμ€) => {
return dfs(document.body, ν΄λμ€);
};
```
- `Array.prototype.sort` -> `Array.prototype.νν¬μλ‘μ°μ λ ¬`
- `λ°°μ΄` μ μΈμλ‘ λ°μμ `λ°°μ΄` μ `Return` νλ ν¨μ ννλ‘ μ λ ¬μ λ§λ€μ΄ λ³΄λ €λ€κ°, κΈ°μ‘΄μ `sort` μ²λΌ λκ°μ΄ λμμ ν μ μλλ‘ λ§λ€μ΄ λ³΄κ³ μΆλ€λ μκ°μ΄ λ€μ΄μ `Array.prototype` μ λ©μλλ‘ μΆκ°νλ λ°©μμ ν΄λ³΄λ©΄ μ΄λ¨κΉ? λΌλ μ견μΌλ‘ λ§λ€μ΄ λ³΄κ² λμμ΅λλ€.
- `callback` μ μΈμλ‘ λ°κΈ° λλ¬Έμ `callback` μ μ€μ λ‘ μ΄λ»κ² μ¬μ©ν΄μΌ νλμ§μ λν΄ μκ°νλκ² μ‘°κΈ μ΄λ €μ λλ°, μ¬λ°λ κ²½νμ΄μμ΅λλ€.
- `μ λ ¬` κ³Ό κ΄λ ¨ν΄μ λ€μν μκ³ λ¦¬μ¦μ΄ μ‘΄μ¬νμ§λ§, νμ΄νλ‘κ·Έλλ° νΉμ±μ 볡μ‘ν μκ³ λ¦¬μ¦μ λ°λΌμΉκΈ°λ³΄λ€λ μ€μ λ‘ μ λ ¬μ μ΄λ»κ² ν΄μΌν μ§ μκ°μ μ§μ ꡬνν΄λ³΄λ μμΌλ‘ μ λ ¬μ ꡬνν΄μ `λ²λΈμ λ ¬` μ²λΌ λ§λ€κ² λμμ΅λλ€. `λ²λΈμ λ ¬` λ§κ³ λ λ€μν μκ³ λ¦¬μ¦μ 곡λΆν΄λ³΄λ € ν©λλ€.
```javascript
Array.prototype.νν¬μλ‘μ°μ λ ¬ = function (callback) {
const arr = this;
for (let i = 0; i < arr.length - 1; i++) {
for (let k = 0; k < arr.length - i - 1; k++) {
const a = arr[k];
const b = arr[k + 1];
const diff = callback(a, b);
if (diff > 0) {
arr[k] = b;
arr[k + 1] = a;
}
}
}
return arr;
};
```
- `setTimeout` -> `λλ μ΄`
- `λ°λ¦¬μ΄`λ₯Ό μΈμλ‘ λ°μ ν΄λΉ μκ°λ§νΌ setTimeoutλ₯Ό μ€ννκ³ νλ‘λ―Έμ€λ₯Ό λ°ννλ λλ μ΄ ν¨μ ꡬννμ΅λλ€.
- μ€μ§ μ§μ°μ μν€λ μν λ§ νκΈ° λλ¬Έμ μΈμλ‘ `λ°λ¦¬μ΄`λ§ λ°κ³ , ν΄λΉμκ°μ΄ μ§λ ν resolve() ν΄μ€¬μ΅λλ€.
```javascript
const λλ μ΄ = (λ°λ¦¬μ΄) => {
return new Promise((resolve) => {
setTimeout(() => {
resolve();
}, λ°λ¦¬μ΄);
});
};
async () => {
await λλ μ΄(2000);
//2μ΄λ€μ μ€ν
}()
```
## βΊοΈ λλμ
`Park` : `νκΈμ½λ©` μΌλ‘ μ²μ μ½λ©μ ν΄λ³΄μλλ°, μκ°λ³΄λ€ κ°λ
μ±μ΄ ν¨μ¬ μ’μμ‘λ€λ μκ°λ λ€μκ³ , λ³μ, ν¨μλͺ
μ `νκΈ->μμ΄` λ‘ λ²μνλ λ¨κ³λ₯Ό 1 λ¨κ³ μ€μ¬μ μ½λ©μ νλ μκ°λ 물리μ μΌλ‘ μ€μλ€κ³ λκΌμ΅λλ€. νμ΄νλ‘κ·Έλλ°μ νλ©΄μ κ°μ₯ μ μ νμκ° μλμλ λΌλ μκ°μ΄ λ€μκ³ μ¬λ°λ κ²½νμ΄μμ΅λλ€. μ½λ© μ€κ°μ€κ°μ `λμ λ‘μ§μ μ΄ν΄νλμ§ νμΈνκ³ μ€λͺ
νλ κ³Όμ `μ μ€κ°μ€κ°μ κ°κ²λλ λμ λ‘μ§μ λν΄μ λ μκ°νκ² λκ³ νΌλλ°±λ λ°μ μ μμ΄μ μ’μμ΅λλ€.
`Yellow` :
`νκΈμ½λ©`μ΄ κ΅μ₯ν μ¬λ°λ κ²½νμ΄μμ΅λλ€. κΈ°μ‘΄μ λ§μ κ³ λ―Όμ΄ νμνλ λ³μ, ν¨μλͺ
μ΄λ¦ μ§λ κ³Όμ μ μ€μΌ μ μμ΄μ μ’μκ³ , λν κ°λ
μ±μ΄ λμμ Έ νλ‘κ·Έλλ°νλλ° (νΉν νμ΄νλ‘κ·Έλλ°) ν° λμμ λ°μ κ² κ°μ΅λλ€. if, const, let κ°μ κΈ°μ‘΄ μλ°μ€ν¬λ¦½νΈ λ¬Έλ²μ μμ΄λ‘, μ ν¬κ° μλ‘κ² λ§λ λ³μλͺ
, ν¨μλͺ
μ νκΈλ‘ μμ±ν κ²μ΄ λ‘μ§κ³Ό μ ν¬κ° λ§λ κ²μ λ μ λΆλ¦¬ν΄ λ³Ό μ μμ΄μ κ°λ
μ±μ΄ μ¬λΌκ° κ² κ°μ΅λλ€.
νΉμ κΈ°λ₯μ ꡬννκΈ°μ μ μλ‘ λ³ΈμΈμ΄ κ°μ§ μκ°μ κ°μ΄ 곡μ νκ³ μ견μ λλλ κ³Όμ μ΄, νΌμ κ³ λ―Όνκ³ νμ΅νλ κ²λ³΄λ€ μ μκ² λ ν¨κ³Όμ μ΄μμ΅λλ€.