JavaScript λ°μ΄ν° ꡬ쑰μ νμ λ°ννμΈμ. μ΄ ν¬κ΄μ μΈ κ°μ΄λλ λ΄μ₯ Mapκ³Ό Setμ νꡬνκ³ , μ¬μ©μ μ μ ꡬν μ λ΅μ ν¨κ» λ€λ£¨μ΄ μ μΈκ³ κ°λ°μμκ² ν¨μ¨μ μΈ λ°μ΄ν° κ΄λ¦¬ λ₯λ ₯μ μ 곡ν©λλ€.
JavaScript λ°μ΄ν° ꡬ쑰: μ μΈκ³ κ°λ°μλ₯Ό μν Map, Set λ° μ¬μ©μ μ μ ꡬν λ§μ€ν°νκΈ°
λμμμ΄ λ³ννλ μννΈμ¨μ΄ κ°λ° μΈκ³μμ λ°μ΄ν° ꡬ쑰λ₯Ό λ§μ€ν°νλ κ²μ λ§€μ° μ€μν©λλ€. μ΄λ ν¨μ¨μ μΈ μκ³ λ¦¬μ¦κ³Ό μ μ 리λ μ½λμ κΈ°λ°μ νμ±νλ©°, μ ν리μΌμ΄μ μ±λ₯ λ° νμ₯μ±μ μ§μ μ μΈ μν₯μ λ―ΈμΉ©λλ€. μ μΈκ³ κ°λ°μμκ²λ λ€μν μ¬μ©μ κΈ°λ°μ λμνκ³ λ³ννλ λ°μ΄ν° λΆνλ₯Ό μ²λ¦¬νλ κ°λ ₯ν μ ν리μΌμ΄μ μ ꡬμΆνκΈ° μν΄ μ΄λ¬ν κ°λ μ μ΄ν΄νλ κ²μ΄ μ€μν©λλ€. μ΄ ν¬κ΄μ μΈ κ°μ΄λλ JavaScriptμ κ°λ ₯ν λ΄μ₯ λ°μ΄ν° κ΅¬μ‘°μΈ Mapκ³Ό Setμ μ¬μΈ΅μ μΌλ‘ λ€λ£¨κ³ , μ΄μ΄μ μμ λ§μ μ¬μ©μ μ μ λ°μ΄ν° ꡬ쑰λ₯Ό μμ±ν΄μΌ νλ μ€λλ ₯ μλ μ΄μ μ λ°©λ²μ νꡬν©λλ€.
μ°λ¦¬λ μ€μ©μ μΈ μμ , μ€μ μ¬μ© μ¬λ‘ λ° μ€ν κ°λ₯ν ν΅μ°°λ ₯μ ν΅ν΄ λͺ¨λ λ°°κ²½μ κ°λ°μκ° μ΄λ¬ν λꡬλ₯Ό μ΅λν νμ©ν μ μλλ‘ λ³΄μ₯ν κ²μ λλ€. λ² λ₯Όλ¦°μ μ€ννΈμ , λμΏμ λκΈ°μ , λλ μνμΈλ£¨ κ³ κ°μ μν ν리λμ€ νλ‘μ νΈμμ μΌνλ , μ¬κΈ°μ λ Όμλ μμΉλ€μ 보νΈμ μΌλ‘ μ μ© κ°λ₯ν©λλ€.
JavaScriptμμ λ°μ΄ν° ꡬ쑰μ μ€μμ±
νΉμ JavaScript ꡬνμΌλ‘ λ€μ΄κ°κΈ° μ μ, λ°μ΄ν° κ΅¬μ‘°κ° μ κ·Έλ κ² κ·Όλ³Έμ μΈμ§ κ°λ΅νκ² μ΄ν΄λ³΄κ² μ΅λλ€. λ°μ΄ν° ꡬ쑰λ λ°μ΄ν°λ₯Ό ꡬμ±, μ²λ¦¬, κ²μ λ° μ μ₯νκΈ° μν νΉμ νμμ λλ€. λ°μ΄ν° ꡬ쑰μ μ νμ μ½μ , μμ , κ²μ λ° μ λ ¬κ³Ό κ°μ μμ μ ν¨μ¨μ±μ ν¬κ² μν₯μ λ―ΈμΉ©λλ€.
νλ°νΈμλ, λ°±μλ(Node.js) λ° λͺ¨λ°μΌ κ°λ° μ λ°μ κ±Έμ³ μ μ°μ±κ³Ό κ΄λ²μν μ±νμΌλ‘ μ λͺ ν JavaScriptμμ ν¨μ¨μ μΈ λ°μ΄ν° μ²λ¦¬λ λ§€μ° μ€μν©λλ€. μλͺ» μ νλ λ°μ΄ν° ꡬ쑰λ λ€μμΌλ‘ μ΄μ΄μ§ μ μμ΅λλ€.
- μ±λ₯ λ³λͺ© νμ: λλ¦° λ‘λ© μκ°, μλ΅ μλ UI, λΉν¨μ¨μ μΈ μλ² μΈ‘ μ²λ¦¬.
- λ©λͺ¨λ¦¬ μλΉ μ¦κ°: λΆνμν μμ€ν 리μμ€ μ¬μ©μΌλ‘ μΈν μ΄μ λΉμ© μ¦κ° λ° μ μ¬μ μΆ©λ.
- μ½λ 볡μ‘μ±: 볡μ‘ν λ°μ΄ν° κ΄λ¦¬ λ‘μ§μΌλ‘ μΈν΄ μ½λ μ μ§ κ΄λ¦¬ λ° λλ²κΉ μ μ΄λ €μ.
JavaScriptλ κ°λ ₯ν μΆμνλ₯Ό μ 곡νλ©΄μλ, κ°λ°μμκ² κ³ λλ‘ μ΅μ νλ μ루μ μ ꡬνν μ μλ λꡬλ₯Ό μ 곡ν©λλ€. λ΄μ₯ ꡬ쑰μ μ¬μ©μ μ μ ꡬ쑰μ ν¨ν΄μ μ΄ν΄νλ κ²μ μλ ¨λ κΈλ‘λ² κ°λ°μκ° λλ λ° ν΅μ¬μ λλ€.
JavaScriptμ λ΄μ₯λ κ°λ ₯ν λꡬ: Mapκ³Ό Set
μ€λ«λμ JavaScript κ°λ°μλ€μ λ°μ΄ν° 컬λ μ μ κ΄λ¦¬νκΈ° μν΄ μΌλ° JavaScript κ°μ²΄(μ¬μ λλ ν΄μ λ§΅κ³Ό μ μ¬)μ λ°°μ΄μ ν¬κ² μμ‘΄νμ΅λλ€. μ΄κ²λ€μ λ€μ¬λ€λ₯νμ§λ§ νκ³κ° μμμ΅λλ€. ECMAScript 2015(ES6)μμ Mapκ³Ό Setμ΄ λμ λλ©΄μ JavaScriptμ λ°μ΄ν° κ΄λ¦¬ κΈ°λ₯μ΄ ν¬κ² ν₯μλμκ³ , λ μ λ¬Έμ μ΄κ³ μ’ μ’ λ μ±λ₯μ΄ μ’μ μ루μ μ μ 곡νκ² λμμ΅λλ€.
1. JavaScript Map
Mapμ ν€-κ° μμ 컬λ μ μΌλ‘, ν€λ κ°μ²΄, ν¨μ, μμκ°μ ν¬ν¨ν λͺ¨λ λ°μ΄ν° νμ μ΄ λ μ μμ΅λλ€. μ΄λ ν€κ° μ묡μ μΌλ‘ λ¬Έμμ΄ λλ Symbolλ‘ λ³νλλ μ ν΅μ μΈ JavaScript κ°μ²΄μλ μ€μν μ°¨μ΄μ μ λλ€.
Mapμ μ£Όμ νΉμ§:
- λͺ¨λ ν€ νμ : ν€κ° μΌλ°μ μΌλ‘ λ¬Έμμ΄ λλ SymbolμΈ μΌλ° κ°μ²΄μ λ¬λ¦¬, Mapμ ν€λ μ΄λ€ κ°(κ°μ²΄, μμκ° λ±)λ λ μ μμ΅λλ€. μ΄λ λ 볡μ‘νκ³ λ―Έλ¬ν λ°μ΄ν° κ΄κ³λ₯Ό κ°λ₯νκ² ν©λλ€.
- μμ μ μ§ λ°λ³΅: Map μμλ μ½μ λ μμλλ‘ λ°λ³΅λ©λλ€. μ΄λ¬ν μμΈ‘ κ°λ₯μ±μ λ§μ μ ν리μΌμ΄μ μ λ§€μ° μ μ©ν©λλ€.
- Size μμ±: Mapμ μμ μλ₯Ό μ§μ λ°ννλ `size` μμ±μ κ°μ§κ³ μμΌλ©°, μ΄λ ν€λ κ°μ λ°λ³΅νμ¬ μΈλ κ²λ³΄λ€ ν¨μ¨μ μ λλ€.
- μ±λ₯: ν€-κ° μμ λΉλ²ν μΆκ° λ° μμ μ κ²½μ°, Mapμ μΌλ°μ μΌλ‘ μΌλ° κ°μ²΄λ³΄λ€ λ λμ μ±λ₯μ μ 곡νλ©°, νΉν λ§μ μμ νλͺ©μ λ€λ£° λ κ·Έλ μ΅λλ€.
μΌλ°μ μΈ Map μμ :
Mapμ λ€λ£¨λ νμμ μΈ λ©μλλ€μ μ΄ν΄λ³΄κ² μ΅λλ€.
- `new Map([iterable])`: μλ‘μ΄ Mapμ μμ±ν©λλ€. Mapμ μ΄κΈ°ννκΈ° μν΄ μ νμ μΌλ‘ ν€-κ° μμ λ°λ³΅ κ°λ₯ν κ°μ²΄λ₯Ό μ 곡ν μ μμ΅λλ€.
- `map.set(key, value)`: μ§μ λ ν€μ κ°μΌλ‘ μμλ₯Ό μΆκ°νκ±°λ μ λ°μ΄νΈν©λλ€. Map κ°μ²΄λ₯Ό λ°νν©λλ€.
- `map.get(key)`: μ§μ λ ν€μ μ°κ²°λ κ°μ λ°ννλ©°, ν€λ₯Ό μ°Ύμ μ μμΌλ©΄ `undefined`λ₯Ό λ°νν©λλ€.
- `map.has(key)`: μ§μ λ ν€λ₯Ό κ°μ§ μμκ° Mapμ μ‘΄μ¬νλμ§ μ¬λΆλ₯Ό λνλ΄λ λΆλ¦¬μΈμ λ°νν©λλ€.
- `map.delete(key)`: Mapμμ μ§μ λ ν€λ₯Ό κ°μ§ μμλ₯Ό μ κ±°ν©λλ€. μμκ° μ±κ³΅μ μΌλ‘ μ κ±°λλ©΄ `true`λ₯Ό, κ·Έλ μ§ μμΌλ©΄ `false`λ₯Ό λ°νν©λλ€.
- `map.clear()`: Mapμμ λͺ¨λ μμλ₯Ό μ κ±°ν©λλ€.
- `map.size`: Mapμ μμ μλ₯Ό λ°νν©λλ€.
MapμΌλ‘ λ°λ³΅νκΈ°:
Mapμ λ°λ³΅ κ°λ₯νλ©°, μ΄λ `for...of` 루ν λ° μ€νλ λ ꡬ문(`...`)κ³Ό κ°μ ꡬ문μ μ¬μ©νμ¬ κ·Έ λ΄μ©μ μνν μ μμμ μλ―Έν©λλ€.
- `map.keys()`: ν€μ λν λ°λ³΅μλ₯Ό λ°νν©λλ€.
- `map.values()`: κ°μ λν λ°λ³΅μλ₯Ό λ°νν©λλ€.
- `map.entries()`: ν€-κ° μ( `[key, value]` λ°°μ΄ νν)μ λν λ°λ³΅μλ₯Ό λ°νν©λλ€.
- `map.forEach((value, key, map) => {})`: κ° ν€-κ° μμ λν΄ μ 곡λ ν¨μλ₯Ό ν λ² μ€νν©λλ€.
μ€μ©μ μΈ Map μ¬μ© μ¬λ‘:
Mapμ μμ²λκ² λ€μ¬λ€λ₯ν©λλ€. λͺ κ°μ§ μλ₯Ό λ€λ©΄ λ€μκ³Ό κ°μ΅λλ€.
- μΊμ±: μμ£Ό μ‘μΈμ€νλ λ°μ΄ν°(μ: API μλ΅, κ³μ°λ κ°)λ₯Ό ν΄λΉ ν€μ ν¨κ» μ μ₯ν©λλ€.
- κ°μ²΄μ λ°μ΄ν° μ°κ²°: κ°μ²΄ μ체λ₯Ό ν€λ‘ μ¬μ©νμ¬ λ©νλ°μ΄ν° λλ μΆκ° μμ±μ ν΄λΉ κ°μ²΄μ μ°κ²°ν©λλ€.
- μ‘°ν ꡬν: IDλ₯Ό μ¬μ©μ κ°μ²΄, μ ν μΈλΆ μ 보 λλ κ΅¬μ± μ€μ μ ν¨μ¨μ μΌλ‘ λ§€νν©λλ€.
- λΉλ κ³μ°: λͺ©λ‘μμ νλͺ©μ λ°μ νμλ₯Ό κ³μ°νλ©°, μ΄λ νλͺ©μ΄ ν€μ΄κ³ ν΄λΉ κ°μκ° κ°μ λλ€.
μμ: API μλ΅ μΊμ± (κΈλ‘λ² κ΄μ )
κΈλ‘λ² μ μμκ±°λ νλ«νΌμ ꡬμΆνλ€κ³ μμν΄ λ³΄μΈμ. λ€μν μ§μ APIμμ μ ν μΈλΆ μ 보λ₯Ό κ°μ Έμ¬ μ μμ΅λλ€. μ΄λ¬ν μλ΅μ μΊμ±νλ©΄ μ±λ₯μ ν¬κ² ν₯μμν¬ μ μμ΅λλ€. Mapμ μ¬μ©νλ©΄ λ€μκ³Ό κ°μ΄ κ°λ¨ν©λλ€.
const apiCache = new Map();
async function getProductDetails(productId, region) {
const cacheKey = `${productId}-${region}`;
if (apiCache.has(cacheKey)) {
console.log(`Cache hit for ${cacheKey}`);
return apiCache.get(cacheKey);
}
console.log(`Cache miss for ${cacheKey}. Fetching from API...`);
// Simulate fetching from a regional API
const response = await fetch(`https://api.example.com/${region}/products/${productId}`);
const productData = await response.json();
// Store in cache for future use
apiCache.set(cacheKey, productData);
return productData;
}
// Example usage across different regions:
getProductDetails('XYZ789', 'us-east-1'); // Fetches and caches
getProductDetails('XYZ789', 'eu-west-2'); // Fetches and caches separately
getProductDetails('XYZ789', 'us-east-1'); // Cache hit!
2. JavaScript Set
Setμ κ³ μ ν κ°λ€μ 컬λ μ μ λλ€. μ€λ³΅μ μλμΌλ‘ μ²λ¦¬νμ¬ κ³ μ ν μμλ₯Ό μ μ₯ν μ μμ΅λλ€. Mapκ³Ό λ§μ°¬κ°μ§λ‘ Set μμλ λͺ¨λ λ°μ΄ν° νμ μ΄ λ μ μμ΅λλ€.
Setμ μ£Όμ νΉμ§:
- κ³ μ ν κ°: Setμ κ°μ₯ νΉμ§μ μΈ κΈ°λ₯μ κ³ μ ν κ°λ§ μ μ₯νλ€λ κ²μ λλ€. μ΄λ―Έ μ‘΄μ¬νλ κ°μ μΆκ°νλ €κ³ νλ©΄ 무μλ©λλ€.
- μμ μ μ§ λ°λ³΅: Set μμλ μ½μ λ μμλλ‘ λ°λ³΅λ©λλ€.
- Size μμ±: Mapκ³Ό μ μ¬νκ² Setμ μμ μλ₯Ό μ»κΈ° μν `size` μμ±μ κ°μ§κ³ μμ΅λλ€.
- μ±λ₯: μμμ μ‘΄μ¬ μ¬λΆλ₯Ό νμΈ(`has`)νκ³ μμλ₯Ό μΆκ°/μμ νλ μμ μ μΌλ°μ μΌλ‘ Setμμ λ§€μ° ν¨μ¨μ μΈ μμ μ΄λ©°, μ’ μ’ νκ· μκ° λ³΅μ‘λλ O(1)μ λλ€.
μΌλ°μ μΈ Set μμ :
- `new Set([iterable])`: μλ‘μ΄ Setμ μμ±ν©λλ€. μμλ₯Ό μ΄κΈ°ννκΈ° μν΄ μ νμ μΌλ‘ λ°λ³΅ κ°λ₯ν κ°μ²΄λ₯Ό μ 곡ν μ μμ΅λλ€.
- `set.add(value)`: Setμ μ μμλ₯Ό μΆκ°ν©λλ€. Set κ°μ²΄λ₯Ό λ°νν©λλ€.
- `set.has(value)`: μ§μ λ κ°μ κ°μ§ μμκ° Setμ μ‘΄μ¬νλμ§ μ¬λΆλ₯Ό λνλ΄λ λΆλ¦¬μΈμ λ°νν©λλ€.
- `set.delete(value)`: Setμμ μ§μ λ κ°μ κ°μ§ μμλ₯Ό μ κ±°ν©λλ€. μμκ° μ±κ³΅μ μΌλ‘ μ κ±°λλ©΄ `true`λ₯Ό, κ·Έλ μ§ μμΌλ©΄ `false`λ₯Ό λ°νν©λλ€.
- `set.clear()`: Setμμ λͺ¨λ μμλ₯Ό μ κ±°ν©λλ€.
- `set.size`: Setμ μμ μλ₯Ό λ°νν©λλ€.
SetμΌλ‘ λ°λ³΅νκΈ°:
Set λν λ°λ³΅ κ°λ₯ν©λλ€.
- `set.keys()`: κ°μ λν λ°λ³΅μλ₯Ό λ°νν©λλ€(Setμμλ ν€μ κ°μ΄ λμΌνλ―λ‘).
- `set.values()`: κ°μ λν λ°λ³΅μλ₯Ό λ°νν©λλ€.
- `set.entries()`: `[value, value]` ννμ κ°μ λν λ°λ³΅μλ₯Ό λ°νν©λλ€.
- `set.forEach((value, key, set) => {})`: κ° μμμ λν΄ μ 곡λ ν¨μλ₯Ό ν λ² μ€νν©λλ€.
μ€μ©μ μΈ Set μ¬μ© μ¬λ‘:
- μ€λ³΅ μ κ±°: λ°°μ΄μμ κ³ μ ν νλͺ© λͺ©λ‘μ λΉ λ₯΄κ³ ν¨μ¨μ μΌλ‘ μ»λ λ°©λ²μ λλ€.
- λ©€λ²μ ν μ€νΈ: 컬λ μ μ νλͺ©μ΄ μ‘΄μ¬νλμ§ λ§€μ° λΉ λ₯΄κ² νμΈν©λλ€.
- κ³ μ μ΄λ²€νΈ μΆμ : νΉμ μ΄λ²€νΈκ° ν λ²λ§ κΈ°λ‘λκ±°λ μ²λ¦¬λλλ‘ λ³΄μ₯ν©λλ€.
- Set μ°μ°: 컬λ μ μ λν ν©μ§ν©, κ΅μ§ν©, μ°¨μ§ν© μ°μ°μ μνν©λλ€.
μμ: κΈλ‘λ² μ΄λ²€νΈ λ‘κ·Έμμ κ³ μ μ¬μ©μ μ°ΎκΈ°
μ¬μ©μ νλμ μΆμ νλ κΈλ‘λ² μΉ μ ν리μΌμ΄μ μ μκ°ν΄ 보μΈμ. λ€λ₯Έ μλ²λ μλΉμ€μμ λ‘κ·Έλ₯Ό λ°μ μ μμΌλ©°, λμΌν μ¬μ©μ μμ μ λν΄ μ€λ³΅λ νλͺ©μ΄ μμ μ μμ΅λλ€. Setμ μ°Έμ¬ν λͺ¨λ κ³ μ μ¬μ©μλ₯Ό μ°Ύλ λ° μλ²½ν©λλ€.
const userActivityLogs = [
{ userId: 'user123', action: 'login', timestamp: '2023-10-27T10:00:00Z', region: 'Asia' },
{ userId: 'user456', action: 'view', timestamp: '2023-10-27T10:05:00Z', region: 'Europe' },
{ userId: 'user123', action: 'click', timestamp: '2023-10-27T10:06:00Z', region: 'Asia' },
{ userId: 'user789', action: 'login', timestamp: '2023-10-27T10:08:00Z', region: 'North America' },
{ userId: 'user456', action: 'logout', timestamp: '2023-10-27T10:10:00Z', region: 'Europe' },
{ userId: 'user123', action: 'view', timestamp: '2023-10-27T10:12:00Z', region: 'Asia' } // Duplicate user123 action
];
const uniqueUserIds = new Set();
userActivityLogs.forEach(log => {
uniqueUserIds.add(log.userId);
});
console.log('Unique User IDs:', Array.from(uniqueUserIds)); // Using Array.from to convert Set back to array for display
// Output: Unique User IDs: [ 'user123', 'user456', 'user789' ]
// Another example: Removing duplicates from a list of product IDs
const productIds = ['A101', 'B202', 'A101', 'C303', 'B202', 'D404'];
const uniqueProductIds = new Set(productIds);
console.log('Unique Product IDs:', [...uniqueProductIds]); // Using spread syntax
// Output: Unique Product IDs: [ 'A101', 'B202', 'C303', 'D404' ]
λ΄μ₯ ꡬ쑰λ§μΌλ‘λ λΆμ‘±ν λ: μ¬μ©μ μ μ λ°μ΄ν° ꡬ쑰
Mapκ³Ό Setμ κ°λ ₯νμ§λ§, λ²μ© λꡬμ λλ€. νΉμ μλ리μ€, νΉν 볡μ‘ν μκ³ λ¦¬μ¦, κ³ λλ‘ νΉνλ λ°μ΄ν° μꡬ μ¬ν λλ μ±λ₯μ΄ μ€μν μ ν리μΌμ΄μ μ κ²½μ° μμ λ§μ μ¬μ©μ μ μ λ°μ΄ν° ꡬ쑰λ₯Ό ꡬνν΄μΌ ν μ μμ΅λλ€. μ΄λ μκ³ λ¦¬μ¦κ³Ό κ³μ° 볡μ‘μ±μ λν κΉμ΄ μλ μ΄ν΄κ° νμμ μ λλ€.
μ¬μ©μ μ μ λ°μ΄ν° ꡬ쑰λ₯Ό μμ±νλ μ΄μ ?
- μ±λ₯ μ΅μ ν: νΉμ λ¬Έμ μ λ§κ² ꡬ쑰λ₯Ό μ‘°μ νλ©΄ μΌλ°μ μΈ μ루μ λ³΄λ€ μλΉν μ±λ₯ ν₯μμ κ°μ Έμ¬ μ μμ΅λλ€. μλ₯Ό λ€μ΄, νΉμ νΈλ¦¬ ꡬ쑰λ Mapλ³΄λ€ νΉμ κ²μ 쿼리μ λ λΉ λ₯Ό μ μμ΅λλ€.
- λ©λͺ¨λ¦¬ ν¨μ¨μ±: μ¬μ©μ μ μ ꡬ쑰λ λ©λͺ¨λ¦¬λ₯Ό λ μ ννκ² μ¬μ©νλλ‘ μ€κ³λ μ μμΌλ©°, λ²μ© ꡬ쑰μ κ΄λ ¨λ μ€λ²ν€λλ₯Ό νΌν μ μμ΅λλ€.
- νΉμ κΈ°λ₯: λ΄μ₯ κ΅¬μ‘°κ° μ§μνμ§ μλ κ³ μ ν λμ λλ μ μ½ μ‘°κ±΄ ꡬν (μ: νΉμ μ λ ¬ κ·μΉμ κ°μ§ μ°μ μμ ν, λ°©ν₯μ± κ°μ μ΄ μλ κ·Έλν).
- κ΅μ‘ λͺ©μ : μ€ν, ν, μ°κ²° 리μ€νΈ, νΈλ¦¬μ κ°μ κΈ°λ³Έμ μΈ λ°μ΄ν° κ΅¬μ‘°κ° μ΄λ»κ² μλνλμ§ μ²μλΆν° ꡬννμ¬ μ΄ν΄ν©λλ€.
- μκ³ λ¦¬μ¦ κ΅¬ν: λ§μ κ³ κΈ μκ³ λ¦¬μ¦μ νΉμ λ°μ΄ν° ꡬ쑰μ λ³Έμ§μ μΌλ‘ μ°κ²°λμ΄ μμ΅λλ€ (μ: λ€μ΅μ€νΈλΌ μκ³ λ¦¬μ¦μ μ’ μ’ μ΅μ μ°μ μμ νλ₯Ό μ¬μ©ν©λλ€).
JavaScriptμμ ꡬνν μΌλ°μ μΈ μ¬μ©μ μ μ λ°μ΄ν° ꡬ쑰:
1. μ°κ²° 리μ€νΈ
μ°κ²° 리μ€νΈλ μμλ€μ΄ μ°μμ μΈ λ©λͺ¨λ¦¬ μμΉμ μ μ₯λμ§ μλ μ ν λ°μ΄ν° ꡬ쑰μ λλ€. λμ κ° μμ(λ Έλ)λ λ°μ΄ν°μ μνμ€μμ λ€μ λ Έλμ λν μ°Έμ‘°(λλ λ§ν¬)λ₯Ό ν¬ν¨ν©λλ€.
- μ ν: λ¨μΌ μ°κ²° 리μ€νΈ, μ΄μ€ μ°κ²° 리μ€νΈ, μν μ°κ²° 리μ€νΈ.
- μ¬μ© μ¬λ‘: μ€ν λ° ν ꡬν, λμ λ©λͺ¨λ¦¬ κ΄λ¦¬, μ€ν μ·¨μ/λ€μ μ€ν κΈ°λ₯.
- 볡μ‘λ: μμ/λμμμ μ½μ /μμ λ O(1)μΌ μ μμ§λ§, κ²μμ O(n)μ λλ€.
ꡬν μ€μΌμΉ: λ¨μΌ μ°κ²° 리μ€νΈ
JavaScriptμμ νν μ¬μ©λλ κ°λ¨ν ν΄λμ€ κΈ°λ° μ κ·Ό λ°©μμ μ¬μ©νκ² μ΅λλ€.
class Node {
constructor(data) {
this.data = data;
this.next = null;
}
}
class LinkedList {
constructor() {
this.head = null;
this.size = 0;
}
// Add node to the end
add(data) {
const newNode = new Node(data);
if (!this.head) {
this.head = newNode;
} else {
let current = this.head;
while (current.next) {
current = current.next;
}
current.next = newNode;
}
this.size++;
}
// Remove node by value
remove(data) {
if (!this.head) return false;
if (this.head.data === data) {
this.head = this.head.next;
this.size--;
return true;
}
let current = this.head;
while (current.next) {
if (current.next.data === data) {
current.next = current.next.next;
this.size--;
return true;
}
current = current.next;
}
return false;
}
// Find node by value
find(data) {
let current = this.head;
while (current) {
if (current.data === data) {
return current;
}
current = current.next;
}
return null;
}
// Print list
print() {
let current = this.head;
let list = '';
while (current) {
list += current.data + ' -> ';
current = current.next;
}
console.log(list + 'null');
}
}
// Usage:
const myList = new LinkedList();
myList.add('Apple');
myList.add('Banana');
myList.add('Cherry');
myList.print(); // Apple -> Banana -> Cherry -> null
myList.remove('Banana');
myList.print(); // Apple -> Cherry -> null
console.log(myList.find('Apple')); // Node { data: 'Apple', next: Node { data: 'Cherry', next: null } }
console.log('Size:', myList.size); // Size: 2
2. μ€ν
μ€νμ νμ μ μΆ(LIFO) μμΉμ λ°λ₯΄λ μ ν λ°μ΄ν° ꡬ쑰μ λλ€. μ μ λλ―Έλ₯Ό μκ°ν΄ 보μΈμ. μ μ μλ₯Ό 맨 μμ μΆκ°νκ³ , μ μλ₯Ό 맨 μμμ μ κ±°ν©λλ€.
- μμ : `push` (맨 μμ μΆκ°), `pop` (맨 μμμ μ κ±°), `peek` (맨 μ μμ 보기), `isEmpty`.
- μ¬μ© μ¬λ‘: ν¨μ νΈμΆ μ€ν, ννμ νκ°, λ°±νΈλνΉ μκ³ λ¦¬μ¦.
- 볡μ‘λ: λͺ¨λ μ£Όμ μμ μ μΌλ°μ μΌλ‘ O(1)μ λλ€.
ꡬν μ€μΌμΉ: λ°°μ΄μ μ¬μ©ν μ€ν
JavaScript λ°°μ΄μ μ€νμ μ½κ² λͺ¨λ°©ν μ μμ΅λλ€.
class Stack {
constructor() {
this.items = [];
}
// Add element to the top
push(element) {
this.items.push(element);
}
// Remove and return the top element
pop() {
if (this.isEmpty()) {
return "Underflow"; // Or throw an error
}
return this.items.pop();
}
// View the top element without removing
peek() {
if (this.isEmpty()) {
return "No elements in Stack";
}
return this.items[this.items.length - 1];
}
// Check if stack is empty
isEmpty() {
return this.items.length === 0;
}
// Get size
size() {
return this.items.length;
}
// Print stack (top to bottom)
print() {
let str = "";
for (let i = this.items.length - 1; i >= 0; i--) {
str += this.items[i] + " ";
}
console.log(str.trim());
}
}
// Usage:
const myStack = new Stack();
myStack.push(10);
myStack.push(20);
myStack.push(30);
myStack.print(); // 30 20 10
console.log('Peek:', myStack.peek()); // Peek: 30
console.log('Pop:', myStack.pop()); // Pop: 30
myStack.print(); // 20 10
console.log('Is Empty:', myStack.isEmpty()); // Is Empty: false
3. ν
νλ μ μ μ μΆ(FIFO) μμΉμ λ°λ₯΄λ μ ν λ°μ΄ν° ꡬ쑰μ λλ€. λ§€νμμ μ€ μ μλ μ¬λλ€μ μμν΄ λ³΄μΈμ. μ€μ 첫 λ²μ§Έ μ¬λμ΄ λ¨Όμ μλΉμ€λ°μ΅λλ€.
- μμ : `enqueue` (λ€μ μΆκ°), `dequeue` (μμμ μ κ±°), `front` (μ μμ 보기), `isEmpty`.
- μ¬μ© μ¬λ‘: μμ μ€μΌμ€λ§, μμ² κ΄λ¦¬(μ: μΈμ ν, μΉ μλ² μμ² ν), κ·Έλνμ λλΉ μ°μ νμ(BFS).
- 볡μ‘λ: νμ€ λ°°μ΄μ κ²½μ° `dequeue`λ μ¬μΈλ±μ±μΌλ‘ μΈν΄ O(n)μ΄ λ μ μμ΅λλ€. λ μ΅μ νλ ꡬν(μ: μ°κ²° 리μ€νΈ λλ λ κ°μ μ€ν μ¬μ©)μ O(1)μ λ¬μ±ν©λλ€.
ꡬν μ€μΌμΉ: λ°°μ΄μ μ¬μ©ν ν (μ±λ₯ κ³ λ €)
λ°°μ΄μ `shift()`λ O(n) μμ μ΄μ§λ§, κΈ°λ³Έμ μΈ μμμλ κ°μ₯ κ°λ¨ν λ°©λ²μ λλ€. νλ‘λμ νκ²½μμλ μ°κ²° 리μ€νΈ λλ λ κ³ κΈ λ°°μ΄ κΈ°λ° νλ₯Ό κ³ λ €νμΈμ.
class Queue {
constructor() {
this.items = [];
}
// Add element to the rear
enqueue(element) {
this.items.push(element);
}
// Remove and return the front element
dequeue() {
if (this.isEmpty()) {
return "Underflow";
}
return this.items.shift(); // O(n) operation in standard arrays
}
// View the front element without removing
front() {
if (this.isEmpty()) {
return "No elements in Queue";
}
return this.items[0];
}
// Check if queue is empty
isEmpty() {
return this.items.length === 0;
}
// Get size
size() {
return this.items.length;
}
// Print queue (front to rear)
print() {
let str = "";
for (let i = 0; i < this.items.length; i++) {
str += this.items[i] + " ";
}
console.log(str.trim());
}
}
// Usage:
const myQueue = new Queue();
myQueue.enqueue('A');
myQueue.enqueue('B');
myQueue.enqueue('C');
myQueue.print(); // A B C
console.log('Front:', myQueue.front()); // Front: A
console.log('Dequeue:', myQueue.dequeue()); // Dequeue: A
myQueue.print(); // B C
console.log('Is Empty:', myQueue.isEmpty()); // Is Empty: false
4. νΈλ¦¬ (μ΄μ§ νμ νΈλ¦¬ - BST)
νΈλ¦¬λ κ³μΈ΅μ λ°μ΄ν° ꡬ쑰μ λλ€. μ΄μ§ νμ νΈλ¦¬(BST)λ κ° λ Έλκ° μ΅λ λ κ°μ μμ(μΌμͺ½ μμκ³Ό μ€λ₯Έμͺ½ μμ)μ κ°μ§λ νΈλ¦¬ μ νμ λλ€. μ£Όμ΄μ§ λ Έλμ λν΄ μΌμͺ½ μλΈνΈλ¦¬μ λͺ¨λ κ°μ λ Έλμ κ°λ³΄λ€ μκ³ , μ€λ₯Έμͺ½ μλΈνΈλ¦¬μ λͺ¨λ κ°μ λ Έλμ κ°λ³΄λ€ ν½λλ€.
- μμ : μ½μ , μμ , κ²μ, μν(μ€μ, μ μ, νμ).
- μ¬μ© μ¬λ‘: ν¨μ¨μ μΈ κ²μ λ° μ λ ¬(κ· ν νΈλ¦¬μμλ μ’ μ’ O(n)λ³΄λ€ μ’μ), μ¬λ³Ό ν μ΄λΈ ꡬν, λ°μ΄ν°λ² μ΄μ€ μΈλ±μ±.
- 볡μ‘λ: κ· ν μ‘ν BSTμ κ²½μ° κ²μ, μ½μ , μμ λ O(log n)μ λλ€. κΈ°μΈμ΄μ§ νΈλ¦¬μ κ²½μ° O(n)μΌλ‘ μ νλ μ μμ΅λλ€.
ꡬν μ€μΌμΉ: μ΄μ§ νμ νΈλ¦¬
μ΄ κ΅¬νμ κΈ°λ³Έμ μΈ μ½μ κ³Ό κ²μμ μ€μ μ λ‘λλ€.
class TreeNode {
constructor(value) {
this.value = value;
this.left = null;
this.right = null;
}
}
class BinarySearchTree {
constructor() {
this.root = null;
}
// Insert a value into the BST
insert(value) {
const newNode = new TreeNode(value);
if (!this.root) {
this.root = newNode;
return this;
}
let current = this.root;
while (true) {
if (value === current.value) return undefined; // Or handle duplicates as needed
if (value < current.value) {
if (!current.left) {
current.left = newNode;
return this;
}
current = current.left;
} else {
if (!current.right) {
current.right = newNode;
return this;
}
current = current.right;
}
}
}
// Search for a value in the BST
search(value) {
if (!this.root) return null;
let current = this.root;
while (current) {
if (value === current.value) return current;
if (value < current.value) {
current = current.left;
} else {
current = current.right;
}
}
return null; // Not found
}
// In-order traversal (returns sorted list)
inOrderTraversal(node = this.root, result = []) {
if (node) {
this.inOrderTraversal(node.left, result);
result.push(node.value);
this.inOrderTraversal(node.right, result);
}
return result;
}
}
// Usage:
const bst = new BinarySearchTree();
bst.insert(10);
bst.insert(5);
bst.insert(15);
bst.insert(2);
bst.insert(7);
bst.insert(12);
bst.insert(18);
console.log('In-order traversal:', bst.inOrderTraversal()); // [ 2, 5, 7, 10, 12, 15, 18 ]
console.log('Search for 7:', bst.search(7)); // TreeNode { value: 7, left: null, right: null }
console.log('Search for 100:', bst.search(100)); // null
5. κ·Έλν
κ·Έλνλ κ°μ²΄(μ μ λλ λ Έλ)μ μ§ν©μ λνλ΄λ λ€μ©λ λ°μ΄ν° ꡬ쑰λ‘, κ° μ μ μμ κ΄κ³(κ°μ )λ‘ μ°κ²°λ μ μμ΅λλ€. λ€νΈμν¬λ₯Ό λͺ¨λΈλ§νλ λ° μ¬μ©λ©λλ€.
- μ ν: λ°©ν₯μ± λ 무방ν₯μ±, κ°μ€μΉ λ λΉκ°μ€μΉ.
- νν: μΈμ 리μ€νΈ (JSμμ κ°μ₯ νν¨), μΈμ νλ ¬.
- μμ : μ μ /κ°μ μΆκ°/μ κ±°, μν(DFS, BFS), μ΅λ¨ κ²½λ‘ μ°ΎκΈ°.
- μ¬μ© μ¬λ‘: μμ λ€νΈμν¬, μ§λ/λ΄λΉκ²μ΄μ μμ€ν , μΆμ² μμ§, λ€νΈμν¬ ν ν΄λ‘μ§.
- 볡μ‘λ: νν λ° μμ μ λ°λΌ ν¬κ² λ€λ¦ λλ€.
ꡬν μ€μΌμΉ: μΈμ 리μ€νΈλ₯Ό μ¬μ©ν κ·Έλν
μΈμ 리μ€νΈλ ν€κ° μ μ μ΄κ³ κ°μ΄ μΈμ μ μ λ€μ λ°°μ΄μΈ Map(λλ μΌλ° κ°μ²΄)μ μ¬μ©ν©λλ€.
class Graph {
constructor() {
this.adjacencyList = new Map(); // Using Map for better key handling
}
// Add a vertex
addVertex(vertex) {
if (!this.adjacencyList.has(vertex)) {
this.adjacencyList.set(vertex, []);
}
}
// Add an edge (for undirected graph)
addEdge(vertex1, vertex2) {
if (!this.adjacencyList.has(vertex1) || !this.adjacencyList.has(vertex2)) {
throw new Error("One or both vertices do not exist.");
}
this.adjacencyList.get(vertex1).push(vertex2);
this.adjacencyList.get(vertex2).push(vertex1); // For undirected graph
}
// Remove an edge
removeEdge(vertex1, vertex2) {
if (!this.adjacencyList.has(vertex1) || !this.adjacencyList.has(vertex2)) {
return false;
}
this.adjacencyList.set(vertex1, this.adjacencyList.get(vertex1).filter(v => v !== vertex2));
this.adjacencyList.set(vertex2, this.adjacencyList.get(vertex2).filter(v => v !== vertex1));
return true;
}
// Remove a vertex and all its edges
removeVertex(vertex) {
if (!this.adjacencyList.has(vertex)) {
return false;
}
while (this.adjacencyList.get(vertex).length) {
const adjacentVertex = this.adjacencyList.get(vertex).pop();
this.removeEdge(vertex, adjacentVertex);
}
this.adjacencyList.delete(vertex);
return true;
}
// Basic Depth First Search (DFS) traversal
dfs(startVertex, visited = new Set(), result = []) {
if (!this.adjacencyList.has(startVertex)) return null;
visited.add(startVertex);
result.push(startVertex);
this.adjacencyList.get(startVertex).forEach(neighbor => {
if (!visited.has(neighbor)) {
this.dfs(neighbor, visited, result);
}
});
return result;
}
}
// Usage (e.g., representing flight routes between global cities):
const flightNetwork = new Graph();
flightNetwork.addVertex('New York');
flightNetwork.addVertex('London');
flightNetwork.addVertex('Tokyo');
flightNetwork.addVertex('Sydney');
flightNetwork.addVertex('Rio de Janeiro');
flightNetwork.addEdge('New York', 'London');
flightNetwork.addEdge('New York', 'Tokyo');
flightNetwork.addEdge('London', 'Tokyo');
flightNetwork.addEdge('London', 'Rio de Janeiro');
flightNetwork.addEdge('Tokyo', 'Sydney');
console.log('Flight Network DFS from New York:', flightNetwork.dfs('New York'));
// Example Output: [ 'New York', 'London', 'Tokyo', 'Sydney', 'Rio de Janeiro' ] (order may vary based on Set iteration)
// flightNetwork.removeEdge('New York', 'London');
// flightNetwork.removeVertex('Tokyo');
μ¬λ°λ₯Έ μ κ·Ό λ°©μ μ ννκΈ°
λ΄μ₯ Map/Setμ μ¬μ©ν μ§ λλ μ¬μ©μ μ μ ꡬ쑰λ₯Ό ꡬνν μ§ κ²°μ ν λ λ€μμ κ³ λ €νμΈμ.
- λ¬Έμ 볡μ‘λ: κ°λ¨ν 컬λ μ λ° μ‘°νμλ Mapκ³Ό Setμ΄ μΌλ°μ μΌλ‘ μΆ©λΆνλ©°, λ€μ΄ν°λΈ μ΅μ ν λλΆμ μ’ μ’ λ μ±λ₯μ΄ μ’μ΅λλ€.
- μ±λ₯ μꡬμ¬ν: μ ν리μΌμ΄μ μ΄ νΉμ μμ (μ: μμ μκ° μ½μ λ° μμ , λ‘κ·Έ κ²μ)μ κ·Ήλμ μ±λ₯μ μꡬνλ κ²½μ° μ¬μ©μ μ μ κ΅¬μ‘°κ° νμν μ μμ΅λλ€.
- νμ΅ κ³‘μ : μ¬μ©μ μ μ ꡬ쑰λ₯Ό ꡬννλ €λ©΄ μκ³ λ¦¬μ¦ λ° λ°μ΄ν° ꡬ쑰 μ리μ λν κ²¬κ³ ν μ΄ν΄κ° νμν©λλ€. λλΆλΆμ μΌλ°μ μΈ μμ μλ λ΄μ₯ κΈ°λ₯μ νμ©νλ κ²μ΄ λ μμ°μ μ λλ€.
- μ μ§λ³΄μμ±: μ λ¬Έμνλκ³ ν μ€νΈλ μ¬μ©μ μ μ ꡬ쑰λ μ μ§λ³΄μ κ°λ₯νμ§λ§, 볡μ‘ν ꡬ쑰λ μλΉν μ μ§λ³΄μ μ€λ²ν€λλ₯Ό μ λ°ν μ μμ΅λλ€.
κΈλ‘λ² κ°λ° κ³ λ € μ¬ν
κΈλ‘λ² λ¬΄λμμ μΌνλ κ°λ°μλ‘μ λ°μ΄ν° ꡬ쑰μ κ΄λ ¨λ λͺ κ°μ§ μμλ₯Ό μ£Όλͺ©ν κ°μΉκ° μμ΅λλ€.
- νμ₯μ±: λ°μ΄ν° λ³Όλ₯¨μ΄ κΈ°νκΈμμ μΌλ‘ μ¦κ°ν¨μ λ°λΌ μ νν λ°μ΄ν° κ΅¬μ‘°κ° μ΄λ»κ² μλν κΉμ? μ΄λ μ μΈκ³ μλ°±λ§ λͺ μ μ¬μ©μμκ² μλΉμ€λ₯Ό μ 곡νλ μ ν리μΌμ΄μ μ λ§€μ° μ€μν©λλ€. Map λ° Setκ³Ό κ°μ λ΄μ₯ ꡬ쑰λ μΌλ°μ μΌλ‘ νμ₯μ±μ μν΄ μ μ΅μ νλμ΄ μμ§λ§, μ¬μ©μ μ μ ꡬ쑰λ μ΄λ₯Ό μΌλμ λκ³ μ€κ³λμ΄μΌ ν©λλ€.
- κ΅μ ν(i18n) λ° νμ§ν(l10n): λ°μ΄ν°λ λ€μν μΈμ΄ λ° λ¬Ένμ λ°°κ²½μμ μ¬ μ μμ΅λλ€. λ°μ΄ν° κ΅¬μ‘°κ° λ€λ₯Έ λ¬Έμ μΈνΈ, μ λ ¬ κ·μΉ λ° λ°μ΄ν° νμμ μ΄λ»κ² μ²λ¦¬νλμ§ κ³ λ €νμμμ€. μλ₯Ό λ€μ΄, μ¬μ©μ μ΄λ¦μ μ μ₯ν λ κ°μ²΄λ₯Ό ν€λ‘ μ¬μ©νλ Mapμ΄ κ°λ¨ν λ¬Έμμ΄ ν€λ³΄λ€ λ κ°λ ₯ν μ μμ΅λλ€.
- μκ°λ λ° λ μ§/μκ° μ²λ¦¬: λ€λ₯Έ μκ°λμ κ±Έμ³ μκ° λ―Όκ°ν λ°μ΄ν°λ₯Ό μ μ₯νκ³ μΏΌλ¦¬νλ €λ©΄ μ μ€ν κ³ λ €κ° νμν©λλ€. μλ°ν λ§ν΄ λ°μ΄ν° ꡬ쑰 λ¬Έμ λ μλμ§λ§, λ μ§ κ°μ²΄μ ν¨μ¨μ μΈ κ²μ λ° μ‘°μμ μ’ μ’ μ μ₯ λ°©μ(μ: νμμ€ν¬ν λλ UTC κ°μΌλ‘ μΈλ±μ±λ Map)μ λ°λΌ λ¬λΌμ§λλ€.
- μ§μλ³ μ±λ₯: λ€νΈμν¬ μ§μ° μκ°κ³Ό μλ² μμΉλ μΈμ§λλ μ±λ₯μ μν₯μ λ―ΈμΉ μ μμ΅λλ€. μλ²(μ μ ν ꡬ쑰 μ¬μ©) λ° ν΄λΌμ΄μΈνΈ μΈ‘μμμ ν¨μ¨μ μΈ λ°μ΄ν° κ²μ λ° μ²λ¦¬λ μ΄λ¬ν λ¬Έμ λ₯Ό μνν μ μμ΅λλ€.
- ν νμ : λ€μνκ³ λΆμ°λ νμμ μμ ν λ, μ¬μ©λλ λ°μ΄ν° ꡬ쑰μ λν λͺ νν λ¬Έμνμ 곡μ λ μ΄ν΄λ λ§€μ° μ€μν©λλ€. Map λ° Setκ³Ό κ°μ νμ€ κ΅¬μ‘°λ₯Ό ꡬννλ©΄ μ¨λ³΄λ© λ° νμ μ΄ μ©μ΄ν΄μ§λλ€.
κ²°λ‘
JavaScriptμ Mapκ³Ό Setμ λ§μ μΌλ°μ μΈ λ°μ΄ν° κ΄λ¦¬ μμ μ κ°λ ₯νκ³ ν¨μ¨μ μ΄λ©° μ°μν μ루μ μ μ 곡ν©λλ€. μ΄λ€μ κΈ°μ‘΄ λ°©λ²λ³΄λ€ ν₯μλ κΈ°λ₯μ μ 곡νλ©° λͺ¨λ νλ JavaScript κ°λ°μμκ² νμμ μΈ λꡬμ λλ€.
κ·Έλ¬λ λ°μ΄ν° ꡬ쑰μ μΈκ³λ μ΄λ¬ν λ΄μ₯ μ νμ ν¨μ¬ λμ΄μλλ€. 볡μ‘ν λ¬Έμ , μ±λ₯ λ³λͺ© νμ λλ νΉμ μꡬ μ¬νμ κ²½μ° μ°κ²° 리μ€νΈ, μ€ν, ν, νΈλ¦¬, κ·Έλνμ κ°μ μ¬μ©μ μ μ λ°μ΄ν° ꡬ쑰λ₯Ό ꡬννλ κ²μ 보λ μκ³ μ’ μ’ νμν λ Έλ ₯μ λλ€. μ΄λ κ³μ° ν¨μ¨μ±κ³Ό λ¬Έμ ν΄κ²°μ λν μ΄ν΄λ₯Ό μ¬νμν΅λλ€.
κΈλ‘λ² κ°λ°μλ‘μ μ΄λ¬ν λꡬλ₯Ό μμ©νκ³ νμ₯μ±, μ±λ₯ λ° κ΅μ νμ λν κ·Έ ν¨μλ₯Ό μ΄ν΄νλ κ²μ μΈκ³ 무λμμ μ±κ³΅ν μ μλ μ κ΅νκ³ κ°λ ₯νλ©° κ³ μ±λ₯ μ ν리μΌμ΄μ μ ꡬμΆν μ μλλ‘ μλμ κ°νν κ²μ λλ€. κ³μ νꡬνκ³ , κ³μ ꡬννλ©°, κ³μ μ΅μ ννμΈμ!