데이터 νƒ€μž…

Variable

μ–΄ν”Œλ¦¬μΌ€μ΄μ…˜μ„ μ‹€ν–‰ν•˜κ²Œ 되면, μ–΄ν”Œλ¦¬μΌ€μ΄μ…˜λ§ˆλ‹€ μ“Έ 수 μžˆλŠ” λ©”λͺ¨λ¦¬κ°€ ν• λ‹Ήλœλ‹€. 이 λ©”λͺ¨λ¦¬λŠ” ν……ν…… 빈 λ°•μŠ€λ“€μΈλ°, μ–΄ν”Œλ¦¬μΌ€μ΄μ…˜λ§ˆλ‹€ κ·Έ λ°•μŠ€μ˜ κ°―μˆ˜κ°€ μ œν•œμ μœΌλ‘œ ν• λ‹Ήλœλ‹€. let name μ΄λΌλŠ” ν‚€μ›Œλ“œλ‘œ λ³€μˆ˜λ₯Ό μ •μ˜ν•˜λ©΄, ν•œκ°€μ§€μ˜ λ°•μŠ€λ₯Ό 가리킬 수 μžˆλŠ” 포인터가 생긴닀 nameμ΄λΌλŠ” λ³€μˆ˜κ°€ 가리킀고 μžˆλŠ” μ–΄λ”˜κ°€μ— JeenieλΌλŠ” 값을 μ €μž₯ν•  수 있음 좔후에 가리킀고 μžˆλŠ” 곳에 λ‹€λ₯Έκ°’을 λ„£μ–΄ μ €μž₯ν•  수 있음

Block scope와 Global scope

block scope

{Β  } μ΄λ ‡κ²Œ λΈ”λŸ­ μ•ˆμ—μ„œ μ„ μ–Έλœ λ³€μˆ˜λ“€. λΈ”λŸ­ μ•ˆμ—μ„œ μ„ μ–Έλœ 이 nameμ΄λΌλŠ” λ³€μˆ˜λ₯Ό λ°–μ—μ„œ μ ‘κ·Όν•˜κ²Œ 되면 아무값도 λ‚˜μ˜€μ§€μ•ŠμŒ

  • λΈ”λŸ­ λ°–μ—μ„œλŠ” μ ‘κ·Όν•  수 μ—†λ‹€!

global scope

{ } λΈ”λŸ­μ„ 쓰지 μ•Šκ³  파일 μ•ˆμ— λ°”λ‘œ μ •μ˜ν•΄μ„œ μ“°λŠ” λ³€μˆ˜λ“€.

  • λΈ”λŸ­ λ°–μ—μ„œλ„ μ ‘κ·Ό κ°€λŠ₯ν•˜κ³ , λΈ”λŸ­ μ•ˆμ—μ„œλ„ μ ‘κ·Ό κ°€λŠ₯ν•˜λ‹€

=> global λ³€μˆ˜λŠ” μ–΄ν”Œλ¦¬μΌ€μ΄μ…˜ μ‹€ν–‰λœ μˆœκ°„λΆ€ν„° λκΉŒμ§€ 항상 λ©”λͺ¨λ¦¬μ— νƒ‘μž¬λ˜μ–΄ 있기 λ•Œλ¬Έμ—, μ΅œμ†Œν•œμœΌλ‘œ μ“Έ 것. κ°€λŠ₯ν•˜λ©΄ classλ‚˜ ν•¨μˆ˜, ifλ‚˜ for 루프 λ“± ν•„μš”ν•œ λΆ€λΆ„μ—μ„œλ§Œ μ •μ˜ν•΄μ„œ μ“°λŠ” 것이 μ’‹λ‹€.

let

let은 es6에 좔가됨. mutable data type

  • varλŠ” 쓰지 말 것! μ“°λ©΄ μ•ˆλ˜λŠ” 이유
    1. λŒ€λΆ€λΆ„ ν”„λ‘œκ·Έλž˜λ° μ–Έμ–΄μ—μ„œλŠ” λ³€μˆ˜λ₯Ό μ„ μ–Έν•œ 후에 값을 할당함 ν•˜μ§€λ§Œ JS varμ—μ„œλŠ” 선언도 ν•˜κΈ°μ „μ— 값을 ν• λ‹Ήν•  수 있음(λ―ΈμΉœν–‰λ™) 이것을 var hoisting 이라고 함 (hoistingμ΄λž€? 어디에 μ„ μ–Έν–ˆλŠλƒμ— 상관없이 제일 μœ„λ‘œ λŒμ–΄μ˜¬λ €μ£ΌλŠ” 것을 말함)
    2. varλŠ” block scope을 μ² μ €ν•˜κ²Œ λ¬΄μ‹œν•œλ‹€! block scope μ•ˆμ—μ„œ var둜 μ„ μ–Έν•œ λ³€μˆ˜μΈλ° λ°–μ—μ„œ 호좜이 κ°€λŠ₯함. (아무리 κΉŠμ€ 곳에 선언을 ν•œλ‹€κ³  해도 μ–΄λ””μ—μ„œλ‚˜ ν˜ΈμΆœν•  μˆ˜κ°€ μžˆμ–΄μ„œ, 규λͺ¨κ°€ 큰 ν”„λ‘œμ νŠΈμ—μ„œ μ„ μ–Έν•˜μ§€λ„ μ•Šμ€ 값듀이 ν• λ‹Ήλ˜μ–΄μ„œ μ˜€κΈ°λ„ 함.)

=> μ΄λŸ¬ν•œ μœ„ν—˜μ„± λ•Œλ¬Έμ— var λŒ€μ‹  let을 써야함!

constants

es6μ—μ„œ 좔가됨. immutable data type
값을 ν•œλ²ˆ ν• λ‹Ήν•˜λ©΄ μ ˆλŒ€ λ°”λ€Œμ§€ μ•ŠμŒ.
기쑴의 λ³€μˆ˜λ₯Ό μ΄μš©ν•˜λ©΄, λ©”λͺ¨λ¦¬ μ–΄λ”˜κ°€μ— ν• λ‹Ήλœ λ°•μŠ€λ₯Ό 가리킀고 μžˆμ–΄μ„œ 포인터λ₯Ό μ΄μš©ν•΄ 값을 계속 λ°”κΏ”λ‚˜κ°ˆ 수 μžˆμ§€λ§Œ
λ°”λ‘œ 이 constantsλŠ” 값을 κ°€λ¦¬ν‚€λŠ” 포인터가 μž κ²¨μžˆλ‹€. ν•œλ²ˆ μ„ μ–Έκ³Ό λ™μ‹œμ— ν• λ‹Ήν•œ λ’€λ‘œλŠ” μ ˆλŒ€ 값을 λ³€κ²½ν•  수 μ—†μŒ
favor immutable data type always
μ›¬λ§Œν•˜λ©΄ ν•œλ²ˆ ν• λ‹Ήν•œ λ’€μ—λŠ” 값이 λ³€κ²½λ˜μ§€ μ•ŠλŠ” 그런 λ°μ΄ν„°νƒ€μž…μ— μ‚¬μš©ν•΄λΌ 이유?
  1. μ•ˆμ „μ„±
  2. thread safety μ–΄ν”Œλ¦¬μΌ€μ΄μ…˜μ΄ μ‹€ν–‰λ˜λ©΄ ν•œκ°€μ§€ ν”„λ‘œμ„ΈμŠ€κ°€ ν• λ‹Ήλ˜κ³  κ·Έ ν”„λ‘œμ„ΈμŠ€ μ•ˆμ—μ„œλŠ” λ‹€μ–‘ν•œ threadκ°€ λ™μ‹œμ— λŒμ•„κ°€λ©΄μ„œ μ’€ 더 λΉ λ₯΄κ³  효율적으둜 λ™μž‘ν•  수 μžˆλ„λ‘ 도와쀀닀. λ‹€μ–‘ν•œ thread듀이 λ™μ‹œμ— λ³€μˆ˜μ— 접근을 ν•΄μ„œ 값을 λ³€κ²½ν•  수 μžˆλŠ”λ°, λ™μ‹œμ— 값을 λ³€κ²½ν•œλ‹€λŠ” 것은 μœ„ν—˜ν•˜λ‹€. κ·Έλž˜μ„œ κ°€λŠ₯ν•˜λ©΄ μ΄λ ‡κ²Œ 값이 λ³€ν•˜μ§€ μ•ŠλŠ” λ³€μˆ˜λ₯Ό μ‚¬μš©ν•˜λŠ” 것이 μ’‹λ‹€.(μ•žμœΌλ‘œ λ³€κ²½ν•΄μ•Όν•  쒋은 μ΄μœ κ°€ μ—†λ‹€λ©΄) μ½”λ“œλ³€κ²½μ‹œλ‚˜ 타인이 μ½”λ“œλ³€κ²½μ‹œμ—λ„ μ‹€μˆ˜λ₯Ό 방지할 수 μžˆλ‹€.

λ°”μ΄λŸ¬μŠ€κ°€ mutation을 ν†΅ν•΄μ„œ 계속 μœ μ „μžμ˜ μ„œμ—΄μ„ λ°”κΏ”λ‚˜κ°€λ“―μ΄, λ°μ΄ν„°μ˜ νƒ€μž…μ—λ„ λ³€κ²½κ°€λŠ₯ν•œ mutableκ³Ό λ³€κ²½λΆˆκ°€λŠ₯ν•œ immutable이 μžˆλ‹€.

Note !
Immutable data types λ³€κ²½λΆˆκ°€
primitive types, frozen objects Mutable data types λ³€κ²½κ°€λŠ₯
all objects by defult are mutable in JS JSμ—μ„œ arrayλŠ” mutable data type이닀

variable types

primitive type 더이상 μž‘μ€ λ‹¨μœ„λ‘œ λ‚˜λˆ μ§ˆ 수 μ—†λŠ” ν•˜λ‚˜μ˜ μ•„μ΄ν…œ

number, boolean, null, undefined, simbol

number

c언어와 javaλŠ” number에 μ–Όλ§ˆλ‚˜ 큰 데이터λ₯Ό μ €μž₯ν•˜λŠ”μ§€ μ„ μ–Έν•΄μ•Όν•˜μ§€λ§Œ JSλŠ” κ·ΈλŸ΄ν•„μš” μ—†μŒ JSμ—μ„œλŠ” integer와 decimal number 상관없이 νƒ€μž…μ€ number

const infinity = 1 / 0;
// positiveν•œ value의 값을 0으둜 λ‚˜λˆ„λ©΄ λ¬΄ν•œλŒ€
const negativeinfinity = -1 / 0;
// negativeν•œ value의 값을 0으둜 λ‚˜λˆ„λ©΄ λ¬΄ν•œλŒ€
const nAn = 'not a number' / 2;
// μˆ«μžκ°€ μ•„λ‹Œ string을 숫자둜 λ‚˜λˆ„κ²Œ 되면 nAn
* const bigInt = 1224456745889554785n;
// 숫자 끝에 n을 뢙이면 bigInt둜 인식(아직 μ§€μ›μ•ˆλ˜λŠ” λΈŒλΌμš°μ € 있음)

string

ν•œκ°€μ§€μ˜ κΈ€μžλ“  μ—¬λŸ¬κ°œμ˜ κΈ€μžλ“  λ‹€ string νƒ€μž…. λ‹€λ₯Έ stringκ³Ό λΆ™μ΄λŠ” 것도 κ°€λŠ₯

template literals
`hi ${brendan}!`

μ΄λ ‡κ²Œ λΆ™μ—¬μ„œ μ“Έ 수 있음

boolean

false

0, null, undefined,NaN, β€˜ β€˜

true

any other type

null

let nothing = 'null';

λͺ…ν™•ν•˜κ²Œ empty 값을 지정 = null둜 값이 할당됨

undefined

let x = 'undefined';
let x; // μœ„μ™€ 동일

선언은 λ˜μ—ˆμ§€λ§Œ 값이 아무것도 듀어가지 μ•ŠμŒ

symbol

const symbol1 = Symbol('id');
const symbol2 = Symbol('id');

mapμ΄λ‚˜ λ‹€λ₯Έ μžλ£Œκ΅¬μ‘°μ—μ„œ κ³ μœ ν•œ μ‹λ³„μžκ°€ ν•„μš”ν•˜κ±°λ‚˜, μ•„λ‹ˆλ©΄ λ™μ‹œλ‹€λ°œμ μœΌλ‘œ 일어날 수 μžˆλŠ” μ½”λ“œμ—μ„œ μš°μ„ μˆœμœ„λ₯Ό 주고싢을 λ•Œ, 정말 κ³ μœ ν•œ μ‹λ³„μžκ°€ ν•„μš”ν•  λ•Œ μ‚¬μš© μ‹λ³„μžλ₯Ό string으둜 두면 λ‹€λ₯Έ μ½”λ“œμ—μ„œ λ™μΌν•œ string을 λ§Œλ‚ λ•Œ 같은 μ‹λ³„μžλ‘œ 간주함 반면 symbol은 λ™μΌν•œ string을 μ€˜λ„ μ™„μ „νžˆ λ‹€λ₯Έ μ‹λ³„μžλ‘œ κ°„μ£Όν•œλ‹€

const gsymbol1 = Symbol.for('id');
const gsymbol2 = Symbol.for('id');

λ§Œμ•½ λ™μΌν•œ μ‹λ³„μžλ₯Ό μ£Όκ³ μ‹Άλ‹€λ©΄ μ΄λ ‡κ²Œ

console.log(`value: ${symbol1.decription}, type: ${tyopof(symbol2)}`)

좜λ ₯ν•˜λ €λ©΄ μ΄λ ‡κ²Œ description으둜 λ³€ν™˜ν•΄μ•Όν•¨

###(2)object type real-life object, data structure μ‹±κΈ€ μ•„μ΄ν…œλ“€μ„ λ¬Άμ–΄μ„œ ν•œ λ‹¨μœ„, ν•œ λ°•μŠ€λ‘œ 관리할 수 있게 ν•΄μ€Œ 물건과 물체 ν˜•νƒœλ₯Ό λŒ€ν‘œν•  수 μžˆλŠ” λ°•μŠ€ ν˜•νƒœλ₯Ό λœ»ν•¨

const ellie ={ name : 'ellie', age : 20 };

객체 ellieλŠ” const둜 μ„ μ–Έλ˜μ—ˆκΈ°λ•Œλ¬Έμ— 객체ellieκ°€ κ°€λ¦¬ν‚€κ³ μžˆλŠ” λ©”λͺ¨λ¦¬μ˜ ν¬μΈν„°λŠ” μž κ²¨μžˆμ–΄μ„œ λ‹€λ₯Έ object둜 할당이 λΆˆκ°€λŠ₯ ν•˜μ§€λ§Œ 객체 ellie μ•ˆμ—λŠ” nameκ³Ό ageλΌλŠ” λ³€μˆ˜κ°€ μ‘΄μž¬ν•¨. 그것듀을 κ°€λ¦¬ν‚€κ³ μžˆλŠ” ν¬μΈν„°λŠ” μž κ²¨μžˆμ§€ μ•Šμ•„μ„œ λ‹€λ₯Έ κ°’μœΌλ‘œ λ³€κ²½κ°€λŠ₯!

ellie.age = 21;
first-class function

function도 λ‹€λ₯Έ 데이터 νƒ€μž…μ²˜λŸΌ λ³€μˆ˜μ— 할당이 κ°€λŠ₯ ν•¨μˆ˜μ˜ parameter(인자)λ‘œλ„ 전달이 됨 ν•¨μˆ˜μ—μ„œ return νƒ€μž…μœΌλ‘œλ„ function을 리턴 κ°€λŠ₯

Dynamic typing : dynamically typed language

Cλ‚˜ JAVAλŠ” statically type이라 λ³€μˆ˜ μ„ μ–Έ μ‹œμ— μ–΄λ–€ νƒ€μž…μΈμ§€ κ²°μ •ν•΄μ„œ μ„ μ–Έν–ˆμ§€λ§Œ JSλŠ” μ„ μ–Έν• λ•Œ νƒ€μž…μ„ μ„ μ–Έν•˜μ§€μ•Šκ³  λŸ°νƒ€μž„ μ‹œ ν• λ‹Ήλœ 값에 따라 νƒ€μž…μ΄ 변경될 수 μžˆλ‹€ κ·Έλž˜μ„œ ν”„λ‘œν† νƒ€μž… μ‹œμ—λŠ” 정말 μœ μ—°ν•˜μ§€λ§Œ 규λͺ¨μžˆλŠ” ν”„λ‘œμ νŠΈμ—μ„œλŠ” μ’‹μ§€μ•Šλ‹€

let text = 'hello';
console.log(`value:${text}, type: ${typeof  text}`) // value:Hello, type:string

text = 1;
console.log(`value:${text}, type: ${typeof  text}`) // value:1, type:number

text = '7' + 5;
console.log(`value:${text}, type: ${typeof  text}`) // value:75, type:string

text = '8' / '2';
console.log(`value:${text}, type: ${typeof  text}`) // value:4, type:number

λ‚˜λˆ„κΈ° μ—°μ‚°μžκ°€ μžˆμ–΄μ„œ string이 μ•„λ‹Œ number둜 λ³€ν™˜λ˜λ©° 연산이 λœλ‹€

=> λŸ°νƒ€μž„ μ‹œ ν• λ‹Ήλœ 값에 따라 νƒ€μž…μ΄ λ³€ν•˜κΈ°λ•Œλ¬Έμ—, 쀑간에 λ³€μˆ˜μ˜ 값이 λ°”λ€Œλ©΄ 였λ₯˜κ°€ λ°œμƒν•œλ‹€