TIL - 21.07.01 πŸ‘¨β€πŸ’» - JS

μ„±ν›ˆΒ·2021λ…„ 7μ›” 1일
0

TIL

λͺ©λ‘ 보기
17/59
post-thumbnail

TIL - 21.07.01 πŸ‘¨β€πŸ’»

μ›μ‹œ μžλ£Œν˜• vs μ°Έμ‘° μžλ£Œν˜•


μ›μ‹œ μžλ£Œν˜• ( Primitive type data )

μ›μ‹œ μžλ£Œν˜•μ€ λ¬Έμžμ—΄, μˆ«μžμ—΄, λΆˆλ¦¬μ–Ένƒ€μž…, null, undefined 와 λ³€μˆ˜ μ„ μ–ΈμœΌλ‘œ μ΄λ¦„ν‘œ 뢙인 μŠ€νƒμ— 데이터λ₯Ό μ €μž₯ν•˜κ³  λ³€μˆ˜ 호좜둜 μŠ€νƒμ— μ €μž₯λ˜μ–΄ μžˆλŠ” 데이터λ₯Ό λΆˆλŸ¬μ˜€λŠ” μžλ£Œν˜•λ“€μ„ λ§ν•œλ‹€.
μŠ€νƒμ— 데이터λ₯Ό 직접 μ €μž₯ν•˜κΈ°μ— ν•œ μŠ€νƒλ‹Ή 즉 ν•œ λ³€μˆ˜λ‹Ή ν•˜λ‚˜μ˜ λ°μ΄ν„°λ§Œ μ €μž₯ κ°€λŠ₯ν•˜λ‹€.


μ°Έμ‘° μžλ£Œν˜• ( Reference type data )

μŠ€νƒμ΄ μ•„λ‹Œ Heapμ΄λΌλŠ” 별도 곡간에 데이터λ₯Ό μ €μž₯ν•˜κ³  λ³€μˆ˜ μ„ μ–ΈμœΌλ‘œ 이름 λΆ™νžŒ μŠ€νƒμ—λŠ” ν•΄λ‹Ή λ°μ΄ν„°μ˜ μ£Όμ†Œλ§Œ μ €μž₯λœλ‹€.
λ³€μˆ˜λ₯Ό ν˜ΈμΆœν•΄ μŠ€νƒμ—μ„œ λ°›μ•„μ˜€λŠ” 것이 데이터가 μ•„λ‹Œ Heap에 μžˆλŠ” λ°μ΄ν„°μ˜ μ£Όμ†Œμ΄κΈ° λ•Œλ¬Έμ— μ°Έμ‘°ν•œλ‹€κ³  ν•΄μ„œ μ°Έμ‘° μžλ£Œν˜•μ΄λ‹€.
μ°Έμ‘° μžλ£Œν˜•μ—λŠ” λ°°μ—΄κ³Ό 객체가 μžˆλ‹€.


두 μžλ£Œν˜•μ˜ 차이

이 두 μžλ£Œν˜•μ˜ κ°€μž₯ 큰 차이가 μ›μ‹œ μžλ£Œν˜•μ˜ 경우 μ„ μ–Έλ˜κ³  값이 ν• λ‹Ήλ˜μ–΄ μžˆλŠ” λ³€μˆ˜(x)λ₯Ό λ‹€λ₯Έ λ³€μˆ˜(y)에 ν• λ‹Ήν•˜λ©΄ ν•΄λ‹Ή μŠ€νƒμ˜ 데이터가 λ³΅μ œλ˜μ–΄ μƒˆλ‘œμš΄ λ³€μˆ˜(y)의 μŠ€νƒμ— ν• λ‹Ήλœλ‹€.
그렇기에 ν• λ‹Ήν•˜κ³  λ‚˜μ„œλŠ” μƒˆλ‘œμš΄ λ³€μˆ˜(y)λ₯Ό μˆ˜μ •ν•œλ‹€κ³  해도 κΈ°μ‘΄ λ³€μˆ˜(x)μ—λŠ” 영ν–₯이 μ „ν˜€ μ—†λ‹€.
κΈ°μ‘΄ μŠ€νƒμ€ κ·ΈλŒ€λ‘œ 두고 μƒˆλ‘œ λ³΅μ œν•œ μŠ€νƒμ— μžˆλŠ” 데이터λ₯Ό 지지고 λ³ΆλŠ” 것이기 λ•Œλ¬Έμ΄λ‹€.

let x = 10;
let y = x;

if(true){
  y++
};

console.log(x) // 10;
console.log(y) // 11; λ³΅μ œν•œ y의 값이 변해도 x의 값은 λ³€ν•˜μ§€ μ•ŠλŠ”λ‹€.

그런데 μ°Έμ‘° μžλ£Œν˜• 같은 κ²½μš°λŠ” 데이터 자체λ₯Ό λ³΅μ œν•˜λŠ” 것이 μ•„λ‹Œ λ°μ΄ν„°μ˜ μ£Όμ†Œλ§Œ λ³΅μ œν•˜κΈ° λ•Œλ¬Έμ— μƒˆλ‘œμš΄ λ³€μˆ˜(y)λ₯Ό μˆ˜μ •ν•˜λ©΄ κΈ°μ‘΄ λ³€μˆ˜(x)의 좜λ ₯ 값에도 μˆ˜μ •μ΄ λ°˜μ˜λœλ‹€. ( μ• μ΄ˆμ— 같은 값을 가지고 좜λ ₯ν•˜λŠ” κ²ƒμ΄λ‹ˆ )

let x = {
  name: 'sunghoon',
};
let y = x;

if(1){
 y.name = 'planet'; 
}

console.log(x) // { name : 'planet' }; y값이 λ°”λ€Œλ‹ˆ x값도 λ°”λ€Œμ—ˆλ‹€.
console.log(y) // { name : 'planet' };

Scope

μŠ€μ½”ν”„μ˜ λ²”μœ„λŠ” μ€‘κ΄„ν˜Έ(블둝) λ˜λŠ” ν•¨μˆ˜μ— μ˜ν•΄ λ‚˜λ‰˜κ³  λ°”κΉ₯μͺ½ μŠ€μ½”ν”„μ—μ„œ μ„ μ–Έν•œ λ³€μˆ˜λŠ” μ•ˆμͺ½ μŠ€μ½”ν”„μ—μ„œ ν™œμš©κ°€λŠ₯ν•˜λ‚˜ μ•ˆμͺ½ μŠ€μ½”ν”„μ—μ„œ μ„ μ–Έν•œ λ³€μˆ˜λŠ” λ°”κΉ₯μͺ½ μŠ€μ½”ν”„μ—μ„œ ν˜ΈμΆœν•  수 μ—†λ‹€. ( varλŠ” μ˜ˆμ™Έ κ²½μš°κ°€ 있음. )

λ°”κΉ₯μͺ½κ³Ό μ•ˆμͺ½μ„ μ΄μ•ΌκΈ°ν• λ•Œ λˆˆμΉ˜μ±˜κ² μ§€λ§Œ, μŠ€μ½”ν”„λŠ” 쀑첩이 κ°€λŠ₯ν•˜λ‹€.
κ°€μž₯ μ™Έκ°μ˜ μŠ€μ½”ν”„λ₯Ό μ „μ—­ μŠ€μ½”ν”„(Global scope)라고 ν•˜κ³  μƒμœ„ μŠ€μ½”ν”„κ°€ μ‘΄μž¬ν•˜λŠ” λͺ¨λ“  μŠ€μ½”ν”„λ“€μ„ 지역 μŠ€μ½”ν”„(Local scope)라고 ν•œλ‹€.

μ „μ—­ μŠ€μ½”ν”„λŠ” μ½”λ“œ μ–΄λ””μ„œλ“  μ°Έκ³ κ°€ κ°€λŠ₯ν•˜λ‚˜ 지역 μŠ€μ½”ν”„κ°™μ€ κ²½μš°λŠ” ν•¨μˆ˜λΈ”λ‘ μžμ²΄λ‚˜ κ·Έ ν•˜μœ„μ˜ μ½”λ“œ λΈ”λ‘μ—μ„œλ§Œ μ°Έμ‘°κ°€λŠ₯ν•˜λ‹€.

이와 같은 νŠΉμ§• 덕에 전역에 μ„ μ–Έλ˜μ–΄ μžˆλŠ” λ³€μˆ˜λ₯Ό μ§€μ—­μ—μ„œ λ‹€μ‹œ μ„ μ–Έν•˜κ³  μ‚¬μš© ν•  수 μžˆλŠ”λ° 이 같은 νŠΉμ§•μ„ μ‰λ„μž‰(Variable Shadowing)이라고 ν•œλ‹€.

같은 λ³€μˆ˜λ₯Ό μ—¬λŸ¬λ²ˆ μ„ μ–Έ ν• μˆ˜μžˆλŠ” 만큼 λ³€μˆ˜ λͺ…이 겹치면 μ€‘μ²©λœ μŠ€μ½”ν”„μ—μ„œλŠ” μ–΄λŠ λ³€μˆ˜κ°€ μ°Έμ‘°λ˜λŠ”μ§€ ν—·κ°ˆλ¦΄ 수 μžˆλŠ”λ°, 지역 μŠ€μ½”ν”„ 같은 κ²½μš°λŠ” μ „μ—­ μŠ€μ½”ν”„ 보닀 μš°μ„ μˆœμœ„κ°€ λ†’μœΌλ©° 쀑첩 μŠ€μ½”ν”„κ°™μ€ κ²½μš°μ—λŠ” μΈμ ‘ν•œ 블둝을 μš°μ„ ν•΄μ„œ μ°Έμ‘°ν•œλ‹€.

let x = 10;

function func(){
  let x = 20;
  function func1(x) {
    x = x + 10;       // μ—¬κΈ°μ„œ 전역에 μ„ μ–Έλœ xλ₯Ό μ°Έμ‘°ν•˜λŠ”κ²Œ μ•„λ‹Œ λ°”λ‘œ μƒμœ„ 블둝에 μ„ μ–Έν•œ x = 20을 μ°Έμ‘°ν•œλ‹€.
  }  
  return func1()
}

console.log(x) // 10; ν•¨μˆ˜ μ•ˆμ—μ„œ 지지고 λ³Άλ“  말든 μ§€μ—­μ—μ„œ μ„ μ–Έλœ λ³€μˆ˜λŠ” 지역 λ°–μœΌλ‘œ λ‚˜μ˜€μ§€ λͺ»ν•œλ‹€.

scope의 μ’…λ₯˜μ™€ var, let, const

μŠ€μ½”ν”„λŠ” μ€‘κ΄„ν˜Έλ‘œ λ‚˜λˆ„λŠ” 블둝 μŠ€μ½”ν”„μ™€ ν•¨μˆ˜λ‘œ λ‘˜λŸ¬μ‹Ό λ²”μœ„μΈ ν•¨μˆ˜ μŠ€μ½”ν”„κ°€ μžˆλ‹€.
ν™”μ‚΄ν‘œ ν•¨μˆ˜λŠ” μ• λ§€ν•œ 면이 μžˆμœΌλ‹ˆ 블둝 μŠ€μ½”ν”„μ™€ ν•¨μˆ˜ μŠ€μ½”ν”„ 사이 κ·Έ μ–΄λ”˜κ°€μ— μžˆλ‹€κ³  치자.

블둝 μŠ€μ½”ν”„μ—μ„œ μ„ μ–Έν•œ λ³€μˆ˜λŠ” 블둝을 λ²—μ–΄λ‚˜λŠ” μˆœκ°„ μ‚¬μš©ν•  수 μ—†λ‹€.
단 μ•„κΉŒλΆ€ν„° μ–ΈκΈ‰ 쀑인 이 var둜 μ„ μ–Έν•œ λ³€μˆ˜λŠ” ν•¨μˆ˜ μŠ€μ½”ν”„λ§Œ λ”°λ₯΄κ³  블둝 μŠ€μ½”ν”„λŠ” λ¬΄μ‹œν•˜λ©΄μ„œ 심지어 같은 μŠ€μ½”ν”„ λ‚΄μ—μ„œ μž¬μ„ μ–Έλ„ ν•  수 μžˆλŠ” μ•„μ£Ό κ·Όλ³Έ μ—†κ³  λͺ»λ˜λ¨Ήμ€ λ†ˆμ΄λ‹€.

μ΄λŸ¬ν•œ νŠΉμ„± λ•Œλ¬Έμ— μ΅œκ·Όμ—λŠ” var μ‚¬μš©μ€ μ§€μ–‘λ˜κ³  주둜 const λ‚˜ let으둜 λ³€μˆ˜λ₯Ό μ„ μ–Έν•œλ‹€.

const와 letλŠ” λͺ¨λ‘ ν•¨μˆ˜ μŠ€μ½”ν”„μ™€ 블둝 μŠ€μ½”ν”„λ₯Ό λ”°λ₯΄λ©° μž¬μ„ μ–Έμ΄ λΆˆκ°€λŠ₯ν•˜λ‹€λŠ” 점은 κ°™μ§€λ§Œ, constλŠ” μž¬ν• λ‹Ήλ„ μ•ˆλ˜λŠ” ν‚€μ›Œλ“œλΌλŠ” 차이가 μžˆλ‹€. 고둜 값이 κ³ μ •λ˜μ–΄ μžˆλŠ” λ³€μˆ˜λŠ” constλ₯Ό μ‚¬μš©ν•˜κ³ , μž¬ν• λ‹Ήμ΄ ν•„μš”ν•œ λ³€μˆ˜λŠ” let을 μ‚¬μš©ν•œλ‹€.

λΈŒλΌμš°μ €μ—μ„œ varλŠ” ν•¨μˆ˜ λ°–μ—μ„œ 선언될 λ•Œ μ „μ—­ 객체(window)의 ν”„λ‘œνΌν‹°κ°€ λœλ‹€.
μ „μ—­ λ³€μˆ˜λ₯Ό λ§Žμ΄μ“°λ©΄ μ˜λ„μΉ˜ μ•Šμ€ λΆ€μˆ˜νš¨κ³Ό(side-effect)κ°€ λ°œμƒν•  κ°€λŠ₯성이 μ»€μ§€λ―€λ‘œ μ „μ—­ λ³€μˆ˜λŠ” μ§€μ–‘ν•˜λŠ”κ²Œ μ’‹λ‹€.


암묡적 μ „μ—­(implicit global)

선언없이 블둝 μŠ€μ½”ν”„ λ‚΄μ—μ„œ λ³€μˆ˜λ₯Ό ν• λ‹Ήν•˜κ²Œ 되면 μ „μ—­κ°μ²΄μ˜ ν”„λ‘œνΌν‹°κ°€ λ˜λ©΄μ„œ μ „μ—­μ—μ„œ μ°Έμ‘°ν•  수 있게 λœλ‹€. 즉 var둜 μ„ μ–Έν•œ 것과 μœ μ‚¬ν•œ 취급을 λ°›κ²Œ λœλ‹€.

이λ₯Ό μ‚­μ œν•˜λ €λ©΄ delete window.λ³€μˆ˜λͺ… λ©”μ†Œλ“œλ₯Ό μ‚¬μš©ν•˜λ©΄ λœλ‹€.

let x = 10;

if(1) {
 y = 20
}

console.log(y) // 20; 블둝 μŠ€μ½”ν”„ λ°–μœΌλ‘œ λͺ»λ‚˜μ˜€λŠ”κ²Œ λ§žμ§€λ§Œ 선언없이 할당을 해버렀 μ „μ—­κ°μ²΄μ˜ ν”„λ‘œνΌν‹°κ°€ λ˜μ–΄λ²„λ Έλ‹€.

Closure Function ( ν΄λ‘œμ € ν•¨μˆ˜ )

ν΄λ‘œμ € ν•¨μˆ˜μ˜ μ •μ˜λŠ” ν•¨μˆ˜μ™€ ν•¨μˆ˜κ°€ μ„ μ–Έλœ μ–΄νœ˜μ  ν™˜κ²½(lexical environment)의 쑰합을 λ§ν•œλ‹€. 이 ν™˜κ²½μ€ ν΄λ‘œμ €κ°€ μƒμ„±λœ μ‹œμ μ˜ 유효 λ²”μœ„ 내에 μžˆλŠ” λͺ¨λ“  지역 λ³€μˆ˜λ‘œ κ΅¬μ„±λœλ‹€. 이닀.
μ–΄νœ˜μ  ν™˜κ²½μ€ λ³€μˆ˜ 및 ν•¨μˆ˜ μ„ μ–Έμ˜ ν˜•νƒœ μ •λ„λ‘œλ§Œ κΈ°μ–΅ν•΄λ‘μž.

말이 μ–΄λ €μš΄λ° 쑰금 ν’€μ–΄μ“°μžλ©΄ λ¦¬ν„΄λœ λ‚΄λΆ€ν•¨μˆ˜(ν΄λ‘œμ € ν•¨μˆ˜)κ°€ λ‚΄λΆ€ν•¨μˆ˜λ₯Ό 감싸고 μžˆλŠ” μ™ΈλΆ€ν•¨μˆ˜μ˜ 싀행이 μ’…λ£Œλœ ν›„ μ™ΈλΆ€μ—μ„œ ν˜ΈμΆœλ˜μ–΄λ„ κ·Έ ν•¨μˆ˜κ°€ λ¦¬ν„΄λ˜λ©° μ„ μ–Έλ˜μ—ˆμ„ λ‹Ήμ‹œ ν™˜κ²½μ„ κΈ°μ–΅ν•΄ κ·Έ ν™˜κ²½μ— μ ‘κ·Ό ν•  수 있게 ν•΄μ£ΌλŠ” 것이닀.
λ˜‘κ°™μ΄ 머리아프닀

쑰금 더 κ°„λ‹¨ν•˜κ²Œ ν•˜μžλ©΄ μ™ΈλΆ€ ν•¨μˆ˜μ— μ ‘κ·Ό ν•  수 μžˆλŠ” λ‚΄λΆ€ ν•¨μˆ˜μ •λ„λ‘œλ§Œ κΈ°μ–΅ν•΄λ†“μž.

ν΄λ‘œμ € ν•¨μˆ˜λŠ” ν•¨μˆ˜κ°€ 내뢀와 μ™ΈλΆ€λ‘œ λ‚˜λ‰˜μ–΄ 있고 이λ₯Ό λ‚΄λΆ€ ν•¨μˆ˜, μ™ΈλΆ€ ν•¨μˆ˜λΌκ³  ν•œλ‹€.

이 μ—­μ‹œ λ‹€λ₯Έ μŠ€μ½”ν”„λ“€κ³Ό 같이 μ™ΈλΆ€ ν•¨μˆ˜μ—μ„  λ‚΄λΆ€ ν•¨μˆ˜μ—μ„œ μ„ μ–Έν•œ λ³€μˆ˜μ— μ ‘κ·Ό λΆˆκ°€λŠ₯ν•˜λ©°,
λ°˜λŒ€λ‘œ λ‚΄λΆ€ ν•¨μˆ˜μ—μ„  μ™ΈλΆ€ ν•¨μˆ˜μ—μ„œ μ„ μ–Έν•œ λ³€μˆ˜μ— μ ‘κ·Ό κ°€λŠ₯ν•˜λ‹€.

function outer(x){
  y += 1
  return function inner(y){
    x += 1
  }
} 
//outer의 μŠ€μ½”ν”„μ— inner의 λ§€κ°œλ³€μˆ˜μ— 1 λ”ν•œλ‹€λŠ” 게 μ ν˜€μžˆλ‹€.
//이런 μ‹μœΌλ‘œ μ™ΈλΆ€ ν•¨μˆ˜μ—μ„œ λ‚΄λΆ€ ν•¨μˆ˜μ—μ„œ μ„ μ–Έλœ λ³€μˆ˜λ‘œμ˜ μ°Έμ‘°λŠ” λΆˆκ°€ν•˜λ‹€.

μ›λž˜ ν•¨μˆ˜μ˜ λ§€κ°œλ³€μˆ˜ κ°’κΉŒμ§€ μ§€μ •ν•΄μ„œ ν˜ΈμΆœν•˜λŠ” 것은 λ³€μˆ˜μ§€μ •μ΄ λ˜μ§€ μ•Šκ³ , 일반적인 ν•¨μˆ˜λŠ” ν•¨μˆ˜μ‹€ν–‰μ΄ λλ‚˜λ©΄ ν•¨μˆ˜ 내뢀에 μ ‘κ·Όν•  수 μ—†μ§€λ§Œ, ν΄λ‘œμ € ν•¨μˆ˜μ˜ 경우 μ–΄νœ˜μ  ν™˜κ²½μ„ λ©”λͺ¨λ¦¬μ— μ €μž₯ν•˜κΈ°μ— μ™ΈλΆ€ ν•¨μˆ˜ λ‚΄ λ³€μˆ˜κ°€ λ©”λͺ¨λ¦¬ 상에 μ €μž₯λœλ‹€.


μ‘μš©: ν΄λ‘œμ € λͺ¨λ“ˆ νŒ¨ν„΄

ν΄λ‘œμ € ν•¨μˆ˜λŠ” μ™ΈλΆ€ ν•¨μˆ˜ λ‚΄ λ³€μˆ˜κ°€ λ©”λͺ¨λ¦¬ 상에 μ €μž₯λ˜κΈ°μ— 외뢀에선 λ³€μˆ˜μ— μ ‘κ·Όν•˜μ§€ λͺ»ν•˜κ²Œ ν•˜κ³  λͺ‡κ°€μ§€ μ •ν•΄λ‘” νŒ¨ν„΄μœΌλ‘œ ν•¨μˆ˜λ₯Ό ν˜ΈμΆœν•¨μœΌλ‘œ 내뢀에 μžˆλŠ” 데이터λ₯Ό λ³€κ²½μ‹œν‚€λŠ” 방법이 ν΄λ‘œμ € λͺ¨λ“ˆ νŒ¨ν„΄μ΄λ‹€.
ν•¨μˆ˜μ˜ 리턴 값을 객체둜 μ •ν•˜κ³  객체의 ν”„λ‘œνΌν‹° λ°Έλ₯˜μ— ν•¨μˆ˜λ₯Ό ν• λ‹Ήν•˜λ©΄μ„œ κ·Έκ±Έ μž‘λ™μ‹œν‚¬ ν”„λ‘œνΌν‹° ν‚€λ₯Ό μ„€μ •ν•˜λŠ” 것이닀.

const makeCounter = () => {
  let count = 0;
  return {
    increase: () => count++,
    decrease: () => count--,
  	getCount: () => count,
  }
}

let counter1 = makeCounter();
counter1.increase();
counter1.increase();
counter1.increase();
counter1.getCount(); // 3; 

let counter2 = makeCounter();
counter2.decrease();
counter2.decrease();
counter2.decrease();
counter2.getCount(); //-3; 

//μ–΄νœ˜μ  ν™˜κ²½μ„ μ €μž₯ν•˜λŠ” νŠΉμ„± 덕에 μ™ΈλΆ€ ν•¨μˆ˜λ₯Ό λ‹€λ₯Έ λ³€μˆ˜μ— μ§€μ •ν•˜λ©΄, 
//같은 ν•¨μˆ˜λ‘œ μ—¬λŸ¬ 값을 κ°€μ§€κ²Œ ν•  수 μžˆλ‹€.

GOOD πŸ˜‰

μ›μ‹œ μžλ£Œν˜•κ³Ό μ°Έμ‘° μžλ£Œν˜•μ˜ 차이λ₯Ό 보닀 ν™•μ‹€νžˆ ν–ˆλ‹€.
μŠ€μ½”ν”„ κ°œλ…μ„ λͺ…ν™•νžˆ ν–ˆκ³ , ν΄λ‘œμ € κ°œλ…μ„ λ°°μ› λ‹€.
μ˜€λŠ˜μ€ μ‹œκ°„μ΄ λΆ€μ‘±ν•˜μ§€ μ•Šμ•˜λ‹€.

BAD πŸ˜₯

μ—­μ‹œ λ‹€λ₯Έ 곡뢀λ₯Ό λͺ»ν•œκ²Œ λ§ˆμŒμ— κ±Έλ¦°λ‹€.

TO DO πŸ”₯

  • DOM ꡬ쑰
  • React
  • μž¬κ·€ ν•¨μˆ˜
  • 아침에 Spread, Rest 문법과 js Koans 예슡

Retrospect 🧐

μ˜€λŠ˜μ€ νŽ˜μ–΄κ°€ μ—†λŠ” μ±•ν„°λ‘œ κ°€λ“ν•œ λ§ˆμ§€λ§‰ 날이닀.
μ•„λ§ˆ 였늘처럼 μ±•ν„°μ‹œκ°„μ„ μ—¬μœ λ‘­κ²Œ 가지며 κ³΅λΆ€ν•˜λŠ” 날은 μ•žμœΌλ‘œ 없겠지.

μ •μ‹ μͺΌμœΌκ³  μ œλŒ€λ‘œ λ‹¬λ €λ³΄μž!

Reference πŸ™‡

https://poiemaweb.com/
https://developer.mozilla.org/

profile
μ–΄λ–»κ²Œ 이걸 ν’€μ–΄λ‚Ό 수 μžˆμ„κΉŒ

0개의 λŒ“κΈ€