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

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

λ³€μˆ˜λŠ” μžμ‹ μ΄ μ„ μ–Έλœ μœ„μΉ˜μ—μ„œ μƒμ„±λ˜κ³  μ†Œλ©Έλ˜λŠ” '생λͺ…μ£ΌκΈ°(Life Cycle)'이 μžˆλ‹€.
  • λ³€μˆ˜λŠ” ν•˜λ‚˜μ˜ 값을 μ €μž₯ν•˜κΈ° μœ„ν•΄ ν™•λ³΄ν•œ λ©”λͺ¨λ¦¬ 곡간 자체/κ·Έ λ©”λͺ¨λ¦¬ 곡간을 μ‹λ³„ν•˜κΈ° μœ„ν•΄ 뢙인 이름

  • λ³€μˆ˜μ˜ 생λͺ…μ£ΌκΈ°λŠ” λ©”λͺ¨λ¦¬ 곡간이 확보(allocate)된 μ‹œμ λΆ€ν„° λ©”λͺ¨λ¦¬ 곡간이 ν•΄μ œ(release)λ˜μ–΄ κ°€μš© λ©”λͺ¨λ¦¬ ν’€(memory pool)에 λ°˜ν™˜λ˜λŠ” μ‹œμ κΉŒμ§€

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

지역 λ³€μˆ˜μ˜ 생λͺ…μ£ΌκΈ°λŠ” ν•¨μˆ˜μ˜ 생λͺ…주기와 μΌμΉ˜ν•œλ‹€.
  • ν•¨μˆ˜κ°€ 호좜되면 μƒμ„±λ˜κ³  ν•¨μˆ˜κ°€ μ’…λ£Œν•˜λ©΄ μ†Œλ©Έν•œλ‹€.

μ§€μ—­λ³€μˆ˜ ν˜Έμ΄μŠ€νŒ… μŠ€μ½”ν”„

  • ν•¨μˆ˜ λ‚΄λΆ€μ—μ„œ μ„ μ–Έν•œ λ³€μˆ˜λŠ” ν•¨μˆ˜κ°€ 호좜된 직후에 ν•¨μˆ˜ λͺΈμ²΄μ˜ μ½”λ“œκ°€ ν•œ 쀄씩 순차적으둜 μ‹€ν–‰λ˜κΈ° 이전에 μžλ°”μŠ€ν¬λ¦½νŠΈ 엔진에 μ˜ν•΄ λ¨Όμ € μ‹€ν–‰λœλ‹€.

    function foo() {
        // λ³€μˆ˜ x μ„ μ–Έ & undefined둜 μ΄ˆκΈ°ν™”
        console.log(x); // undefined ❗❗
        var x = "local"; // λ³€μˆ˜ x에 κ°’ ν• λ‹Ή
        console.log(x); // local
        return x;
        // λ³€μˆ˜ μ†Œλ©Έ
    }
    
    foo();
  • μ§€μ—­λ³€μˆ˜μ˜ 선언이 지역 μŠ€μ½”ν”„μ˜ μ„ λ‘λ‘œ λŒμ–΄ μ˜¬λ €μ§„ κ²ƒμ²˜λŸΌ λ™μž‘ν•˜λŠ” 것

  • λ”°λΌμ„œ, μ§€μ—­λ³€μˆ˜λŠ” ν•¨μˆ˜ μ „μ²΄μ—μ„œ μœ νš¨ν•˜λ‹€.

  • μ°Έκ³ ) ν˜Έμ΄μŠ€νŒ…μ€ μŠ€μ½”ν”„λ₯Ό λ‹¨μœ„λ‘œ λ™μž‘ν•œλ‹€.

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

var ν‚€μ›Œλ“œ 둜 μ„ μ–Έν•œ μ „μ—­ λ³€μˆ˜μ˜ 생λͺ… μ£ΌκΈ°λŠ” μ „μ—­ 객체의 생λͺ… 주기와 μΌμΉ˜ν•œλ‹€.
  • μ „μ—­ λ³€μˆ˜λŠ” λͺ…μ‹œμ μΈ 호좜 없이 μ‹€ν–‰λœλ‹€.

    • μ „μ—­ μ½”λ“œλŠ” νŠΉλ³„ν•œ μ§„μž…μ μ΄ μ—†κ³  μ½”λ“œκ°€ λ‘œλ“œλ˜μžλ§ˆμž κ³§λ°”λ‘œ ν•΄μ„λ˜κ³  μ‹€ν–‰λœλ‹€.

  • μ „μ—­ μ½”λ“œλŠ” λ°˜ν™˜λ¬Έμ„ μ‚¬μš©ν•  수 μ—†μœΌλ―€λ‘œ λ§ˆμ§€λ§‰ 문이 μ‹€ν–‰λ˜μ–΄ 더이상 μ‹€ν–‰ν•  문이 없을 λ•Œ μ’…λ£Œν•œλ‹€.

  • var ν‚€μ›Œλ“œλ‘œ μ„ μ–Έν•œ μ „μ—­ λ³€μˆ˜λŠ” μ „μ—­ 객체의 ν”„λ‘œνΌν‹°κ°€ λœλ‹€.

μ „μ—­ 객체(global object)

  • μ½”λ“œκ°€ μ‹€ν–‰λ˜κΈ°(λŸ°νƒ€μž„) 이전에 μžλ°”μŠ€ν¬λ¦½νŠΈ 엔진에 μ˜ν•΄ μ–΄λ–€ 객체보닀도 λ¨Όμ € μƒμ„±λ˜λŠ” νŠΉμˆ˜ν•œ 객체

  • λΈŒλΌμš°μ €μ—μ„œλŠ” window, Node.jsμ—μ„œλŠ” global 객체λ₯Ό 의미

  • ES11λΆ€ν„° globalThis둜 μ „μ—­ 객체λ₯Ό κ°€λ¦¬ν‚€λŠ” μ‹λ³„μž 톡일

  • ν‘œμ€€ 빌트인 객체(Object, String, Number, Function, Array ...)와 ν™˜κ²½μ— λ”°λ₯Έ 호슀트 객체(λΈŒλΌμš°μ €μ˜ Web API λ˜λŠ” Node.js의 호슀트 API), var ν‚€μ›Œλ“œλ‘œ μ„ μ–Έν•œ μ „μ—­ λ³€μˆ˜μ™€ μ „μ—­ ν•¨μˆ˜λ₯Ό ν”„λ‘œνΌν‹°λ‘œ 가진닀.

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

1. 암묡적 κ²°ν•©(implicit coupling)

  • 암묡적 결합을 ν—ˆμš©ν•œλ‹€λŠ” 것 == λͺ¨λ“  μ½”λ“œκ°€ μ „μ—­ λ³€μˆ˜λ₯Ό μ°Έμ‘°ν•˜κ³  λ³€κ²½ν•  수 μžˆλŠ” 것

  • λ³€μˆ˜μ˜ 유효 λ²”μœ„κ°€ 크면 클수둝 μ½”λ“œμ˜ 가독성은 λ‚˜λΉ μ§€κ³  μ˜λ„μΉ˜ μ•Šκ²Œ μƒνƒœκ°€ 변경될 수 μžˆλŠ” μœ„ν—˜μ„±μ΄ 높아진닀.

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

  • μ „μ—­λ³€μˆ˜λŠ” 생λͺ…μ£ΌκΈ°κ°€ κΈΈλ‹€.

  • λ³€μˆ˜ 이름이 쀑볡될 수 있고 μ€‘λ³΅λ˜λ©΄ μ˜λ„μΉ˜ μ•Šμ€ μž¬ν• λ‹Ήμ΄ 이뀄진닀.

  • λ”°λΌμ„œ, μƒνƒœ 변경에 μ˜ν•œ 였λ₯˜κ°€ λ°œμƒν•  ν™•λ₯ μ΄ λ†’κ³  λ©”λͺ¨λ¦¬ λ¦¬μ†ŒμŠ€λ„ κΈ΄ μ‹œκ°„ μ†ŒλΉ„ν•œλ‹€.

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

  • μ „μ—­ λ³€μˆ˜λŠ” μŠ€μ½”ν”„ 체인 μƒμ—μ„œ 쒅점에 μ‘΄μž¬ν•˜κΈ° λ•Œλ¬Έμ— β†’ λ³€μˆ˜λ₯Ό 검색할 λ•Œ μ „μ—­ λ³€μˆ˜κ°€ κ°€μž₯ λ§ˆμ§€λ§‰μ— κ²€μƒ‰λœλ‹€.

  • μ „μ—­ λ³€μˆ˜μ˜ 검색 속도가 λŠλ¦¬λ‹€.

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

  • μžλ°”μŠ€ν¬λ¦½νŠΈλŠ” 파일이 λΆ„λ¦¬λ˜μ–΄μžˆλ‹€ 해도 ν•˜λ‚˜μ˜ μ „μ—­ μŠ€μ½”ν”„λ₯Ό κ³΅μœ ν•œλ‹€.

  • λ”°λΌμ„œ, λ‹€λ₯Έ 파일 λ‚΄μ—μ„œ λ™μΌν•œ μ΄λ¦„μœΌλ‘œ λͺ…λͺ…λœ μ „μ—­ λ³€μˆ˜λ‚˜ μ „μ—­ ν•¨μˆ˜κ°€ 같은 μŠ€μ½”ν”„ 내에 μ‘΄μž¬ν•  경우 μ˜ˆμƒμΉ˜ λͺ»ν•œ κ²°κ³Όλ₯Ό μ΄ˆλž˜ν•  수 μžˆλ‹€.

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

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

1. μ¦‰μ‹œ μ‹€ν–‰ ν•¨μˆ˜ μ‚¬μš©

  • λͺ¨λ“  μ½”λ“œλ₯Ό μ¦‰μ‹œ μ‹€ν–‰ν•¨μˆ˜λ‘œ 감싸면 λͺ¨λ“  λ³€μˆ˜λŠ” μ¦‰μ‹œ μ‹€ν–‰ν•¨μˆ˜μ˜ 지역 λ³€μˆ˜κ°€ λœλ‹€.

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

console.log(foo); // ReferenceError: foo is not defined

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

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

  • λ„€μž„μŠ€νŽ˜μ΄μŠ€ 객체에 또 λ‹€λ₯Έ λ„€μž„ 슀페이슀 객체λ₯Ό ν”„λ‘œνΌν‹°λ‘œ μΆ”κ°€ν•  수 μžˆλ‹€. (계측적 λ„€μž„μŠ€νŽ˜μ΄μŠ€)

  • λ„€μž„μŠ€νŽ˜μ΄μŠ€ 객체 μžμ²΄κ°€ μ „μ—­ λ³€μˆ˜μ— ν• λ‹Ήλ˜λ―€λ‘œ 그닀지 μœ μš©ν•˜μ§„ μ•ŠλŠ”λ‹€.

// μ „μ—­ λ„€μž„μŠ€νŽ˜μ΄μŠ€ 객체
var MYAPP = {};

// λ„€μž„μŠ€νŽ˜μ΄μŠ€ 내뢀에 또 λ‹€λ₯Έ λ„€μž„μŠ€νŽ˜μ΄μŠ€ 계측적 ꡬ쑰 생성
MYAPP.person = {
    name: "Kwak",
    address: "SEOUL",
};

console.log(MYAPP.person.name); // 'Kwak'

3. λͺ¨λ“ˆ νŒ¨ν„΄ μ‚¬μš©

  • 클래슀λ₯Ό λͺ¨λ°©ν•΄μ„œ 관련이 μžˆλŠ” λ³€μˆ˜μ™€ ν•¨μˆ˜λ₯Ό μ¦‰μ‹œ μ‹€ν–‰ ν•¨μˆ˜λ‘œ 감싸 ν•˜λ‚˜μ˜ λͺ¨λ“ˆμ„ λ§Œλ“ λ‹€.

  • ν΄λ‘œμ €(closure)λ₯Ό 기반으둜 λ™μž‘ν•œλ‹€. - 이후 λ‹€λ£° λ‚΄μš©

  • μ „μ—­ λ³€μˆ˜μ˜ μ–΅μ œλŠ” λ¬Όλ‘  μΊ‘μŠν™”(encapsulation) κΉŒμ§€ κ΅¬ν˜„ν•  수 μžˆλ‹€ β‡’ 정보 은닉 κ°€λŠ₯

var Counter = (function () {
    // private λ³€μˆ˜
    var num = 0;

    // μ™ΈλΆ€λ‘œ κ³΅κ°œν•  λ°μ΄ν„°λ‚˜ λ©”μ„œλ“œ ν”„λ‘œνΌν‹°λ₯Ό μΆ”κ°€ν•œ 객체λ₯Ό λ°˜ν™˜
    return {
        increase() {
            return ++num;
        },
        decrease() {
            return --num;
        },
    };
})();

console.log(Counter.num); // undefined ❗private λ³€μˆ˜λŠ” μ™ΈλΆ€λ‘œ λ…ΈμΆœλ˜μ§€ μ•ŠκΈ° λ•Œλ¬Έ
console.log(Counter.increase()); // 1
console.log(Counter.increase()); // 2
console.log(Counter.decrease()); // 1
console.log(Counter.decrease()); // 0

4. ES6 λͺ¨λ“ˆ

  • ES6 λͺ¨λ“ˆμ€ 파일 자체의 λ…μžμ μΈ λͺ¨λ“ˆ μŠ€μ½”ν”„λ₯Ό μ œκ³΅ν•œλ‹€.

  • λͺ¨λ“ˆ λ‚΄μ—μ„œ var ν‚€μ›Œλ“œλ‘œ μ„ μ–Έν•œ λ³€μˆ˜λŠ” μ „μ—­ λ³€μˆ˜λ‚˜ window 객체의 ν”„λ‘œνΌν‹°κ°€ μ•„λ‹ˆλ‹€.

Last updated