관리 메뉴

Daehyunii's Dev-blog

14μž₯ μ „μ—­ λ³€μˆ˜μ˜ 문제점 λ³Έλ¬Έ

πŸ“š Language & CS knowledge/JavaScript (λͺ¨λ˜μžλ°”μŠ€ν¬λ¦½νŠΈ Deep Dive)

14μž₯ μ „μ—­ λ³€μˆ˜μ˜ 문제점

Daehyunii 2022. 7. 4. 22:35

14.1 λ³€μˆ˜μ˜ 생λͺ… μ£ΌκΈ°

14.1.1 지역 λ³€μˆ˜μ˜ 생λͺ… μ£ΌκΈ°

  λ³€μˆ˜λŠ” 선언에 μ˜ν•΄ μƒμ„±λ˜κ³  할당을 톡해 값을 κ°–λŠ”λ‹€. 그리고 μ–Έμ  κ°€ μ†Œλ©Έν•œλ‹€. 즉 λ³€μˆ˜λŠ” 생물과 μœ μ‚¬ν•˜κ²Œ μƒμ„±λ˜κ³  μ†Œλ©Έλ˜λŠ” 생λͺ… μ£ΌκΈ°κ°€ μžˆλ‹€. λ³€μˆ˜λŠ” μžμ‹ μ΄ μ„ μ–Έλœ μœ„μΉ˜(μ „μ—­or지역)μ—μ„œ μƒμ„±λ˜κ³  μ†Œλ©Έν•œλ‹€. μ „μ—­ λ³€μˆ˜μ˜ 생λͺ… μ£ΌκΈ°λŠ” μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ˜ 생λͺ… 주기와 κ°™λ‹€. ν•˜μ§€λ§Œ ν•¨μˆ˜ λ‚΄λΆ€μ—μ„œ μ„ μ–Έλœ 지역 λ³€μˆ˜λŠ” ν•¨μˆ˜κ°€ 호좜되면 μƒμ„±λ˜κ³  ν•¨μˆ˜κ°€ μ’…λ£Œν•˜λ©΄ μ†Œλ©Έν•œλ‹€.  즉, 지역 λ³€μˆ˜μ˜ 생λͺ… μ£ΌκΈ°λŠ” ν•¨μˆ˜μ˜ 생λͺ… 주기와 μΌμΉ˜ν•œλ‹€. λ‹€μ‹œ 말해 지역 λ³€μˆ˜λŠ” ν•¨μˆ˜κ°€ 호좜되면 지역 λ³€μˆ˜κ°€ μƒμ„±λ˜κ³ , ν•¨μˆ˜μ˜ μ’…λ£Œμ™€ ν•¨κ»˜ 지역 λ³€μˆ˜λ„ μ†Œλ©Έν•œλ‹€.

 

14.1.2 μ „μ—­ λ³€μˆ˜μ˜ 생λͺ… μ£ΌκΈ°

  ν•¨μˆ˜μ™€ 달리 μ „μ—­ μ½”λ“œλŠ” λͺ…μ‹œμ μΈ 호좜 없이 μ‹€ν–‰λœλ‹€. λ‹€μ‹œ 말해, μ „μ—­ μ½”λ“œλŠ” ν•¨μˆ˜ 호좜과 같이 μ „μ—­ μ½”λ“œλ₯Ό μ‹€ν–‰ν•˜λŠ” νŠΉλ³„ν•œ μ§„μž…μ μ΄ μ—†κ³  μ½”λ“œκ°€ λ‘œλ“œλ˜μžλ§ˆμž κ³§λ°”λ‘œ ν•΄μ„λ˜κ³  μ‹€ν–‰λœλ‹€. ν•¨μˆ˜λŠ” ν•¨μˆ˜ λͺΈμ²΄μ˜ λ§ˆμ§€λ§‰ λ¬Έ λ˜λŠ” λ°˜ν™˜λ¬Έμ΄ μ‹€ν–‰λ˜λ©΄ μ’…λ£Œν•˜μ§€λ§Œ μ „μ—­ μ½”λ“œμ—λŠ” λ°˜ν™˜λ¬Έμ„ μ‚¬μš©ν•  수 μ—†μœΌλ―€λ‘œ λ§ˆμ§€λ§‰ 문이 μ‹€ν–‰λ˜μ–΄ 더 이상 μ‹€ν–‰ν•  문이 없을 λ•Œ μ’…λ£Œν•œλ‹€.

 

var x = 'global'; //μ „μ—­ λ³€μˆ˜ x의 생λͺ…μ£ΌκΈ°

function foo() { //μ „μ—­ λ³€μˆ˜ x의 생λͺ…μ£ΌκΈ°
	var x = 'local'; //μ „μ—­ λ³€μˆ˜ x의 생λͺ…μ£ΌκΈ° // 지역 λ³€μˆ˜ x의 생λͺ… μ£ΌκΈ°
	console.log(x); //μ „μ—­ λ³€μˆ˜ x의 생λͺ…μ£ΌκΈ° // 지역 λ³€μˆ˜ x의 생λͺ… μ£ΌκΈ°
	return x; //μ „μ—­ λ³€μˆ˜ x의 생λͺ…μ£ΌκΈ° // 지역 λ³€μˆ˜ x의 생λͺ… μ£ΌκΈ°
}

foo(); //μ „μ—­ λ³€μˆ˜ x의 생λͺ…μ£ΌκΈ°
console.log(x); //μ „μ—­ λ³€μˆ˜ x의 생λͺ…μ£ΌκΈ°

 

14.2 μ „μ—­ λ³€μˆ˜μ˜ 문제점

1. 암묡적 κ²°ν•©

  μ „μ—­ λ³€μˆ˜λ₯Ό μ„ μ–Έν•œ μ˜λ„λŠ” μ „μ—­, 즉 μ½”λ“œ μ–΄λ””μ„œλ“  μ°Έμ‘°ν•˜κ³  ν• λ‹Ήν•  수 μžˆλŠ” λ³€μˆ˜λ₯Ό μ‚¬μš©ν•˜κ² λ‹€λŠ” 것이닀. μ΄λŠ” λͺ¨λ“  μ½”λ“œκ°€ μ „μ—­ λ³€μˆ˜λ₯Ό μ°Έμ‘°ν•˜κ³  λ³€κ²½ν•  수 μžˆλŠ” 암묡적 결합을 ν—ˆμš©ν•˜λŠ” 것이닀. λ³€μˆ˜μ˜ 유효 λ²”μœ„κ°€ 크면 클수둝 μ½”λ“œμ˜ 가독성은 λ‚˜λΉ μ§€κ³  μ˜λ„μΉ˜ μ•Šκ²Œ μƒνƒœκ°€ 변경될 수 μžˆλŠ” μœ„ν—˜μ„±λ„ 높아진닀.(μ–΄λ””μ„œλ“  λ³€κ²½ 될 수 μžˆμœΌλ―€λ‘œ)

 

2. κΈ΄ 생λͺ… μ£ΌκΈ°

  μ „μ—­ λ³€μˆ˜λŠ” 생λͺ… μ£ΌκΈ°κ°€ κΈΈλ‹€. λ”°λΌμ„œ λ©”λͺ¨λ¦¬ λ¦¬μ†ŒμŠ€λ„ 였랜 κΈ°κ°„ μ†ŒλΉ„ν•œλ‹€. λ˜ν•œ μ „μ—­ λ³€μˆ˜μ˜ μƒνƒœλ₯Ό λ³€κ²½ν•  수 μžˆλŠ” μ‹œκ°„λ„ κΈΈκ³  κΈ°νšŒλ„ λ§Žλ‹€. λ”μš±μ΄ var ν‚€μ›Œλ“œλŠ” λ³€μˆ˜μ˜ 쀑볡 선언을 ν—ˆμš©ν•˜λ―€λ‘œ 생λͺ… μ£ΌκΈ°κ°€ κΈ΄ μ „μ—­ λ³€μˆ˜λŠ” λ³€μˆ˜ 이름이 쀑볡될 κ°€λŠ₯성이 μžˆλ‹€. λ³€μˆ˜ 이름이 μ€‘λ³΅λ˜λ©΄ μ˜λ„μΉ˜ μ•Šμ€ μž¬ν• λ‹Ήμ΄ 이뀄진닀.

 

3. μŠ€μ½”ν”„ 체인 μƒμ—μ„œ 쒅점에 쑴재

  μ „μ—­ λ³€μˆ˜λŠ” μŠ€μ½”ν”„ 체인 μƒμ—μ„œ 쒅점에 μ‘΄μž¬ν•œλ‹€. μ΄λŠ” λ³€μˆ˜λ₯Ό 검색할 λ•Œ μ „μ—­ λ³€μˆ˜κ°€ κ°€μž₯ λ§ˆμ§€λ§‰μ— κ²€μƒ‰λœλ‹€λŠ” 것을 λ§ν•œλ‹€. 즉, μ „μ—­ 벼수의 검색 속도가 κ°€μž₯ λŠλ¦¬λ‹€. 검색 μ†λ„μ˜ μ°¨μ΄λŠ” 그닀지 크지 μ•Šκ² μ§€λ§Œ μ†λ„μ˜ μ°¨μ΄λŠ” λΆ„λͺ…νžˆ μžˆλ‹€.

 

4. λ„€μž„μŠ€νŽ˜μ΄μŠ€ μ˜€μ—Ό

  μžλ°”μŠ€ν¬λ¦½νŠΈμ˜ κ°€μž₯ 큰 문제점 쀑 ν•˜λ‚˜λŠ” 파일이 λΆ„λ¦¬λ˜μ–΄ μžˆλ‹€ 해도 ν•˜λ‚˜μ˜ μ „μ—­ μŠ€μ½”ν”„λ₯Ό κ³΅μœ ν•œλ‹€λŠ” 것이닀. λ”°λΌμ„œ λ‹€λ₯Έ 파일 λ‚΄μ—μ„œ λ™μΌν•œ μ΄λ¦„μœΌλ‘œ λͺ…λͺ…λœ μ „μ—­ λ³€μˆ˜λ‚˜ μ „μ—­ ν•¨μˆ˜κ°€ 같은 μŠ€μ½”ν”„ 내에 μ‘΄μž¬ν•  경우 μ˜ˆμƒμΉ˜ λͺ»ν•œ κ²°κ³Όλ₯Ό κ°€μ Έμ˜¬ 수 μžˆλ‹€.

 

14.3 μ „μ—­ λ³€μˆ˜μ˜ μ‚¬μš©μ„ μ–΅μ œν•˜λŠ” 방법

  μ „μ—­ λ³€μˆ˜μ˜ λ¬΄λΆ„λ³„ν•œ μ‚¬μš©μ€ μœ„ν—˜ν•˜λ‹€. μ „μ—­ λ³€μˆ˜λ₯Ό λ°˜λ“œμ‹œ μ‚¬μš©ν•΄μ•Ό ν•  이유λ₯Ό 찾지 λͺ»ν•œλ‹€λ©΄ 지역 λ³€μˆ˜λ₯Ό μ‚¬μš©ν•΄μ•Ό ν•œλ‹€. λ³€μˆ˜μ˜ μŠ€μ½”ν”„λŠ” μ’μ„μˆ˜λ‘ μ’‹λ‹€. 

 

14.3.1 μ¦‰μ‹œ μ‹€ν–‰ ν•¨μˆ˜

  ν•¨μˆ˜ μ •μ˜μ™€ λ™μ‹œμ— ν˜ΈμΆœλ˜λŠ” μ¦‰μ‹œ μ‹€ν–‰ ν•¨μˆ˜λŠ” 단 ν•œ 번만 ν˜ΈμΆœλœλ‹€. λͺ¨λ“  μ½”λ“œλ₯Ό μ¦‰μ‹œ μ‹€ν–‰ ν•¨μˆ˜λ‘œ 감싸면 λͺ¨λ“  λ³€μˆ˜λŠ” μ¦‰μ‹œ μ‹€ν–‰ ν•¨μˆ˜μ˜ 지역 λ³€μˆ˜κ°€ λœλ‹€. μ΄λŸ¬ν•œ νŠΉμ„±μ„ μ΄μš©ν•΄ μ „μ—­ λ³€μˆ˜μ˜ μ‚¬μš©μ„ μ œν•œν•˜λŠ” 방법이닀.

(function(){
    var foo = 10; // μ¦‰μ‹œ μ‹€ν–‰ ν•¨μˆ˜μ˜ 지역 λ³€μˆ˜
}());

console.log(foo); // ReferenceError λ°œμƒ

14.3.2 λ„€μž„μŠ€νŽ˜μ΄μŠ€ 객체

  전역에 λ„€μž„μŠ€νŽ˜μ΄μŠ€ 역할을 λ‹΄λ‹Ήν•  객체λ₯Ό μƒμ„±ν•˜κ³  μ „μ—­ λ³€μˆ˜μ²˜λŸΌ μ‚¬μš©ν•˜κ³  싢은 λ³€μˆ˜λ₯Ό ν”„λ‘œνΌν‹°λ‘œ μΆ”κ°€ν•˜λŠ” 방법이닀.

var NAMESPACE = {};

NAMESPACE.name = 'lee';

console.log((NAMESPACE.name)); // lee

14.3.3 λͺ¨λ“ˆ νŒ¨ν„΄ 

  λͺ¨λ“ˆ νŒ¨ν„΄μ€ 클래슀λ₯Ό λͺ¨λ°©ν•΄μ„œ 관련이 μžˆλŠ” λ³€μˆ˜μ™€ ν•¨μˆ˜λ₯Ό λͺ¨μ•„ μ¦‰μ‹œ μ‹€ν–‰ ν•¨μˆ˜λ‘œ 감싸 ν•˜λ‚˜μ˜ λͺ¨λ“ˆμ„ λ§Œλ“ λ‹€. λͺ¨λ“ˆ νŒ¨ν„΄μ€ μžλ°”μŠ€ν¬λ¦½νŠΈμ˜ κ°•λ ₯ν•œ κΈ°λŠ₯인 ν΄λ‘œμ €λ₯Ό 기반으둜 λ™μž‘ν•œλ‹€. λͺ¨λ“ˆ νŒ¨ν„΄μ˜ νŠΉμ§•μ€ μ „μ—­ λ³€μˆ˜μ˜ μ–΅μ œλŠ” λ¬Όλ‘  μΊ‘μŠν™”κΉŒμ§€ κ΅¬ν˜„ν•  수 μžˆλ‹€λŠ” 것이닀.

λͺ¨λ“ˆ νŒ¨ν„΄μ„ μ•ŒκΈ° μœ„ν•΄μ„œλŠ” 'ν΄λ‘œμ €'κ°œλ…μ„ μ•Œμ•„μ•Ό 이해할 수 있기 λ•Œλ¬Έμ— μžμ„Έν•œ λ‚΄μš©μ€ ν΄λ‘œμ €μ™€ ν•¨κ»˜ μ •λ¦¬ν•˜κ³  ν•œλ‹€.

 

14.3.4 ES6 λͺ¨λ“ˆ

  ES6 λͺ¨λ“ˆμ„ μ‚¬μš©ν•˜λ©΄ λ”λŠ” μ „μ—­ λ³€μˆ˜λ₯Ό μ‚¬μš©ν•  수 μ—†λ‹€. ES6 λͺ¨λ“ˆμ€ 파일 자체의 λ…μžμ μΈ λͺ¨λ“ˆ μŠ€μ½”ν”„λ₯Ό μ œκ³΅ν•œλ‹€. λ”°λΌμ„œ λͺ¨λ“ˆ λ‚΄μ—μ„œ var ν‚€μ›Œλ“œλ‘œ μ„ μ–Έν•œ λ³€μˆ˜λŠ” λ”λŠ” μ „μ—­ λ³€μˆ˜κ°€ μ•„λ‹ˆλ©° window 객체의 ν”„λ‘œνΌν‹°λ„ μ•„λ‹ˆλ‹€. 아직 ES6 λͺ¨λ“ˆμ— λŒ€ν•œ κ°œλ…μ„ μ•Œμ§€ λͺ»ν•΄ μžμ„Έν•œ λ‚΄μš©μ€ λ‚˜μ€‘μ— λ‹€μ‹œ μ •λ¦¬ν•˜κ³  ν•œλ‹€.