Data type & Variable - wooyeonhui/Yeonny GitHub Wiki

ํ”„๋กœ๊ทธ๋ž˜๋ฐ์€ ๋ณ€์ˆ˜๋ฅผ ํ†ตํ•ด ๊ฐ’์„ ์ €์žฅํ•˜๊ณ  ์ฐธ์กฐํ•˜๋ฉฐ ์—ฐ์‚ฐ์ž๋กœ ๊ฐ’์„ ์—ฐ์‚ฐ, ํ‰๊ฐ€ํ•˜๊ณ  ์กฐ๊ฑด๋ฌธ๊ณผ ๋ฐ˜๋ณต๋ฌธ์— ์˜ํ•œ ํ๋ฆ„์ œ์–ด๋กœ ๋ฐ์ดํ„ฐ์˜ ํ๋ฆ„์„ ์ œ์–ดํ•˜๊ณ  ํ•จ์ˆ˜๋กœ ์žฌ์‚ฌ์šฉ์ด ๊ฐ€๋Šฅํ•œ ๊ตฌ๋ฌธ์˜ ์ง‘ํ•ฉ์„ ๋งŒ๋“ค๋ฉฐ ๊ฐ์ฒด, ๋ฐฐ์—ด ๋“ฑ์œผ๋กœ ์ž๋ฃŒ๋ฅผ ๊ตฌ์กฐํ™”ํ•˜๋Š” ๊ฒƒ์ด๋‹ค.

๋ณ€์ˆ˜๋Š” ์œ„์น˜(์ฃผ์†Œ)๋ฅผ ๊ธฐ์–ตํ•˜๋Š” ์ €์žฅ์†Œ์ด๋‹ค. ์œ„์น˜๋ž€ ๋ฉ”๋ชจ๋ฆฌ ์ƒ์˜ ์ฃผ์†Œ(address)๋ฅผ ์˜๋ฏธํ•œ๋‹ค. ์ฆ‰ ๋ณ€์ˆ˜๋ž€ ๋ฉ”๋ชจ๋ฆฌ ์ฃผ์†Œ(Memory address)์— ์ ‘๊ทผํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ๋žŒ์ด ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ์–ธ์–ด๋กœ ์ง€์ •ํ•œ ์‹๋ณ„์ž(identifier)์ด๋‹ค.

๋ณ€์ˆ˜(memory address์— ์ ‘๊ทผํ•˜๊ธฐ ์œ„ํ•œ ์‹๋ณ„์ž)๋ฅผ ํ†ตํ•ด ๋ฉ”๋ชจ๋ฆฌ์— ๊ฐ’์„ ์ €์žฅํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ์šฐ์„  ํ•„์š”ํ•œ ์ €์žฅ ๋‹จ์œ„(byte)๋ฅผ ์•Œ์•„์•ผํ•œ๋‹ค. ์ด๋Š” ๊ฐ’์˜ ์ข…๋ฅ˜์— ๋”ฐ๋ผ ๊ฐ’์„ ์ €์žฅํ•˜๊ธฐ ์œ„ํ•ด ํ™•๋ณดํ•ด์•ผํ•  ๋ฉ”๋ชจ๋ฆฌ์˜ ํฌ๊ธฐ๊ฐ€ ๋‹ค๋ฅด๊ธฐ ๋–„๋ฌธ์ด๋‹ค. ์ด๋•Œ ๊ฐ’์˜ ์ข…๋ฅ˜ ์ฆ‰ ๋ฐ์ดํ„ฐ์˜ ์ข…๋ฅ˜๋ฅผ ์ž๋ฃŒํ˜•(Data Type)์ด๋ผ ํ•œ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด 1byte(8bit)๋กœ ํ‘œํ˜„ํ•  ์ˆ˜ ์žˆ๋Š” ๊ฐ’์˜ ์ด์ˆ˜๋Š” 256๊ฐœ(2^8), 4byte(32bit)๋กœ ํ‘œํ˜„ํ•  ์ˆ˜ ์žˆ๋Š” ๊ฐ’์˜ ์ด์ˆ˜๋Š” 4,294,967,296ro(2^32)์ด๋‹ค.

C๋‚˜ Java๊ฐ™์€ C-fammily ์–ธ์–ด๋Š” Static Typing(์ •์  ํƒ€์ดํ•‘) ์–ธ์–ด๋กœ ๋ณ€์ˆ˜ ์„ ์–ธ์‹œ ๋ณ€์ˆ˜์— ์ €์žฅํ•  ๊ฐ’์˜ ์ข…๋ฅ˜๋ ˆ ๋”ฐ๋ผ ์‚ฌ์ „์— ์ž๋ฃŒํ˜•์„ ์ง€์ •(Type annotation)ํ•˜์—ฌ์•ผ ํ•œ๋‹ค. ๋‹ค์Œ์€ C์—์„œ ์ •์ˆ˜ํ˜• ๋ณ€์ˆ˜๋ฅผ ์„ ์–ธํ•˜๋Š” ์˜ˆ์ด๋‹ค.

์œ„ ์„ ์–ธ์„ ๋งŒ๋‚˜๋ฉด ์‹œ์Šคํ…œ์€ ์ดํ›„ ํ• ๋‹น๋  ๊ฐ’๊ณผ๋Š” ์ƒ๊ด€์—†์ด 4byte์˜ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ํ• ๋‹นํ•ด์ค€๋‹ค.๋”ฐ๋ผ์„œ ์ž๋ฃŒํ˜•์— ๋งž๋Š” ๊ฐ’์„ ๋Œ€์ž…(ํ• ๋‹น)ํ•˜์—ฌ์•ผํ•œ๋‹ค. ๋‹ค์Œ์€ C์—์„œ ์ •์ˆ˜ํ˜• ๋ณ€์ˆ˜์— ๋ฌธ์ž์—ด์„ ์ž˜๋ชป ํ• ๋‹นํ•œ ์˜ˆ์ด๋‹ค.

JavaScript๋Š” ๋™์  ํƒ€์ดํ•‘(Dynamic Typing) ์–ธ์–ด๋กœ ๋ณ€์ˆ˜์˜ Type annotation์ด ํ•„์š”์—†์ด ๊ฐ’์ด ํ• ๋‹น๋˜๋Š” ๊ณผ์ •์—์„œ ์ž๋™์œผ๋กœ ์ž๋ฃŒํ˜•์ด ๊ฒฐ์ •(Type Inference)๋œ๋‹ค. ๋”ฐ๋ผ์„œ ๊ฐ™์€ ๋ณ€์ˆ˜์— ์—ฌ๋Ÿฌ ์ž๋ฃŒํ˜•์˜ ๊ฐ’์„ ๋Œ€์ž…ํ•  ์ˆ˜ ์žˆ๋‹ค.

JavaScript์—๋Š” ์–ด๋– ํ•œ ์ž๋ฃŒํ˜•์ด ์žˆ๋Š”์ง€ ๊ทธ๋ฆฌ๊ณ  ๋ณ€์ˆ˜๋Š” ์–ด๋–ป๊ฒŒ ์‚ฌ์šฉํ•˜๋Š”์ง€ ์•Œ์•„๋ณด๋„๋ก ํ•˜์ž.

  1. Data Type (์ž๋ฃŒํ˜•) ์ž๋ฃŒํ˜•(Data Type)์€ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด์—์„œ ๋ฌธ์ž์—ด, ์ˆซ์ž, ๋ถˆ๋ฆฌ์–ธ, ๊ฐ์ฒด ๋“ฑ ์—ฌ๋Ÿฌ ์ข…๋ฅ˜์˜ ๋ฐ์ดํ„ฐ๋ฅผ ์‹๋ณ„ํ•˜๋Š” ๋ถ„๋ฅ˜๋ฅผ ๋งํ•œ๋‹ค. ๋ชจ๋“  ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด์˜ ํ•™์Šต์€ ์ž๋ฃŒํ˜•์„ ํŒŒ์•…ํ•˜๋Š” ๊ฒƒ์œผ๋กœ๋ถ€ํ„ฐ ์‹œ์ž‘๋œ๋‹ค.
  • ๊ธฐ๋ณธ ์ž๋ฃŒํ˜•(primitive data type)
    • Boolean
    • null
    • undefined
    • Number
    • String
    • Symbol (ECMAScript 6์—์„œ ์ถ”๊ฐ€)
  • ๊ฐ์ฒดํ˜•(Object type)
    • Object

Javascript์˜ ์ž๋ฃŒํ˜•์€ ํฌ๊ฒŒ ๊ธฐ๋ณธ ์ž๋ฃŒํ˜•(primitive data type)๊ณผ ๊ฐ์ฒดํ˜•(์ฐธ์กฐํ˜•)์œผ๋กœ ๊ตฌ๋ถ„ํ•  ์ˆ˜ ์žˆ๋‹ค.

Primitive Data Type(๊ธฐ๋ณธ์ž๋ฃŒํ˜•)

  • ๊ธฐ๋ณธ์ž๋ฃŒํ˜•(Primitive data type)์˜ ๊ฐ’์€ ๋ณ€๊ฒฝ ๋ถˆ๊ฐ€๋Šฅํ•œ ๊ฐ’(immutable value)์ด๋‹ค. ๋˜ํ•œ ์ด๋“ค์€ pass-by-value ์ด๋‹ค.

Boolean

  • ๋…ผ๋ฆฌ์ ์ธ ์š”์†Œ๋ฅผ ๋‚˜ํƒ€๋‚ด๋ฉฐ true์™€ false ๋‘๊ฐ€์ง€ ๊ฐ’์„ ๊ฐ€์งˆ ์ˆ˜ ์žˆ๋‹ค. ๋น„์–ด์žˆ๋Š” ๋ฌธ์ž์—ด๊ณผ null, undefined,์ˆซ์ž0์€ false๋กœ ๊ฐ„์ฃผ๋œ๋‹ค.

null

  • null ํƒ€์ž…์€ ๋”ฑ ํ•œ ๊ฐ€์ง€ ๊ฐ’, null ์„ ๊ฐ€์งˆ ์ˆ˜ ์žˆ๋‹ค. JavaScript๋Š” case-sensitiveํ•˜๋ฏ€๋กœ null์€ Null,NULL๋“ฑ๊ณผ ๋‹ค๋ฅด๋‹ค.

  • Computer science์—์„œ null์€ ์˜๋„์ ์œผ๋กœ ๊ธฐ๋ณธํ˜•(primitives) ๋˜๋Š” objectํ˜• ๋ณ€์ˆ˜์— ๊ฐ’์ด ์—†๋‹ค๋Š” ๊ฒƒ์„ ๋ช…์‹œํ•œ ๊ฒƒ์ด๋‹ค.

  • ์ฃผ์˜ํ•  ๊ฒƒ์€ ๋ฐ์ดํ„ฐ ํ˜•์‹์„ ๋‚˜ํƒ€๋‚ด๋Š” ๋ฌธ์ž์—ด์„ ๋ฐ˜ํ™˜ํ•˜๋Š” typeof์—ฐ์‚ฐ์ž๋กœ null๊ฐ’์€ ๊ฐ€์ง„ ๋ณ€์ˆ˜๋ฅผ ์—ฐ์‚ฐํ•ด ๋ณด๋ฉด null์ด ์•„๋‹Œ object๊ฐ€ ๋‚˜์˜จ๋‹ค.์ด๋Š” ์„ฑ๊ณ„์ƒ์˜ ๋ฌธ์ œ์ด๋‹ค.

๋”ฐ๋ผ์„œ nullํƒ€์ž… ๋ณ€์ˆ˜์ธ์ง€ ํ™•์ธํ•  ๋•Œ typeof ์—ฐ์‚ฐ์ž๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์•ˆ๋˜๊ณ  ์ผ์น˜ ์—ฐ์‚ฐ์ž(===)๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ์•ผ ํ•œ๋‹ค.

undefined

  • ๊ฐ’์„ ํ• ๋‹นํ•˜์ง€ ์•Š์€ ๋ณ€์ˆ˜๋Š” undefined ๊ฐ’์„ ๊ฐ€์ง„๋‹ค. ์ฆ‰, ์„ ์–ธ์€ ๋˜์—ˆ์ง€๋งŒ ํ• ๋‹น๋œ ์ ์ด ์—†๋Š” ๋ณ€์ˆ˜์— ์ ‘๊ทผํ•˜๊ฑฐ๋‚˜ ์กด์žฌํ•˜์ง€ ์•Š๋Š” ๊ฐ์ฒด ํ”„๋กœํผํ‹ฐ์— ์ ‘๊ทผํ•  ๊ฒฝ์šฐ ๋ฐ˜ํ™˜๋œ๋‹ค.

Number

  • C ์–ธ์–ด์˜ ๊ฒฝ์šฐ, ์ •์ˆ˜ํ˜•๊ณผ ์‹ค์ˆ˜ํ˜•์„ ์ˆ˜๋ถ„ํ•˜์—ฌ int, long, float, double ๋“ฑ๊ณผ ๊ฐ™์€ ๋‹ค์–‘ํ•œ ์ˆซ์ž ์ž๋ฃŒํ˜•์ด ์กด์žฌํ•œ๋‹ค.ํ•˜์ง€๋งŒ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋Š” ํ•˜๋‚˜์˜ ์ˆซ์ž ์ž๋ฃŒํ˜•๋งŒ ์กด์žฌํ•œ๋‹ค.

  • ECMAScript ํ‘œ์ค€์— ๋”ฐ๋ฅด๋ฉด, ์ˆซ์ž ์ž๋ฃŒํ˜•์€ ๋ฐฐ์ •๋ฐ€๋„ 64๋น„ํŠธ ๋ถ€๋™ ์†Œ์ˆ˜์  ํ˜• ๋‹จ ํ•˜๋‚˜๋งŒ ์กด์žฌํ•œ๋‹ค. ์ •์ˆ˜๋งŒ์„ ํ‘œํ˜„ํ•˜๊ธฐ ์œ„ํ•œ ํŠน๋ณ„ํ•œ ์ž๋ฃŒํ˜•(integer type)์€ ์—†๋‹ค.

์ถ”๊ฐ€์ ์œผ๋กœ ์„ธ๊ฐ€์ง€ ์˜์žˆ๋Š” ๊ธฐํ˜ธ์ ์ธ ๊ฐ’๋“ค๋„ ํ‘œํ˜„ํ•  ์ˆ˜ ์žˆ๋‹ค.

  • +/- Infinity
  • NaN(not-a-number)

String

  • String(๋ฌธ์ž์—ด) ํƒ€์ž…์€ ํ…์ŠคํŠธ ๋ฐ์ดํ„ฐ๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š”๋ฐ ์‚ฌ์šฉํ•œ๋‹ค. ์ด๋Š” 0๊ฐœ ๋˜๋Š” ๊ทธ ์ด์ƒ์˜ ์œ ๋‹ˆ์ฝ”๋“œ(16๋น„ํŠธ ๋ถ€ํ˜ธ์—†๋Š” ์ •์ˆ˜ ๊ฐ’) ๋ฌธ์ž๋“ค์˜ ์ง‘ํ•ฉ์ด๋‹ค.๋ฌธ์ž์—ด์€ ์ž‘์€ ๋”ฐ์˜ดํ‘œ('') ๋˜๋Š” ํฐ ๋”ฐ์˜ดํ‘œ("") ์•ˆ์— ํ…์ŠคํŠธ๋ฅผ ๋„ฃ์–ด ์ƒ์„ฑํ•œ๋‹ค.

  • C์™€ ๊ฐ™์€ ์–ธ์–ด์™€๋Š” ๋‹ค๋ฅด๊ฒŒ, ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์˜ ๋ฌธ์ž์—ด์€ ๋ณ€๊ฒฝ ๋ถˆ๊ฐ€๋Šฅ(immutable)ํ•˜๋‹ค. ์ด๊ฒƒ์€ ํ•œ ๋ฒˆ ๋ฌธ์ž์—ด์ด ์ƒ์„ฑ๋˜๋ฉด, ๊ทธ ๋ฌธ์ž์—ด์„ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์—†๋‹ค๋Š”๊ฑธ ์˜๋ฏธํ•œ๋‹ค.

  • ๋ฌธ์ž์—ด์€ ๋ฐฐ์—ด์ฒ˜๋Ÿผ ์ธ๋ฑ์Šค๋ฅผ ํ†ตํ•ด ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋‹ค.str[0]='S'์ฒ˜๋Ÿผ ์ด๋ฏธ ์ƒ์„ฑ๋œ ๋ฌธ์ž์—ด์— ์ƒˆ๋กœ์šด ๋ฌธ์ž๋ฅผ ๋Œ€์ž…ํ•˜์—ฌ ๋ณ€๊ฒฝ์‹œ์ผœ๋„ ๋ณ€๊ฒฝ์‹œ์ผœ๋„ ๋ฐ˜์˜๋˜์ง€ ์•Š๋Š”๋‹ค(์ด๋•Œ ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•˜์ง€ ์•Š๋Š”๋‹ค). ํ•œ๋ฒˆ ์ƒ์„ฑ๋œ ๋ฌธ์ž์—ด์€ read only๋กœ์„œ ์ˆ˜์ •์€ ๋ถˆ๊ฐ€ํ•˜๋‹ค. ์ด๊ฒƒ์„ ๋ณ€๊ฒฝ ๋ถˆ๊ฐ€๋Šฅ(immutable)์ด๋ผ ํ•œ๋‹ค.

  • ๊ทธ๋Ÿฌ๋‚˜ ์ƒˆ๋กœ์šด ๋ฌธ์ž์—ด์„ ํ• ๋‹นํ•˜๋Š” ๊ฒƒ์€ ๋ฌผ๋ก  ๊ฐ€๋Šฅํ•˜๋‹ค. ์ด๋Š” ๊ธฐ์กด ๋ฌธ์ž์—ด์„ ์ˆ˜์ •ํ•˜๋А ๊ฒƒ์ด ์•„๋‹Œ ์ƒˆ๋กœ์šด ๋ฌธ์ž์—ด์„ ํ• ๋‹นํ•˜๋Š” ๊ฒƒ์ด๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

Symbol

  • Symbol์€ ES6์—์„œ ์ƒˆ๋กญ๊ฒŒ ์ถ”๊ฐ€๋œ 7๋ฒˆ์จฐ ํƒ€์ž…์ด๋‹ค. Symbol์€ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ „์ฒด์—์„œ ์œ ์ผํ•˜๋ฉฐ ๋ณ€๊ฒฝ ๋ถˆ๊ฐ€๋Šฅํ•œ(immutable) ๊ธฐ๋ณธ ์ž๋ฃŒํ˜•(primitive)์ด๋‹ค. ์ฃผ๋กœ ๊ฐ์ฒด์˜ ํ”„๋กœํผํ‹ฐ ํ‚ค(property key)๋กœ ์‚ฌ์šฉํ•œ๋‹ค. Symbol ๊ฐ’์€ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ „์ฒด์—์„œ ์œ ์ผํ•˜๊ธฐ ๋•Œ๋ฌธ์— Symbol ๊ฐ’์„ ํ‚ค๋กœ ๊ฐ–๋Š” ํ”„๋กœํผํ‹ฐ๋Š” ๋‹ค๋ฅธ ์–ด๋– ํ•œ ํ”„๋กœํผํ‹ฐ์™€๋„ ์ถฉ๋Œํ•˜์ง€ ์•Š๋Š”๋‹ค.

๊ฐ์ฒดํ˜• (Object type,์ฐธ์กฐํ˜•) ๊ฐ์ฒด๋Š” ๋ฐ์ดํ„ฐ์™€ ๊ทธ ๋ฐ์ดํ„ฐ์— ๊ด€๋ จ๋˜๋Š” ๋™์ž‘(์ ˆ์ฐจ,๋ฐฉ๋ฒ•,๊ธฐ๋Šฅ)์„ ๋ชจ๋‘ ํฌํ•จํ•  ์ˆ˜ ์žˆ๋Š” ๊ฐœ๋…์  ์กด์žฌ์ด๋‹ค. ๋‹ฌ๋ฆฌ ๋งํ•ด, ์ด๋ฆ„๊ณผ ๊ฐ’์„ ๊ฐ€์ง€๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ์˜๋ฏธํ•˜๋Š” ํ”„๋กœํผํ‹ฐ(property)์™€ ๋™์ž‘์„ ์˜๋ฏธํ•˜๋Š” ๋ฉ”์†Œ๋“œ(method)๋ฅผ ํฌํ•จํ•˜๊ณ  ์žˆ๋Š” ๋…๋ฆฝ์  ์ฃผ์ฒด์ด๋‹ค.

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋Š” ๊ฐ์ฒด(object)๊ธฐ๋ฐ˜์˜ ์Šคํฌ๋ฆฝํŠธ ์–ธ์–ด์ด๋ฉฐ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋ฅผ ์ด๋ฃจ๊ณ  ์žˆ๋Š” ๊ฑฐ์˜"๋ชจ๋“  ๊ฒƒ"์€ ๊ฐ์ฒด์ด๋‹ค. ๊ธฐ๋ณธ์ž๋ฃŒํ˜•(Primitives)์„ ์ œ์™ธํ•œ ๋‚˜๋จธ์ง€ ๊ฐ’๋“ค(๋ฐฐ์—ด, ํ•จ์ˆ˜, ์ •๊ทœํ‘œํ˜„์‹ ๋“ฑ)์€ ๋ชจ๋‘ ๊ฐ์ฒด์ด๋‹ค.

  • ํ•จ์ˆ˜ (Function)
  • ๋ฐฐ์—ด (Array)
  • ๋‚ ์งœ (Date)
  • ์ •๊ทœ์‹ (RegExp)

์ด๊ฒƒ๋“ค์€ ๋ชจ๋‘ ๊ฐ์ฒด์ด๋‹ค. ๋˜ํ•œ ๊ฐ์ฒด๋Š” pass-by-reference์ด๋‹ค.

๋ณ€์ˆ˜ (Variable) ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ๊ฐ’(value)์„ ์œ ์ง€ํ•  ํ•„์š”๊ฐ€ ์žˆ์„ ๋•Œ ๋ณ€์ˆ˜๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค. ๋ณ€์ˆ˜๋Š” ๊ฐ’์„ ์ €์žฅ, ์กฐํšŒ, ์กฐ์ž‘(๋ณ€๊ฒฝ)ํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋˜๋ฉฐ ๋‹ค๋ฅธ ์‚ฌ์šฉ์ž๊ฐ€ ๋ณ€์ˆ˜์˜ ์กด์žฌ ๋ชฉ์ ์„ ์‰ฝ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋„๋ก ์˜๋ฏธ๋ง€๋Š” ์ด๋ฆ„์„ ์ง€์ •ํ•˜์—ฌ์•ผํ•œ๋‹ค.

๋ณ€์ˆ˜๋ช…์€ identifier(์‹๋ณ„์ž)๋กœ ๋ถˆ๋ฆฌ๊ธฐ๋„ ํ•˜๋ฉฐ ๋ช…๋ช… ๊ทœ์น™์ด ์กด์žฌํ•œ๋‹ค.

  • ๋ฐ˜๋“œ์‹œ ์˜๋ฌธ์ž(ํŠน์ˆ˜๋ฌธ์ž ์ œ์™ธ), underscore( _ ),๋˜๋Š” ๋‹ฌ๋Ÿฌ ๊ธฐํ˜ธ($)๋กœ ์‹œ์ž‘ํ•˜์—ฌ์•ผ ํ•œ๋‹ค. ์ด์–ด์ง€๋Š” ๋ฌธ์ž์—๋Š” ์ˆซ์ž(0~9)๋„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.
  • JavaScript๋Š” ๋Œ€/์†Œ๋ฌธ์ž๋ฅผ ๊ตฌ๋ณ„ํ•˜๋ฏ€๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๋ฌธ์ž๋Š” "A""Z"(๋Œ€๋ฌธ์ž)์™€ "a""z"(์†Œ๋ฌธ์ž)์ด๋‹ค. ๋ณ€์ˆ˜๋ฅผ ์„ ์–ธํ•  ๋•Œ var keyword๊ฐ€ ์‚ฌ์šฉ๋œ๋‹ค. ๋“ฑํ˜ธ(=,equal sign)๋Š” ๋ณ€์ˆ˜์— ๊ฐ’์„ ํ• ๋‹นํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉ๋œ๋‹ค.

๊ฐ’์„ ํ• ๋‹นํ•˜์ง€ ์•Š์€ ๋ณ€์ˆ˜ ์ฆ‰ ์„ ์–ธ๋งŒ ๋˜์–ด ์žˆ๋Š” ๋ณ€์ˆ˜๋Š” undefined๋กœ ์ดˆ๊ธฐ๊ฐ’์„ ๊ฐ–๊ฒŒ ๋œ๋‹ค. ๋ฏธ์„ ์–ธ ๋ณ€์ˆ˜์— ์ ‘๊ทผํ•˜๋ฉด ReferenceError์˜ˆ์™ธ๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค.

๋ณ€์ˆ˜์˜ ์ค‘๋ณต ์„ ์–ธ -๋ณ€์ˆ˜์˜ ์ค‘๋ณต ์„ ์–ธ์ด ๊ฐ€๋Šฅํ•˜๋‹ค.

๋ณ€์ˆ˜ ์„ ์–ธ ์‹œ var ํ‚ค์›Œ๋“œ ์ƒ๋žต ํ—ˆ์šฉ

  • ๋ณ€์ˆ˜ ์„ ์–ธ์‹œ var ํ‚ค์›Œ๋“œ๋ฅผ ์ƒ๋žตํ•  ์ˆ˜ ์žˆ๋‹ค.

๋™์  ํƒ€์ดํ•‘(Dynamic Typing) -JavaScript๋Š” ๋™์ ํƒ€์ž…(dynamic typed)์–ธ์–ด ํ˜น์€ ๋А์Šจํ•œ ํƒ€์ž…(loosely typed)์–ธ์–ด์ด๋‹ค. ์ด๊ฒƒ์€ ๋ณ€์ˆ˜์˜ Type annotation์ด ํ•„์š”์—†์ด ๊ฐ’์ด ํ• ๋‹น๋˜๋Š” ๊ณผ์ •์—์„œ ์ž๋™์œผ๋กœ ์ž๋ฃŒํ˜•์ด ๊ฒฐ์ •(Type Inference)๋  ๊ฒƒ์ด๋ผ๋Š” ๋œป์ด๋‹ค. ๋”ฐ๋ผ์„œ ๊ฐ™์€ ๋ณ€์ˆ˜์— ์—ฌ๋Ÿฌ data type์˜ ๊ฐ’์„ ๋Œ€์ž…ํ•  ์ˆ˜ ์žˆ๋‹ค. ์ด๋ฅผ ๋™์  ํƒ€์ดํ•‘(Dynamic Typing)์ด๋ผ ํ•œ๋‹ค.

๋ณ€์ˆ˜ ํ˜ธ์ด์ŠคํŒ…(Variable Hoisting) var ํ‚ค์›Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์„ ์–ธํ•œ ๋ณ€์ˆ˜๋Š” ์ค‘๋ณต ์„ ์–ธ์ด ๊ฐ€๋Šฅํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์œ„์˜ ์ฝ”๋“œ๋Š” ๋ฌธ๋ฒ•์ ์œผ๋กœ ๋ฌธ์ œ๊ฐ€ ์—†๋‹ค. โ‘ ์—์„œ ๋ณ€์ˆ˜ foo๋Š” ์•„์ง ์„ ์–ธ๋˜์ง€ ์•Š์•˜์œผ๋ฏ€๋กœ ReferenceError:foo is not defined๊ฐ€ ๋ฐœ์ƒํ•  ๊ฒƒ์„ ๊ธฐ๋Œ€ํ–ˆ๊ฒ ์ง€๋งŒ ์ฝ˜์†”์—๋Š” undefined๊ฐ€ ์ถœ๋ ฅ๋œ๋‹ค. ์ด๊ฒƒ์€ ๋‹ค๋ฅธ C-family ์–ธ์–ด์™€๋Š” ์ฐจ๋ณ„๋˜๋Š” ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์˜ ํŠน์ง•์œผ๋กœ ๋ชจ๋“  ์„ ์–ธ๋ฌธ์€ ํ˜ธ์ด์ŠคํŒ…(Hoisting)๋˜๊ธฐ ๋–„๋ฌธ์ด๋‹ค. ํ˜ธ์ด์ŠคํŒ…์ด๋ž€ var ์„ ์–ธ๋ฌธ์ด๋‚˜ function ์„ ์–ธ๋ฌธ์„ ํ•ด๋‹น Scope์˜ ์„ ๋‘๋กœ ์˜ฎ๊ธฐ๋Š” ๊ฒƒ์„ ๋งํ•œ๋‹ค. ์ฆ‰ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋Š” ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•˜๊ธฐ ์ „์— var ์„ ์–ธ๋ฌธ๊ณผ function์„ ์–ธ๋ฌธ์„ ํ•ด๋‹น ์Šค์ฝ”ํ”„์˜ ๋งจ์œ„๋กœ ์˜ฎ๊ธด๋‹ค. ๋ณ€์ˆ˜๊ฐ€ ์–ด๋–ป๊ฒŒ ์ƒ์„ฑ๋˜๋ฉฐ ํ˜ธ์ด์ŠคํŒ…์€ ์–ด๋–ป๊ฒŒ ์ด๋ฃจ์–ด์ง€๋Š” ์ง€ ์ข€๋” ์ž์„ธํžˆ ์‚ดํŽด๋ณด์ž. ๋ณ€์ˆ˜๋Š” 3๋‹จ๊ณ„์— ๊ฑธ์ณ ์ƒ์„ฑ๋œ๋‹ค. ์ž์„ธํ•œ ๋‚ด์šฉ์€ Execution Context์„ ์ฐธ์กฐํ•˜๊ธฐ ๋ฐ”๋ž€๋‹ค.

  • ์„ ์–ธ๋‹จ๊ณ„(Declaration phase) ๋ณ€์ˆ˜ ๊ฐ์ฒด(Variable Object)์— ๋ณ€์ˆ˜๋ฅผ ๋“ฑ๋กํ•œ๋‹ค. ์ด๋ณ€์ˆ˜ ๊ฐ์ฒด๋Š”

  • ์ดˆ๊ธฐํ™” ๋‹จ๊ณ„(Initialization phase) ๋ณ€์ˆ˜ ๊ฐ์ฒด(variable Object)์— ๋“ฑ๋ก๋œ ๋ณ€์ˆ˜๋ฅผ ๋ฉ”๋ชจ๋ฆฌ์— ํ• ๋‹นํ•œ๋‹ค. ์ด ๋‹จ๊ณ„์—์„œ ๋ณ€์ˆ˜๋Š” undefined๋กœ ์ดˆ๊ธฐํ™”๋œ๋‹ค.

  • ํ• ๋‹น ๋‹จ๊ณ„(Assignment phase) undefined๋กœ ์ดˆ๊ธฐํ™”๋œ ๋ณ€์ˆ˜์— ์‹ค์ œ๊ฐ’์„ ํ• ๋‹นํ•œ๋‹ค.

javascript์˜ ๋ณ€์ˆ˜๋Š” ๋‹ค๋ฅธ C-family์™€๋Š” ๋‹ฌ๋ฆฌ block-level scope๋ฅผ ๊ฐ€์ง€์ง€ ์•Š๊ณ  function-level scope๋ฅผ ๊ฐ–๋Š”๋‹ค. ๋‹จ, ECMAScript 6์—์„œ ๋„์ž…๋œ let,const ํ‚ค์›Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด block-level scope๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค. ์ž์„ธํ•œ ๋‚ด์šฉ์€ Scope๋ฅผ ์ฐธ์กฐํ•˜๊ธฐ ๋ฐ”๋ž€๋‹ค.

  • Function-level scope ํ•จ์ˆ˜๋‚ด์—์„œ ์„ ์–ธ๋œ ๋ณ€์ˆ˜๋Š” ํ•จ์ˆ˜ ๋‚ด์—์„œ๋งŒ ์œ ํšจํ•˜๋ฉฐ ํ•จ์ˆ˜ ์™ธ๋ถ€์—์„œ๋Š” ์ฐธ์กฐํ•  ์ˆ˜ ์—†๋‹ค. ์ฆ‰, ํ•จ์ˆ˜ ๋‚ด๋ถ€์—์„œ ์„ ์–ธํ•œ ๋ณ€์ˆ˜๋Š” ์ง€์—ญ ๋ณ€์ˆ˜์ด๋ฉฐ ํ•จ์ˆ˜ ์™ธ๋ถ€์—์„œ ์„ ์–ธํ•œ ๋ณ€์ˆ˜๋Š” ๋ชจ๋‘ ์ „์—ญ ๋ณ€์ˆ˜์ด๋‹ค.

  • Block-level scope ์ฝ”๋“œ ๋ธ”๋Ÿญ ๋‚ด์—์„œ ์„ ์–ธ๋œ ๋ณ€์ˆ˜๋Š” ์ฝ”๋“œ ๋ธ”๋Ÿญ ๋‚ด์—์„œ๋งŒ ์œ ํšจํ•˜๋ฉฐ ์ฝ”๋“œ ๋ธ”๋Ÿญ ์™ธ๋ถ€์—์„œ๋Š” ์ฐธ์กฐํ•  ์ˆ˜ ์—†๋‹ค.

var ํ‚ค์›Œ๋“œ๋กœ ์„ ์–ธ๋œ ๋ณ€์ˆ˜์˜ ๋ฌธ์ œ์ 

ES5์—์„œ ๋ณ€์ˆ˜๋ฅผ ์„ ์–ธํ•  ์ˆ˜ ์žˆ๋Š” ์œ ์ผํ•œ ๋ฐฉ๋ฒ•์€ var ํ‚ค์›Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด๋‹ค. var ํ‚ค์›Œ๋“œ๋กœ ์„ ์–ธ๋œ ๋ณ€์ˆ˜๋Š” ์•„๋ž˜์™€ ๊ฐ™์€ ํŠน์ง•์„ ๊ฐ–๋Š”๋‹ค. ์ด๋Š” ๋‹ค๋ฅธ C-family์–ธ์–ด์™€๋Š” ์ฐจ๋ณ„๋˜๋Š” ํŠน์ง•(์„ค๊ณ„์ƒ ์˜ค๋ฅ˜)์œผ๋กœ ์ฃผ์˜๋ฅผ ๊ธฐ์šธ์ด์ง€ ์•Š์œผ๋ฉด ์‹ฌ๊ฐํ•œ ๋ฌธ์ œ๋ฅผ ๋ฐœ์ƒ์‹œํ‚จ๋‹ค.

  1. Function-level scope
  • ์ „์—ญ ๋ณ€์ˆ˜์˜ ๋‚จ๋ฐœ
  • for loop ์ดˆ๊ธฐํ™”์‹์—์„œ ์‚ฌ์šฉํ•œ ๋ณ€์ˆ˜๋ฅผ for loop ์™ธ๋ถ€ ๋˜๋Š” ์ „์—ญ์—์„œ ์ฐธ์กฐํ•  ์ˆ˜ ์žˆ๋‹ค.
  1. var ํ‚ค์›Œ๋“œ ์ƒ๋žต ํ—ˆ์šฉ
  • ์˜๋„ํ•˜์ง€ ์•Š์€ ๋ณ€์ˆ˜์˜ ์ „์—ญํ™”
  1. ์ค‘๋ณต ์„ ์–ธ ํ—ˆ์šฉ
  • ์˜๋„ํ•˜์ง€ ์•Š์€ ๋ณ€์ˆ˜๊ฐ’ ๋ณ€๊ฒฝ
  1. ๋ณ€์ˆ˜ ํ˜ธ์ด์ŠคํŒ…
  • ๋ณ€์ˆ˜๋ฅผ ์„ ์–ธํ•˜๊ธฐ ์ „์— ์ฐธ์กฐ๊ฐ€ ๊ฐ€๋Šฅํ•˜๋‹ค.

๋Œ€๋ถ€๋ถ„์˜ ๋ฌธ์ œ๋Š” ์ „์—ญ๋ณ€์ˆ˜๋กœ ์ธํ•ด ๋ฐœ์ƒํ•œ๋‹ค. ์ „์—ญ ๋ณ€์ˆ˜๋Š” ๊ฐ„๋‹จํ•œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ๊ฒฝ์šฐ, ์‚ฌ์šฉ์ด ํŽธ๋ฆฌํ•œ ๋ฉด์ด ์žˆ์ง€๋งŒ ๋ถˆ๊ฐ€ํ”ผํ•œ ์ƒํ™ฉ์„ ์ œ์™ธํ•˜๊ณ  ์‚ฌ์šฉ์„ ์–ต์ œํ•ด์•ผ ํ•œ๋‹ค. ์ „์—ญ ๋ณ€์ˆ˜๋Š” ๋ฒ”์œ„(scope)๊ฐ€ ๋„“์–ด์„œ ์–ด๋””์—์„œ ์–ด๋–ป๊ฒŒ ์‚ฌ์šฉ๋  ์ง€ ํŒŒ์•…ํ•˜๊ธฐ ํž˜๋“ค๋‹ค. ์ด๋Š” ์˜๋„์น˜ ์•Š์€ ๋ณ€์ˆ˜์˜ ๋ณ€๊ฒฝ์ด ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋Š” ๊ฐ€๋Šฅ์„ฑ์ด ์ฆ๊ฐ€ํ•œ๋‹ค. ๋˜ํ•œ ์—ฌ๋Ÿฌํ•จ์ˆ˜์™€ ์ƒํ˜ธ ์˜์กดํ•˜๋Š” ๋“ฑ side effect๊ฐ€ ์žˆ์„ ์ˆ˜ ์žˆ์–ด์„œ ๋ณต์žก์„ฑ์ด ์ฆ๊ฐ€ํ•œ๋‹ค.

๋ณ€์ˆ˜์˜ ๋ฒ”์œ„(scope)๋Š” ์ข์„์ˆ˜๋ก ์ข‹๋‹ค.

ES6๋Š” ์ด๋Ÿฌํ•œ var์˜ ๋‹จ์ ์„ ๋ณด์™„ํ•˜๊ธฐ ์œ„ํ•ด let๊ณผ const ํ‚ค์›Œ๋“œ๋ฅผ ๋„์ž…ํ•˜์˜€๋‹ค.