λ³Έλ¬Έ λ°”λ‘œκ°€κΈ°

Frontend Dev/JavaScript

μžλ°”μŠ€ν¬λ¦½νŠΈμ˜ μžλ£Œν˜• (data type)

λ°˜μ‘ν˜•

πŸ‘Ύ νƒ€μž…(data type, μžλ£Œν˜•) μ΄λž€?

 Cλ‚˜ Java와 같은 μ–Έμ–΄λŠ” 정적 νƒ€μž…(static type) μ–Έμ–΄λ‘œ λ³€μˆ˜ μ„ μ–Έ μ‹œ λ³€μˆ˜μ— μ €μž₯ν•  κ°’μ˜ μ’…λ₯˜λ₯Ό 사전에 νƒ€μž… 지정(Type annotation)ν•˜μ—¬μ•Ό ν•œλ‹€. 반면 μžλ°”μŠ€ν¬λ¦½νŠΈλŠ” λ³€μˆ˜μ˜ νƒ€μž… 지정 없이 값이 ν• λ‹Ήλ˜λŠ” κ³Όμ •μ—μ„œ μžλ™μœΌλ‘œ νƒ€μž…μ΄ κ²°μ •λ˜λŠ” ‘동적 νƒ€μž…(dynamic type)’ 언어이닀.

 λ³€μˆ˜ μ„ μ–Έμ‹œ λ©”λͺ¨λ¦¬μ— 값을 μ €μž₯ν•˜κΈ° μœ„ν•΄μ„œλŠ” λ¨Όμ € λ©”λͺ¨λ¦¬ 곡간을 확보해야 ν•  λ©”λͺ¨λ¦¬μ˜ 크기(byte)λ₯Ό μ•Œμ•„μ•Όν•œλ‹€. μ΄λŠ” κ°’μ˜ μ’…λ₯˜μ— 따라 확보해야 ν•  λ©”λͺ¨λ¦¬μ˜ 크기가 λ‹€λ₯΄κΈ° λ•Œλ¬Έμ΄λ‹€. μ΄λ•Œ κ°’μ˜ μ’…λ₯˜, 즉 λ°μ΄ν„°μ˜ μ’…λ₯˜λ₯Ό 데이터 νƒ€μž…(data type)이라 ν•œλ‹€.

 

 → κΈ°λ³Έ νƒ€μž…μ€ 크게 μ›μ‹œ νƒ€μž…κ³Ό 객체 νƒ€μž„μœΌλ‘œ ꡬ뢄할 수 μžˆλ‹€.

 → 각 νƒ€μž…μ€ κ³ μœ ν•œ 속성과 λ©”μ„œλ“œλ₯Ό 가진닀.

 

πŸ“Œ μ›μ‹œ νƒ€μž…(primitive type)

stringnumberbigintbooleanundefinedsymbolnull

 

πŸ“Œ 객체 νƒ€μž…(object/reference type)

μ›μ‹œ νƒ€μž…μ΄ μ•„λ‹Œ λͺ¨λ“  μžλ£Œν˜•μ€ κ°μ²΄νƒ€μž…μœΌλ‘œ reference type 이라고도 ν•˜κ³ , array, object, function을 ν¬ν•¨ν•œλ‹€.

object

 

 

πŸ‘Ύ μ›μ‹œνƒ€μž… (primitive type)

number (μˆ«μžν˜•)

 μˆ«μžλ₯Ό ν‘œν˜„ν•˜κΈ° μœ„ν•œ 데이터 νƒ€μž…μœΌλ‘œ μ •μˆ˜(integer)와 μ‹€μˆ˜(float)λ₯Ό λͺ¨λ‘ ν‘œν˜„ν•  수 μžˆλ‹€.

let num = 123;

 

 μˆ«μžν˜•μ—” 일반적인 숫자 외에 Infinity-InfinityNaN같은 '특수 숫자 κ°’(special numeric value)'이 ν¬ν•¨λœλ‹€.

console.log(10 / 0) // Infinity 
console.log(10 / -0); // -Infinity
console.log("not a number" / 2); // NaN

 • InfinityλŠ” μ–΄λ–€ μˆ«μžλ³΄λ‹€ 더 큰 특수 κ°’, λ¬΄ν•œλŒ€(∞)λ₯Ό λ‚˜νƒ€λ‚Έλ‹€.

 • NaN(Not A Number)은 계산 쀑에 μ—λŸ¬κ°€ λ°œμƒν–ˆλ‹€λŠ” 것을 λ‚˜νƒ€λ‚΄μ£ΌλŠ” 값이닀. λΆ€μ •ν™•ν•˜κ±°λ‚˜ μ •μ˜λ˜μ§€ μ•Šμ€ μˆ˜ν•™ 연산을 μ‚¬μš©ν•˜λ©΄ 계산 쀑에 μ—λŸ¬κ°€ λ°œμƒν•˜λŠ”λ°, μ΄λ•Œ NaN이 λ°˜ν™˜λœλ‹€. μ—°μ‚° κ³Όμ • μ–΄λ”˜κ°€μ—μ„œ NaN이 λ°˜ν™˜λ˜μ—ˆλ‹€λ©΄, μ΄λŠ” λͺ¨λ“  결과에 영ν–₯을 λ―ΈμΉœλ‹€.

 

BigInt

 λ‚΄λΆ€ ν‘œν˜„ 방식 λ•Œλ¬Έμ— μžλ°”μŠ€ν¬λ¦½νŠΈμ—μ„   253 - 1(9007199254740991) 보닀 큰 κ°’ ν˜Ήμ€ -(253 - 1) 보닀 μž‘μ€ μ •μˆ˜λŠ” 'μˆ«μžν˜•’을 μ‚¬μš©ν•΄ λ‚˜νƒ€λ‚Ό 수 μ—†μœΌλ©°, μ•„μ£Ό 큰 μˆ«μžκ°€ ν•„μš”ν•œ μƒν™©μ΄κ±°λ‚˜ μ•„μ£Ό 높은 μ •λ°€λ„λ‘œ μž‘μ—…μ„ ν•΄μ•Ό ν•  λ•Œ BigIntλ₯Ό μ‚¬μš©ν•œλ‹€.

 BigIntν˜•μ€ ν‘œμ€€μœΌλ‘œ μ±„νƒλœ 지 μ–Όλ§ˆ μ•ˆ 된 μžλ£Œν˜•μœΌλ‘œ, 길이에 상관없이 μ •μˆ˜λ₯Ό λ‚˜νƒ€λ‚Ό 수 μžˆλ‹€.

 

 BigIntν˜• 값은 μ •μˆ˜ λ¦¬ν„°λŸ΄ 끝에 n을 λΆ™μ—¬ λ§Œλ“ λ‹€.

const bigInt = 1234567890123456789012345678901234567890n;

 

String (λ¬Έμžν˜•)

 λΉˆ λ¬Έμžμ—΄μ΄λ‚˜ κΈ€μžλ“€λ‘œ 이루어진 ν…μŠ€νŠΈ 데이터λ₯Ό λ‚˜νƒ€λ‚΄λŠ” 데이터 νƒ€μž…μœΌλ‘œ μž‘μ€ λ”°μ˜΄ν‘œ(’), 큰 λ”°μ˜΄ν‘œ(”), λ°±ν‹±(`)으둜 κ°μ‹Έμ„œ λ‚˜νƒ€λ‚Έλ‹€.

let str = "Hello"; // 큰 λ”°μ˜΄ν‘œ
str = 'Hello'; // μž‘μ€ λ”°μ˜΄ν‘œ
str = `Hello`; // λ°±ν‹±

 

 • λ°±ν‹±(backtick)으둜 λ³€μˆ˜λ‚˜ ν‘œν˜„μ‹μ„ 감싼 ν›„ ${...} μ•ˆμ— λ„£μ–΄μ£Όλ©΄, μ›ν•˜λŠ” λ³€μˆ˜λ‚˜ ν‘œν˜„μ‹μ„ λ¬Έμžμ—΄ 쀑간에 넣을 수 μžˆλ‹€.

let name = "Helen";

// λ³€μˆ˜λ₯Ό λ¬Έμžμ—΄ 쀑간에 μ‚½μž…
console.log(`Hello, ${name}`); // Hello, Helen

// ν‘œν˜„μ‹μ„ λ¬Έμžμ—΄ 쀑간에 μ‚½μž…
console.log(`the reselt is ${1 + 2}`); // the reselt is 3

 

Boolean (λΆˆλ¦¬μ–Έ)

 λ…Όλ¦¬μ  μ°Έ, 거짓을 λ‚˜νƒ€λ‚΄λŠ” true와 false둜 λ‚˜νƒ€λ‚Ό 수 있으며, λΆˆλ¦¬μ–Έ νƒ€μž…μ˜ 값은 μ°Έκ³Ό κ±°μ§“μœΌλ‘œ κ΅¬λΆ„λ˜λŠ” 쑰건에 μ˜ν•΄ ν”„λ‘œκ·Έλž¨μ˜ 흐름을 μ œμ–΄ν•˜λŠ” μ‘°κ±΄λ¬Έμ—μ„œ 자주 μ‚¬μš©ν•œλ‹€.

let isChecked = true;
let isAdult = false;
let passed = 7 > 1;
console.log(passed) // true;

 → λΆˆλ¦°κ°’μ€ 비ꡐ κ²°κ³Όλ₯Ό μ €μž₯ν•  λ•Œλ„ μ‚¬μš©λœλ‹€.

 

 • Boolean이 false인 경우 : 0nullundefiend빈 λ¬Έμžμ—΄(’’)NaN

Boolean(0)    // false
Boolean('0')  // true

Boolean('')   // false
Boolean(' ')  // true

 

Symbol (심볼)

 μ‹¬λ³Όμ€ ES6μ—μ„œ μƒˆλ‘­κ²Œ μΆ”κ°€λœ νƒ€μž…μœΌλ‘œ λ³€κ²½ λΆˆκ°€λŠ₯ν•œ μ›μ‹œ νƒ€μž…μ˜ 값이닀. 심볼은 주둜 μ΄λ¦„μ˜ 좩돌 μœ„ν—˜μ΄ μ—†λŠ” μœ μΌν•œ 객체의 ν”„λ‘œνΌν‹° ν‚€(property key)λ₯Ό λ§Œλ“€κΈ° μœ„ν•΄ μ‚¬μš©ν•œλ‹€. 심볼은 Symbol ν•¨μˆ˜λ₯Ό ν˜ΈμΆœν•΄ μƒμ„±ν•œλ‹€. μ΄λ•Œ μƒμ„±λœ 심볼 값은 λ‹€λ₯Έ 심볼 κ°’λ“€κ³Ό λ‹€λ₯Έ μœ μΌν•œ 심볼 값이닀.

let sym = Symbol("key");

console.log(sym) // Symbol(key)
console.log(typeof sym) // symbol

 

null

 null은 μ˜λ„μ μœΌλ‘œ λ³€μˆ˜μ— 값이 μ—†λ‹€λŠ” 것을 λͺ…μ‹œν•  λ•Œ μ‚¬μš©ν•œλ‹€.

 μ΄λŠ” λ³€μˆ˜κ°€ κΈ°μ–΅ν•˜λŠ” λ©”λͺ¨λ¦¬ μ–΄λ“œλ ˆμŠ€μ˜ μ°Έμ‘° 정보λ₯Ό μ œκ±°ν•˜λŠ” 것을 μ˜λ―Έν•˜λ©° μžλ°”μŠ€ν¬λ¦½νŠΈ 엔진은 λˆ„κ΅¬λ„ μ°Έμ‘°ν•˜μ§€ μ•ŠλŠ” λ©”λͺ¨λ¦¬ μ˜μ—­μ— λŒ€ν•΄ 가비지 μ½œλ ‰μ…˜μ„ μˆ˜ν–‰ν•  것이닀.

let result = null;

 → resultλ₯Ό μ•Œ 수 μ—†κ±°λ‚˜, κ·Έ 값이 λΉ„μ–΄μžˆμŒμ„ λ‚˜νƒ€λ‚Έλ‹€.

 

 • ν•¨μˆ˜κ°€ ν˜ΈμΆœλ˜μ—ˆμœΌλ‚˜ μœ νš¨ν•œ 값을 λ°˜ν™˜ν•  수 μ—†λŠ” 경우, λͺ…μ‹œμ μœΌλ‘œ null을 λ°˜ν™˜ν•˜κΈ°λ„ ν•œλ‹€.

let element = document.querySelector('.myElem');
console.log(element); // null

 → HTML λ¬Έμ„œμ— myElem 클래슀λ₯Ό κ°–λŠ” μš”μ†Œκ°€ μ—†λ‹€λ©΄ null을 λ°˜ν™˜ν•œλ‹€.

 

 • null κ°’μ˜ μžλ£Œν˜•μ€ object둜 μ΄λŠ” μžλ°”μŠ€ν¬λ¦½νŠΈ μ„€κ³„μƒμ˜ 였λ₯˜μ΄λ©°, null νƒ€μž…μ„ 확인할 λ•ŒλŠ” typeof μ—°μ‚°μžκ°€ μ•„λ‹Œ 일치 μ—°μ‚°μž(===)λ₯Ό μ‚¬μš©ν•΄μ•Ό ν•œλ‹€.

typeof null // object

let age = null;
console.log(age === null); // true

 

undefined

 undefinedλŠ” 값이 ν• λ‹Ήλ˜μ§€ μ•Šμ€ μƒνƒœλ₯Ό λ‚˜νƒ€λ‚Ό λ•Œ μ‚¬μš©ν•˜λ©°, λ³€μˆ˜λŠ” μ„ μ–Έν–ˆμ§€λ§Œ 값을 ν• λ‹Ήν•˜μ§€ μ•Šμ•˜λ‹€λ©΄ ν•΄λ‹Ή λ³€μˆ˜μ— undefinedκ°€ μžλ™μœΌλ‘œ ν• λ‹Ήλœλ‹€. 즉, 선언은 λ˜μ—ˆμ§€λ§Œ 값을 ν• λ‹Ήν•˜μ§€ μ•Šμ€ λ³€μˆ˜μ— μ ‘κ·Όν•˜κ±°λ‚˜ μ‘΄μž¬ν•˜μ§€ μ•ŠλŠ” 객체 ν”„λ‘œνΌν‹°μ— μ ‘κ·Όν•  경우 undefinedκ°€ λ°˜ν™˜λœλ‹€.

let storage;

console.log(storage); // undefined

 

 • κ°œλ°œμžκ°€ λ³€μˆ˜μ— undefinedλ₯Ό λͺ…μ‹œμ μœΌλ‘œ ν• λ‹Ήν•˜λŠ” 것도 κ°€λŠ₯ν•˜κΈ΄ ν•˜λ‹€.

let age = 100;
age = undefined;

 → ν•˜μ§€λ§Œ μ΄λ ‡κ²Œ undefinedλ₯Ό 직접 ν• λ‹Ήν•˜λŠ” κ±Έ ꢌμž₯ν•˜μ§„ μ•ŠλŠ”λ‹€. undefinedλŠ” 값이 ν• λ‹Ήλ˜μ§€ μ•Šμ€ λ³€μˆ˜μ˜ μ΄ˆκΈ°ν™”μ— μ‚¬μš©ν•˜λŠ” κ°’μ΄λ―€λ‘œ, λ³€μˆ˜κ°€ ‘λΉ„μ–΄μžˆκ±°λ‚˜’ ‘μ•Œ 수 μ—†λŠ”’ μƒνƒœλΌλŠ” κ±Έ λ‚˜νƒ€λ‚΄λ €λ©΄ null을 ν• λ‹Ήν•˜λŠ” 것을 ꢌμž₯ν•œλ‹€.

 

 • nullκ³Ό undefinedλŠ” 동등 μ—°μ‚°μž(==)와 일치 μ—°μ‚°μž(===)둜 비ꡐ할 λ•Œ κ·Έ 결과값이 λ‹€λ₯΄λ‹€.

null == undefined;   // true
null === undefined;  // false

 

πŸ‘€β—οΈμ°Έκ³  μžλ°”μŠ€ν¬λ¦½νŠΈμ—μ„œ 자주 λ³΄λŠ” κ²°κ³Όλ“€λ‘œ undefined와 null이 μžˆλ‹€. undefinedλŠ” '값을 ν• λ‹Ήν•˜μ§€ μ•Šμ€ κ²°κ³Ό'이고, null은 '무언가λ₯Ό μ°Ύμ§€λ§Œ 아무것도 μ—†μŒμ„ μ „λ‹¬ν•œ κ°’'이닀. λ”°λΌμ„œ λ§Œμ•½ console.logλ₯Ό μ‚¬μš©ν•΄ λ³€μˆ˜λ₯Ό ν™•μΈν–ˆλŠ”λ°, undefinedκ°€ λœ¬λ‹€λ©΄ 값이 ν• λ‹Ήλ˜μ§€ μ•Šμ€ μƒνƒœ (let x;) λΌλŠ” 의미이고, null은 ν•΄λ‹Ή κ²°κ³Όκ°€ μ—†μŒ(let x = null;) 을 μ˜λ―Έν•œλ‹€.

 

 

πŸ‘Ύ 객체 νƒ€μž… (object/reference type)

 κ°μ²΄λŠ” 데이터와 κ·Έ 데이터에 κ΄€λ ¨ν•œ λ™μž‘(절차, 방법, κΈ°λŠ₯)을 λͺ¨λ‘ 포함할 수 μžˆλŠ” κ°œλ…μ  μ‘΄μž¬μ΄λ‹€. 달리 말해, 이름과 값을 κ°€μ§€λŠ” 데이터λ₯Ό μ˜λ―Έν•˜λŠ” ν”„λ‘œνΌν‹°(property)와 λ™μž‘μ„ μ˜λ―Έν•˜λŠ” λ©”μ†Œλ“œ(method)λ₯Ό 포함할 수 μžˆλŠ” 독립적 주체이닀.

 μžλ°”μŠ€ν¬λ¦½νŠΈλŠ” 객체(object) 기반의 슀크립트 μ–Έμ–΄λ‘œμ„œ μžλ°”μŠ€ν¬λ¦½νŠΈλ₯Ό 이루고 μžˆλŠ” 거의 “λͺ¨λ“  것”이 객체이닀. μ›μ‹œ νƒ€μž…(Primitives)을 μ œμ™Έν•œ λ‚˜λ¨Έμ§€ κ°’λ“€(λ°°μ—΄, ν•¨μˆ˜, μ •κ·œν‘œν˜„μ‹ λ“±)은 λͺ¨λ‘ 객체이닀. λ˜ν•œ κ°μ²΄λŠ” pass-by-reference(참쑰에 μ˜ν•œ 전달) λ°©μ‹μœΌλ‘œ μ „λ‹¬λœλ‹€.

 

 

πŸ‘Ύ typeof μ—°μ‚°μž

 ν”Όμ—°μ‚°μžμ˜ μžλ£Œν˜•μ„ λ°˜ν™˜ν•˜λ©°, μžλ£Œν˜•μ— 따라 처리 방식을 λ‹€λ₯΄κ²Œ ν•˜κ³  μ‹Άκ±°λ‚˜ λ³€μˆ˜μ˜ μžλ£Œν˜•μ„ μ•Œμ•„λ‚΄κ³ μž ν•  λ•Œ μ‚¬μš©ν•œλ‹€.

typeof 1  // number
typeof NaN  // number
typeof 10n  // bigint
typeof "stirng"  // string
typeof true  // boolean

typeof undefined  // undefined
typeof null  // object

typeof Symbol("id")  // symbol

typeof Math // object
typeof new Date()  // object
typeof console.log  // function

null null은 λ³„λ„μ˜ κ³ μœ ν•œ μžλ£Œν˜•μ„ κ°€μ§€λŠ” 특수 κ°’μœΌλ‘œ κ°μ²΄λŠ” μ•„λ‹ˆμ§€λ§Œ, ν•˜μœ„ ν˜Έν™˜μ„±μ„ μœ μ§€ν•˜κΈ° μœ„ν•΄ 이런 였λ₯˜λ₯Ό μˆ˜μ •ν•˜μ§€ μ•Šκ³  λ‚¨κ²¨λ‘μ—ˆλ‹€. (μ–Έμ–΄ 자체의 였λ₯˜λ‘œ null은 객체가 μ•„λ‹˜)

Math μˆ˜ν•™ 연산을 μ œκ³΅ν•˜λŠ” λ‚΄μž₯ 객체. λ‚΄μž₯ κ°μ²΄λŠ” κ°μ²΄ν˜•μ΄λ‹€.

console.log ν•¨μˆ˜λŠ” function을 λ°˜ν™˜ν•œλ‹€. ν•¨μˆ˜λŠ” κ°μ²΄ν˜•μ— μ†ν•˜λ©°, ν•¨μˆ˜κ°€ μ•„λ‹Œ κ°μ²΄ν˜•μ€ λͺ¨λ‘ objectλ₯Ό λ°˜ν™˜ν•œλ‹€.

 


자료좜처: JAVASCRIPT.INFO

✏️ κ³΅λΆ€ν•˜λ©° μ •λ¦¬ν•œ λ‚΄μš©μž…λ‹ˆλ‹€. 잘λͺ»λœ μ •λ³΄λ‚˜ 더 κ³΅μœ ν•  λ‚΄μš©μ΄ 있으면 λŒ“κΈ€λ‘œ μ•Œλ €μ£Όμ„Έμš”!

μ½μ–΄μ£Όμ…”μ„œ κ°μ‚¬ν•©λ‹ˆλ‹€ 😊

λ°˜μ‘ν˜•