🌸06μž₯. 데이터 νƒ€μž…

βœ…6.1 데이터 νƒ€μž…(data type)

πŸ‘‰ 데이터 νƒ€μž…μ€ κ°’μ˜ μ’…λ₯˜λ₯Ό λ§ν•œλ‹€.
πŸ‘‰ μžλ°”μŠ€ν¬λ¦½νŠΈμ˜ λͺ¨λ“  값은 데이터 νƒ€μž…μ„ κ°–λŠ”λ‹€.

βœ…6.2 μžλ°”μŠ€ν¬λ¦½νŠΈκ°€ μ œκ³΅ν•˜λŠ” νƒ€μž…

숫자 νƒ€μž…

μžλ°”μŠ€ν¬λ¦½νŠΈλŠ”Β ν•˜λ‚˜μ˜ 숫자 νƒ€μž…λ§Œ μ‘΄μž¬ν•œλ‹€.
  • ECMAScript에 λ”°λ₯΄λ©΄, 숫자 νƒ€μž…μ˜ 값은 배정밀도 64λΉ„νŠΈ λΆ€λ™μ†Œμˆ˜μ  ν˜•μ‹μ„ λ”°λ₯Έλ‹€.

    • 즉, λͺ¨λ“  수λ₯Ό μ‹€μˆ˜λ‘œ μ²˜λ¦¬ν•œλ‹€.

    • λ”°λΌμ„œ μ•„λž˜μ˜ 상황을 μ£Όμ˜ν•΄μ•Όν•œλ‹€.

    console.log(0.1 + 0.2); // 0.30000000000000004
    console.log(0.1 + 0.2 == 0.3); //false
  • μΆ”κ°€μ μœΌλ‘œ 3가지 νŠΉλ³„ν•œ 값도 ν‘œν˜„ν•  수 μžˆλ‹€.

    // 숫자 νƒ€μž…μ˜ μ„Έ 가지 νŠΉλ³„ν•œ κ°’
    console.log(10 / 0); // Infinity : μ–‘μ˜ λ¬΄ν•œλŒ€
    console.log(10 / -0); // -Infinity : 음의 λ¬΄ν•œλŒ€
    console.log(1 * "String"); // NaN : μ‚°μˆ  μ—°μ‚° λΆˆκ°€ (not a Number)

λ¬Έμžμ—΄ νƒ€μž…

μžλ°”μŠ€ν¬λ¦½νŠΈμ—μ„œ λ¬Έμžμ—΄μ€ μ›μ‹œνƒ€μž…μ΄λ©°, λ³€κ²½ λΆˆκ°€λŠ₯ν•œ(immutable) 값이닀.
  • λ¬Έμžμ—΄μ΄ ν•œλ²ˆ μƒμ„±λ˜λ©΄, κ·Έ λ¬Έμžμ—΄μ€ λ³€κ²½ν•  수 μ—†λ‹€. (feat. λ³€κ²½ λΆˆκ°€λŠ₯ν•œ κ°’(immutable value))

  • μž‘μ€λ”°μ˜΄ν‘œ('') , 큰 λ”°μ˜΄ν‘œ(""), λ°±ν‹±(``) 으둜 ν…μŠ€νŠΈλ₯Ό 감싼닀.

ν…œν”Œλ¦Ώ λ¦¬ν„°λŸ΄

λ©€ν‹° 라인 λ¬Έμžμ—΄, ν‘œν˜„μ‹ μ‚½μž…, νƒœκ·Έλ“œ ν…œν”Œλ¦Ώ(tagged template) λ“± νŽΈλ¦¬ν•œ λ¬Έμžμ—΄ 처리 κΈ°λŠ₯을 μ œκ³΅ν•œλ‹€.
  • ES6λΆ€ν„° λ„μž…λœ μƒˆλ‘œμš΄ λ¬Έμžμ—΄ ν‘œκΈ°λ²•μ΄λ‹€.

  • ν…œν”Œλ¦Ώ λ¦¬ν„°λŸ΄μ€ λŸ°νƒ€μž„(runtime) 에 일반 λ¬Έμžμ—΄λ‘œ λ³€ν™˜λ˜μ–΄ 처리되고 λ°±ν‹±(``)을 μ‚¬μš©ν•΄ ν‘œν˜„ν•œλ‹€.

    1. 멀티라인 λ¬Έμžμ—΄(muti-line string)

// 일반 λ¬Έμžμ—΄ λ‚΄μ—μ„œλŠ” μ€„λ°”κΏˆ(κ°œν–‰)이 ν—ˆμš©λ˜μ§€ μ•ŠλŠ”λ‹€.
var str = "Hello
world";
// SyntaxError: Invaild or unexpected token

// #ν•΄κ²°1️⃣: 일반 λ¬Έμžμ—΄ λ‚΄μ—μ„œλŠ” μ΄μŠ€μΌ€μ΄ν”„ μ‹œν€€μŠ€(escape sequence)λ₯Ό μ‚¬μš©ν•΄μ•Ό ν•œλ‹€.
var template = '<ul>\n\t<li><a href="#">Home</a></li>\n</ul>';
console.log(template);
// #ν•΄κ²°2️⃣: 멀티라인 λ¬Έμžμ—΄ μ‚¬μš©πŸ§πŸ§
var template = `<ul>
	<li><a href="#">Home</a></li>
</ul>;
console.log(template);

2. ν‘œν˜„μ‹ μ‚½μž…(expression interpolation)

λ¬Έμžμ—΄μ€ + μ—°μ‚°μžλ₯Ό μ‚¬μš©ν•΄ μ—°κ²°ν•  수 μžˆμ§€λ§Œ, ν‘œν˜„μ‹ μ‚½μž…μ„ 톡해 λ”μš± 가독성 μ’‹κ²Œ μ‘°ν•©ν•  수 μž‡λ‹€.

var first = "KWAK";
var last = "BOSUN";

// ES5: λ¬Έμžμ—΄ μ—°κ²°
console.log("My name is " + last + "-" + first + "."); // My name is BOSUN-KWAK.

// ES6: ν‘œν˜„μ‹ μ‚½μž…
console.log(`My name is ${last}-${first}.`); // My name is BOSUN-KWAK.

λΆˆλ¦¬μ–Έ νƒ€μž…

λΆˆλ¦¬μ–Έ νƒ€μž…μ˜ 값은 논리적 μ°Έ, 거짓을 λ‚˜νƒ€λ‚΄λŠ” true 와 false 뿐이닀.

undefined νƒ€μž…

undefinedλŠ” κ°œλ°œμžκ°€ μ˜λ„μ μœΌλ‘œ ν• λ‹Ήν•˜κΈ° μœ„ν•œ 값이 μ•„λ‹ˆλΌ, μžλ°”μŠ€ν¬λ¦½νŠΈ 엔진이 λ³€μˆ˜λ₯Ό μ΄ˆκΈ°ν™”ν•  λ•Œ μ‚¬μš©ν•˜λŠ” 값이닀.
  • λ³€μˆ˜ μ„ μ–Έ μ‹œ, μžλ°”μŠ€ν¬λ¦½νŠΈ 엔진이 μ•”λ¬΅μ μœΌλ‘œ undefined둜 μ΄ˆκΈ°ν™”ν•œλ‹€.

    • 즉, λ³€μˆ˜ 선언에 μ˜ν•΄ ν™•λ³΄λœ λ©”λͺ¨λ¦¬ 곡간을 처음 할당이 μ΄λ€„μ§ˆ λ•ŒκΉŒμ§€ 빈 μƒνƒœ(garbage κ°’)둜 두지 μ•Šκ³  undefined둜 μ΄ˆκΈ°ν™”ν•œλ‹€.

  • λ§Œμ•½ 아무것도 μ—†λŠ” 빈 값을 μ“°κ³ μ‹Άλ‹€λ©΄, null을 μ‚¬μš©ν•˜λ©΄ λœλ‹€.

null νƒ€μž…

null은 λ³€μˆ˜μ— 값이 μ—†λ‹€λŠ” 것을 μ˜λ„μ μœΌλ‘œ λͺ…μ‹œ(μ˜λ„μ  λΆ€μž¬, intentional absence)ν•  λ•Œ μ‚¬μš©ν•œλ‹€.
  • λ³€μˆ˜μ— null을 ν• λ‹Ή == λ³€μˆ˜κ°€ 이전에 μ°Έμ‘°ν•˜λ˜ 값을 더이상 μ°Έμ‘°ν•˜μ§€ μ•Šκ² λ‹€.

    • μžλ°”μŠ€ν¬λ¦½νŠΈ 엔진은 λˆ„κ΅¬λ„ μ°Έμ‘°ν•˜μ§€ μ•ŠλŠ” λ©”λͺ¨λ¦¬ 곡간에 λŒ€ν•΄ 가비지 μ½œλ ‰μ…˜μ„ μˆ˜ν–‰ν•  것

  • ν•¨μˆ˜κ°€ μœ νš¨ν•œ 값을 λ°˜ν™˜ν•  수 μ—†λŠ” κ²½μš°μ—λ„ λͺ…μ‹œμ μœΌλ‘œ null을 λ°˜ν™˜ν•œλ‹€.

    • HTML μš”μ†Œλ₯Ό 검색해 λ°˜ν™˜ν•˜λŠ” document.querySelectorλ©”μ„œλ“œκ°€ 쑰합에 λΆ€ν•©ν•˜λŠ” HTMLμš”μ†Œλ₯Ό 검색할 수 μ—†λŠ” 경우, μ—λŸ¬ λŒ€μ‹  null λ°˜ν™˜

    <!DOCTYPE html>
    <html>
        <body>
            <script>
                var element = document.querySelector(".myClass");
    
                // HTML λ¬Έμ„œμ— myClass 클래슀λ₯Ό κ°–λŠ” μš”μ†Œκ°€ μ—†λ‹€λ©΄ null을 λ°˜ν™˜
                console.log(element); // null
            </script>
        </body>
    </html>

μ‹¬λ²Œ νƒ€μž…

ES6μ—μ„œ μΆ”κ°€λœ 7번째 νƒ€μž… 으둜, λ³€κ²½ λΆˆκ°€λŠ₯ν•œ(immutable) μ›μ‹œ νƒ€μž… κ°’ , λ‹€λ₯Έ κ°’κ³Ό μ€‘λ³΅λ˜μ§€ μ•ŠλŠ” μœ μΌλ¬΄μ΄ν•œ 값이닀.
  • 주둜 이름과 μΆ©λŒν•  μœ„ν—˜μ΄ μ—†λŠ” 객체의 μœ μΌν•œ ν”„λ‘œνΌν‹° ν‚€λ₯Ό λ§Œλ“€κΈ° μœ„ν•΄ μ‚¬μš©ν•œλ‹€.

  • Symbolν•¨μˆ˜λ₯Ό ν˜ΈμΆœν•΄ μƒμ„±ν•œλ‹€.

  • μƒμ„±λœ μ‹¬λ²Œ 값은 외뢀에 λ…ΈμΆœλ˜μ§€ μ•Šκ³  λ‹€λ₯Έ κ°’κ³Ό μ ˆλŒ€ μ€‘λ³΅λ˜μ§€ μ•ŠλŠ” 유일무이 값이닀.

var key = Symbol("key");
console.log(typeof key); // symbol

// 객체 생성
var obj = {};

// 이름이 μΆ©λŒν•  μœ„ν—˜μ΄ μ—†λŠ” μœ μΌλ¬΄μ΄ν•œ 값인 μ‹¬λ²Œμ„ "ν”„λ‘œνΌν‹° ν‚€"둜 μ‚¬μš©
obj[key] = "value";
console.log(obj[key]); // value

객체 νƒ€μž…

μžλ°”μŠ€ν¬λ¦½νŠΈλŠ” 객체 기반의 언어이며, μžλ°”μŠ€ν¬λ¦½νŠΈλ₯Ό 이루고 μžˆλŠ” 거의 λͺ¨λ“  것이 객체닀.

βœ…6.3 데이터 νƒ€μž…μ˜ ν•„μš”μ„±

1️⃣ 값을 저μž₯ν•  λ•Œ 확보해야 ν•˜λŠ” "λ©”λͺ¨λ¦¬ κ³΅κ°„μ˜ 크기"λ₯Ό κ²°μ •ν•˜κΈ° μœ„ν•΄μ„œ
2️⃣ 값을 참쑰할 λ•Œ ν•œ λ²ˆμ— 읽어 λ“€μ—¬μ•Ό ν•  "λ©”λͺ¨λ¦¬ κ³΅κ°„μ˜ 크기"λ₯Ό κ²°μ •ν•˜κΈ° μœ„ν•΄μ„œ
3️⃣ 메λͺ¨λ¦¬μ—μ„œ 읽어 듀인 "2μ§„μˆ˜λ₯Ό μ–΄λ–»κ²Œ 해석"할지 κ²°μ •ν•˜κΈ° μœ„ν•΄μ„œ
  • μžλ°”μŠ€ν¬λ¦½νŠΈ 엔진은 datatype에 따라 정해진 크기의 λ©”λͺ¨λ¦¬ 곡간을 ν™•λ³΄ν•œλ‹€.

  • λ”°λΌμ„œ, λ³€μˆ˜μ— ν• λ‹Ήλ˜λŠ” κ°’μ˜ datatype에 따라 확보해야 ν•  λ©”λͺ¨λ¦¬ κ³΅κ°„μ˜ 크기가 κ²°μ •λœλ‹€.

  • "λ©”λͺ¨λ¦¬ κ³΅κ°„μ˜ 크기" = λ©”λͺ¨λ¦¬ μ…€μ˜ 개수(byte 수)

βœ…6.4 동적 타이핑

동적 νƒ€μž… μ–Έμ–΄

μžλ°”μŠ€ν¬λ¦½νŠΈμ˜ λ³€μˆ˜λŠ” 선언이 μ•„λ‹Œ **할당에 μ˜ν•΄ νƒ€μž…μ΄ κ²°μ •(νƒ€μž… μΆ”λ‘ . type inference)**λœλ‹€. 그리고 **μž¬ν• λ‹Ή**에 μ˜ν•΄ λ³€μˆ˜μ˜ νƒ€μž…μ€ μ–Έμ œλ“ μ§€ λ™μ μœΌλ‘œ λ³€ν•  수 μžˆλ‹€(**동적 타이핑 dynamic typing)**.
  • ν˜„μž¬ λ³€μˆ˜μ— ν• λ‹Ήλ˜μ–΄ μžˆλŠ” 값에 μ˜ν•΄ λ³€μˆ˜μ˜ νƒ€μž…μ΄ λ™μ μœΌλ‘œ κ²°μ •λœλ‹€.

  • var, const, let ν‚€μ›Œλ“œλ₯Ό μ‚¬μš©ν•΄μ„œ λ³€μˆ˜λ₯Ό μ„ μ–Έν•˜λŠ” 것일 뿐, μ‹€μ§ˆμ μΈ κ°’μ˜ νƒ€μž…μ€ λŸ°νƒ€μž„(runtime)μ‹œ ν• λ‹Ήλ˜λŠ” 값에 μ˜ν•΄ κ²°μ •λœλ‹€.

  • λ°˜λ©΄μ—, 정적 νƒ€μž… μ–Έμ–΄(C, Java λ“±)λŠ” λ³€μˆ˜ μ„ μ–Έ μ‹œμ μ— νƒ€μž…μ΄ κ²°μ •λ˜κ³  λ³€μˆ˜μ˜ νƒ€μž…μ„ λ³€κ²½ν•  수 μ—†λ‹€ . 그리고 컴파일 μ‹œμ μ— νƒ€μž… 체크(μ„ μ–Έν•œ 데이터 νƒ€μž…μ— λ§žλŠ” 값을 ν• λ‹Ήν–ˆλŠ”μ§€ κ²€μ‚¬ν•˜λŠ” 처리)λ₯Ό μˆ˜ν–‰ν•œλ‹€.

var foo;
console.log(typeof foo); // undefined

foo = 3;
console.log(typeof foo); // numbaer

동적 νƒ€μž… μ–Έμ–΄μ˜ 단점

동적 νƒ€μž… μ–Έμ–΄λŠ” μœ μ—°μ„±(flexibility) 은 λ†’μ§€λ§Œ μ‹ λ’°μ„±(reliability) 은 떨어진닀.
  • λ³΅μž‘ν•œ ν”„λ‘œκ·Έλž¨μ—μ„œλŠ” λ³€ν™”ν•˜λŠ” λ³€μˆ˜ 값을 μΆ”μ ν•˜κΈ° μ–΄λ €μšΈ 수 μžˆλ‹€.

  • κ°’μ˜ 변경에 μ˜ν•΄ νƒ€μž…λ„ μ–Έμ œλ“ μ§€ 변경될 수 μžˆλ‹€. β†’ 값을 ν™•μΈν•˜κΈ° μ „μ—λŠ” νƒ€μž…μ„ ν™•μ‹ ν•  수 μ—†λ‹€.

  • 개발자의 μ˜λ„μ™€λŠ” 상관없이 μžλ°”μŠ€ν¬λ¦½νŠΈ 엔진에 μ˜ν•΄ μ•”λ¬΅μ μœΌλ‘œ νƒ€μž…μ΄ μžλ™μœΌλ‘œ λ³€ν™˜λ˜κΈ°λ„ ν•œλ‹€.

πŸ’‘λ³€μˆ˜λ₯Ό μ‚¬μš©ν•  λ•Œ μ£Όμ˜ν•  사항

1️⃣. λ³€μˆ˜λŠ”Β κΌ­ ν•„μš”ν•  κ²½μš°μ— ν•œν•΄ μ œν•œμ μœΌλ‘œ μ‚¬μš©ν•  것.

2️⃣. λ³€μˆ˜μ˜ μœ νš¨λ²”μœ„(μŠ€μ½”ν”„, scope)λŠ” μ΅œλŒ€ν•œ 쒁게 λ§Œλ“€μ–΄ λ³€μˆ˜μ˜ λΆ€μž‘μš©μ„ μ–΅μ œν•  것.

3️⃣. μ „μ—­ λ³€μˆ˜λŠ” μ΅œλŒ€ν•œ μ‚¬μš©μ„ ν”Όν•  것.
β†’ μ „μ—­ λ³€μˆ˜λŠ” ν”„λ‘œκ·Έλž¨μ˜ λ³΅μž‘μ„±μ„ μ¦κ°€μ‹œν‚€κ³ , 처리 흐름을 μΆ”μ ν•˜κΈ° μ–΄λ ΅κ²Œ λ§Œλ“€κ³ , 였λ₯˜κ°€ λ°œμƒν•  경우 원인을 νŠΉμ •ν•˜κΈ° μ–΄λ ΅κ²Œ λ§Œλ“€κΈ° λ•Œλ¬Έ

4️⃣. λ³€μˆ˜λ³΄λ‹€ μƒμˆ˜λ₯Ό μ‚¬μš©ν•΄ κ°’μ˜ 변경을 μ–΅μ œν•  것.

5️⃣. λ³€μˆ˜ 이름은 λ³€μˆ˜μ˜ λͺ©μ μ΄λ‚˜ 의미λ₯Ό νŒŒμ•…ν•  수 μžˆλ„λ‘ 넀이밍할 것.
β†’ μ˜λ„κ°€ λͺ…ν™•ν•œ 넀이밍은 μ½”λ“œλ₯Ό μ΄ν•΄ν•˜κΈ° μ‰½κ²Œ λ§Œλ“€κ³ , μ΄λŠ” ν˜‘μ—…κ³Ό 생산성 ν–₯상에 도움을 μ€€λ‹€.

Last updated