Reviews ๐Ÿง/Books

[ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ ํ”„๋กœ๊ทธ๋ž˜๋ฐ review] 3์žฅ ํƒ€์ž…์˜ ๋ชจ๋“  ๊ฒƒ

leejaejae 2023. 12. 14. 23:59

๋ชฉ์ฐจ

3.1 ํƒ€์ž…์„ ์ด์•ผ๊ธฐํ•˜๋‹ค 
3.2 ํƒ€์ž…์˜ ๊ฐ€๋‚˜๋‹ค 
3.3 ๋งˆ์น˜๋ฉฐ


3์žฅ์—์„œ๋Š” ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ์—์„œ ์ด์šฉํ•  ์ˆ˜ ์žˆ๋Š” ํƒ€์ž…์„ ์‚ดํŽด๋ณด๊ณ , ๊ฐ๊ฐ์˜ ํƒ€์ž…์œผ๋กœ ๋ฌด์—‡์„ ํ•  ์ˆ˜ ์žˆ๋Š”์ง€๋ฅผ ๋‹ค๋ฃจ๊ณ  ์žˆ๋‹ค.

์ „์ฒด ๊ฐœ์š”

3.1 ํƒ€์ž…์„ ์ด์•ผ๊ธฐํ•˜๋‹ค

ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ๋Š” ํŠน์ • ํƒ€์ž…๋งŒ ์™€์•ผ ํ•  ๋•Œ ์ด๋ฅผ ๋ช…์‹œํ•  ์ˆ˜ ์žˆ๋Š” ์–ธ์–ด๋‹ค.

 

3.2 ํƒ€์ž…์˜ ๊ฐ€๋‚˜๋‹ค

ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ๊ฐ€ ์ง€์›ํ•˜๋Š” ๊ฐ๊ฐ์˜ ํƒ€์ž…์„ ์‚ดํŽด๋ณด๋ฉฐ ๊ฐ ํƒ€์ž…์ด ๋ฌด์—‡์„ ํฌํ•จํ•  ์ˆ˜ ์žˆ๋Š”์ง€, ์–ด๋–ค ๋™์ž‘์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๋Š”์ง€๋ฅผ ์‚ดํŽด๋ณด์ž. ํƒ€์ž… ๋ณ„์นญ(type alias), ์œ ๋‹ˆ์˜จ ํƒ€์ž…(union type), ์ธํ„ฐ์„น์…˜ ํƒ€์ž…(intersection type) ๋“ฑ ์—ฌ๋Ÿฌ ๊ฐ€์ง€ ์–ธ์–ด ๊ธฐ๋Šฅ๋„ ํ™•์ธํ•œ๋‹ค.


3.2.1 any

any๋กœ๋Š” ๋ญ๋“ ์ง€ ํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ๊ผญ ํ•„์š”ํ•œ ์ƒํ™ฉ์ด ์•„๋‹ˆ๋ผ๋ฉด ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ๊ฒƒ์ด ์ข‹๋‹ค. ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ์—์„œ๋Š” ์ปดํŒŒ์ผ ํƒ€์ž„์— ๋ชจ๋‘๊ฐ€ ํƒ€์ž…์ด ์žˆ์–ด์•ผ ํ•˜๋ฏ€๋กœ ํ”„๋กœ๊ทธ๋ž˜๋จธ์™€ ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ ๋‘˜ ๋‹ค ํƒ€์ž…์„ ์•Œ ์ˆ˜ ์—†๋Š” ์ƒํ™ฉ์—์„œ๋Š” ๊ธฐ๋ณธ ํƒ€์ž…์ธ any๋ผ๊ณ  ๊ฐ€์ •ํ•œ๋‹ค.
any๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๊ฐ’์ด ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์ฒ˜๋Ÿผ ๋™์ž‘ํ•˜๊ธฐ ์‹œ์ž‘ํ•˜๋ฉด์„œ ํƒ€์ž„๊ฒ€์‚ฌ๊ธฐ๊ฐ€ ๋” ์ด์ƒ ์ž‘๋™ํ•˜์ง€ ์•Š๊ฒŒ ๋œ๋‹ค. ๋”ฐ๋ผ์„œ ๋˜๋„๋ก any๋ฅผ ํ”ผํ•˜๋Š” ๊ฒƒ์ด ์ข‹๋‹ค.

๋“œ๋ฌธ ์ƒํ™ฉ์ด์ง€๋งŒ any๊ฐ€ ๊ผญ ํ•„์š”ํ•˜๋‹ค๋ฉด ๋‹ค์Œ์ฒ˜๋Ÿผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

let a: any = 666  // any
let b: any = ['danger']  // any
let c = a + b  // any, ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ์— ๋‘ ๊ฐœ์˜ any๋ฅผ ๋”ํ•˜๋ผ๊ณ  ์ง€์‹œํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— ์„ธ ๋ฒˆ์งธ ์ค„์—์„œ๋Š” ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•˜์ง€ ์•Š๋Š”๋‹ค.

any๋ฅผ ์‚ฌ์šฉํ•˜๋ ค๋ฉด ๋ช…์‹œ์ ์œผ๋กœ ์„ ์–ธํ•ด์•ผ ํ•œ๋‹ค. ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ๊ฐ€ ์–ด๋–ค ๊ฐ’์„ any๋กœ ์ถ”๋ก ํ•ด์•ผ ํ•˜๋Š” ์ƒํ™ฉ์ด๋ผ๋ฉด ํŽธ์ง‘๊ธฐ์— ๋นจ๊ฐ„ ๋ฐ‘์ค„์ด ํ‘œ์‹œ๋˜๋ฉด์„œ ์ปดํŒŒ์ผ ํƒ€์ž„ ์˜ˆ์™ธ๊ฐ€ ๋ฐœ์ƒํ•  ๊ฒƒ์ด๋‹ค. a์™€ b์˜ ํƒ€์ž…์„ ๋ช…์‹œ์ ์œผ๋กœ any ํƒ€์ž…(: any)์œผ๋กœ ์„ค์ •ํ•ด ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ์—๊ฒŒ ๊ฐœ๋ฐœ์ž์˜ ์˜๋„ํ•˜๋Š” ๋ฐ”๋ฅผ ์•Œ๋ ค์ค„ ์ˆ˜ ์žˆ์œผ๋ฉด ์˜ˆ์™ธ๋Š” ๋ฐœ์ƒํ•˜์ง€ ์•Š๋Š”๋‹ค. 

TSC ํ”Œ๋ž˜๊ทธ: nolmplicitAny
ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ์˜ ๊ธฐ๋ณธ ์„ค์ •์€ ์ž์œ ๋ฅผ ํ—ˆ์šฉํ•˜๋ฏ€๋กœ any๋กœ ์ถ”๋ก ๋˜๋Š” ๊ฐ’์„ ๋ฐœ๊ฒฌํ•˜๋”๋ผ๋„ ์˜ˆ์™ธ๋ฅผ ๋ฐœ์ƒ์‹œํ‚ค์ง€ ์•Š๋Š”๋‹ค. ๊ทธ๋Ÿฌ๋‹ˆ ์•”๋ฌต์ ์ธ any๊ฐ€ ๋‚˜ํƒ€๋‚ฌ์„ ๋•Œ ์˜ˆ์™ธ๋ฅผ ์ผ์œผํ‚ค๊ณ  ์‹ถ๋‹ค๋ฉด tsconfig.json ํŒŒ์ผ์—์„œ noImplicitAny ํ”Œ๋ž˜๊ทธ๋ฅผ ํ™œ์„ฑํ™”ํ•˜์ž.


3.2.2 unknown

ํƒ€์ž…์„ ๋ฏธ๋ฆฌ ์•Œ ์ˆ˜ ์—†๋Š” ์–ด๋–ค ๊ฐ’์ด ์žˆ์„ ๋•Œ any ๋Œ€์‹  unknown์„ ์‚ฌ์šฉํ•˜์ž. any์ฒ˜๋Ÿผ unknown๋„ ๋ชจ๋“  ๊ฐ’์„ ๋Œ€ํ‘œํ•˜์ง€๋งŒ, unknown์˜ ํƒ€์ž…์„ ๊ฒ€์‚ฌํ•ด ์ •์ œ(refine)ํ•˜๊ธฐ ์ „๊นŒ์ง€๋Š” ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ๊ฐ€ unknown ํƒ€์ž…์˜ ๊ฐ’์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†๊ฒŒ ๊ฐ•์ œํ•œ๋‹ค.

unknown์€ ๋น„๊ต ์—ฐ์‚ฐ(==, ===, ||, &&, ?)๊ณผ ๋ฐ˜์ „(!) ์—ฐ์‚ฐ์„ ์ง€์›ํ•˜๊ณ  ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์˜ typeof, instanceof ์—ฐ์‚ฐ์ž๋กœ ์ •์ œํ•  ์ˆ˜ ์žˆ๋‹ค.

let a: unknown = 30  // unknown
let b = a === 123  // boolean
let c = a + 10  // ์—๋Ÿฌ TS2571: ๊ฐ์ฒด์˜ ํƒ€์ž…์ด 'unknown'์ž„
if (typeof a === 'number') {
	let d = a + 10  // number
}
  1. ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ๊ฐ€ ๋ฌด์–ธ๊ฐ€์˜ ํƒ€์ž…์„ unknown์ด๋ผ๊ณ  ์ถ”๋ก ํ•˜๋Š” ์ƒํ™ฉ์€ ์—†๋‹ค. unknown ํƒ€์ž…์„ ์‚ฌ์šฉํ•˜๊ณ ์ž ํ•œ๋‹ค๋ฉด ๊ฐœ๋ฐœ์ž๊ฐ€ ๋ช…์‹œ์ ์œผ๋กœ ์„ค์ •ํ•ด์•ผ ํ•œ๋‹ค(a).
  2. unknown ํƒ€์ž…์ด ์•„๋‹Œ ๊ฐ’๊ณผ unknown ํƒ€์ž…์ธ ๊ฐ’์„ ๋น„๊ตํ•  ์ˆ˜ ์žˆ๋‹ค(b).
  3. ํ•˜์ง€๋งŒ unknown ๊ฐ’์ด ํŠน์ • ํƒ€์ž…์ด๋ผ๊ณ  ๊ฐ€์ •ํ•˜๊ณ  ํ•ด๋‹น ํƒ€์ž…์—์„œ ์ง€์›ํ•˜๋Š” ๋™์ž‘์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜๋Š” ์—†๋‹ค(c). ๋จผ์ € ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ์—๊ฒŒ ํ•ด๋‹น ๊ฐ’์ด ํŠน์ • ํƒ€์ž…์ž„์„ ์ฆ๋ช…ํ•ด์•ผ ํ•œ๋‹ค(d).


3.2.3 boolean

boolean ํƒ€์ž…์€ ๋น„๊ต ์—ฐ์‚ฐ(==, ===, ||, &&, ?)๊ณผ ๋ฐ˜์ „(!) ์—ฐ์‚ฐ์„ ์ง€์›ํ•œ๋‹ค.

let a = true  // boolean
var b = false  // boolean
const c = true  // true
let d: boolean = true  // boolean
let e: true = true  // true
let f: true = false  // error: 'false' ํƒ€์ž…์„ 'true' ํƒ€์ž…์— ํ• ๋‹นํ•  ์ˆ˜ ์—†์Œ
  1. ์–ด๋–ค ๊ฐ’์ด boolean์ธ์ง€ ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ๊ฐ€ ์ถ”๋ก ํ•˜๊ฒŒ ํ•œ๋‹ค(a, b).
  2. ์–ด๋–ค ๊ฐ’์ด ํŠน์ • boolean์ธ์ง€ ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ๊ฐ€ ์ถ”๋ก ํ•˜๊ฒŒ ํ•œ๋‹ค(c).
  3. ๊ฐ’์ด boolean์ž„์„ ๋ช…์‹œ์ ์œผ๋กœ ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ์— ์•Œ๋ฆฐ๋‹ค(d).
  4. ๊ฐ’์ด ํŠน์ • boolean์ž„์„ ๋ช…์‹œ์ ์œผ๋กœ ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ์— ์•Œ๋ฆฐ๋‹ค(e, f).

์‹ค์ œ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์—์„œ๋Š” ๋ณดํ†ต ์ฒซ ๋ฒˆ์งธ, ๋‘ ๋ฒˆ์งธ ๋ฐฉ๋ฒ•์„ ์‚ฌ์šฉํ•˜๊ณ  ์„ธ ๋ฒˆ์งธ ๋ฐฉ๋ฒ•์€ ๊ฑฐ์˜ ์‚ฌ์šฉํ•  ์ผ์ด ์—†๋‹ค.

๋‘ ๋ฒˆ์งธ์™€ ๋„ค ๋ฒˆ์งธ ๋ฐฉ๋ฒ•์€ ์ง๊ด€์ ์ด์ง€๋งŒ ์ด๋Ÿฐ ๊ธฐ๋Šฅ์„ ์ง€์›ํ•˜๋Š” ์–ธ์–ด๊ฐ€ ๊ฑฐ์˜ ์—†๋‹ค. ์ด ์˜ˆ์ œ๋Š” ๊ฐ’์„ ํƒ€์ž…์œผ๋กœ ์‚ฌ์šฉํ•˜๋ฏ€๋กœ e์™€ f์— ์‚ฌ์šฉํ•  ์ˆ˜ ์ž‡๋Š” ๊ฐ’์€ boolean ์ฐจ๋น„์ด ๊ฐ€์งˆ ์ˆ˜ ์žˆ๋Š” ๊ฐ’ ์ค‘ ํŠน์ •ํ•œ ํ•˜๋‚˜์˜ ๊ฐ’์œผ๋กœ ํ•œ์ •๋œ๋‹ค. ์ด ๊ธฐ๋Šฅ์„ ํƒ€์ž… ๋ฆฌํ„ฐ๋Ÿด์ด๋ผ ๋ถ€๋ฅธ๋‹ค.

ํƒ€์ž… ๋ฆฌํ„ฐ๋Ÿด(type literal)
์˜ค์ง ํ•˜๋‚˜์˜ ๊ฐ’์„ ๋‚˜ํƒ€๋‚ด๋Š” ํƒ€์ž…

๋„ค ๋ฒˆ์จฐ ์ค„์—์„œ ๋ณ€์ˆ˜๋ฅผ ๋ช…์‹œ์ ์œผ๋กœ ํƒ€์ž… ๋ฆฌํ„ฐ๋Ÿด๋กœ ์„ค์ •ํ–ˆ์œผ๋ฉฐ ์„ธ ๋ฒˆ์งธ ์ค„์—์„œ๋Š” var๋‚˜ let ๋Œ€์‹  const๋ฅผ ์‚ฌ์š”ํ•˜์—ฌ ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ๊ฐ€ ์ž๋™์œผ๋กœ ๋ณ€์ˆ˜์˜ ํƒ€์ž…์„ ๋ฆฌํ„ฐ๋Ÿด๋กœ ์ถ”๋ก ํ–ˆ๋‹ค.(const๋ฅผ ์‚ฌ์šฉํ–ˆ์œผ๋ฏ€๋กœ ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ๋Š” ๊ทธ ๋ณ€์ˆ˜์˜ ๊ฐ’์ด ์ ˆ๋Œ€ ๋ณ€ํ•˜์ง€ ์•Š์„ ๊ฒƒ์ž„์„ ์•Œ๊ฒŒ ๋˜์–ด ๊ฐ€์žฅ ์ข์€ ํƒ€์ž…์œผ๋กœ ์ถ”๋ก ํ•œ๊ฑฐ์ž„) ํƒ€์ž… ๋ฆฌํ„ฐ๋Ÿด์€ ๋ชจ๋“  ๊ณณ์—์„œ ์ผ์–ด๋‚  ์ˆ˜ ์žˆ๋Š” ์‹ค์ˆ˜๋ฅผ ๋ฐฉ์ง€ํ•ด ์•ˆ์ „์„ฑ์„ ์ถ”๊ฐ€๋กœ ํ™•๋ณดํ•ด์ฃผ๋Š” ๊ฐ•๋ ฅํ•œ ์–ธ์–ด ๊ธฐ๋Šฅ์ด๋‹ค.


3.2.4 number

number ํƒ€์ž…์€ ๋ชจ๋“  ์ˆซ์ž์˜ ์ง‘ํ•ฉ์ด๋‹ค. ๋ง์…ˆ(+), ๋บ„์…ˆ(-), ๋ชจ๋“ˆ๋กœ(%), ๋น„๊ต(<) ๋“ฑ์˜ ์ˆซ์ž ๊ด€๋ จ ์—ฐ์‚ฐ์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๋‹ค.

let a = 1234  // number
var b = infinity * 0.10  // number
const c = 5678  // 5678
let d = a < b  // boolean
let e: number = 100  // number
let f: 26.218 = 26.218  // 26.218
let g: 26.218 = 10  // error: '10' ํƒ€์ž…์„ '26.218' ํƒ€์ž…์— ํ• ๋‹นํ•  ์ˆ˜ ์—†์Œ
  1. ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ๊ฐ€ ๊ฐ’์ด number์ž„์„ ์ถ”๋ก ํ•˜๊ฒŒ ํ•œ๋‹ค(a, b). → ๊ฐœ๋ฐœ์ž ์ฃผ๋กœ ์‚ฌ์šฉ
  2. const๋ฅผ ์ด์šฉํ•ด ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ๊ฐ€ ๊ฐ’์ด ํŠน์ • number์ž„์„ ์ถ”๋ก ํ•˜๊ฒŒ ํ•œ๋‹ค(c). → ๊ฐœ๋ฐœ์ž ๊ฐ€๋” ์‚ฌ์šฉ
  3. ๊ฐ’์ด number์ž„์„ ๋ช…์‹œ์ ์œผ๋กœ ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ์— ์•Œ๋ฆฐ๋‹ค(e). → ๊ฑฐ์˜ ์‚ฌ์šฉ X
  4. ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ์— ๊ฐ’์ด ํŠน์ • number์ž„์„ ๋ช…์‹œ์ ์œผ๋กœ ์•Œ๋ฆฐ๋‹ค(f, g). → ๊ฐœ๋ฐœ์ž ๊ฐ€๋” ์‚ฌ์šฉ


3.2.5 bigint

bigint๋Š” ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์™€ ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ์— ์ƒˆ๋กœ ์ถ”๊ฐ€๋œ ํƒ€์ž…์œผ๋กœ, ์ด๋ฅผ ์ด์šฉํ•˜๋ฉด ๋ผ์šด๋”ฉ ๊ด€๋ จ ์—๋Ÿฌ ๊ฑฑ์ • ์—†์ด ํฐ ์ •์ˆ˜๋ฅผ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋‹ค.(number๋Š” 2โต³๊นŒ์ง€์˜ ์ •์ˆ˜๋ฅผ ํ‘œํ˜„ํ•  ์ˆ˜ ์žˆ์ง€๋งŒ bigint๋ฅผ ์ด์šฉํ•˜๋ฉด ์ด๋ณด๋‹ค ํฐ ์ˆ˜๋„ ํ‘œํ˜„ํ•  ์ˆ˜ ์žˆ์Œ) ๋˜ํ•œ bigint ๋ฆฌํ„ฐ๋Ÿด์€ ๋ฐ˜๋“œ์‹œ ์ •์ˆ˜์—ฌ์•ผ ํ•œ๋‹ค.


3.2.6 string

stirng์€ ๋ชจ๋“  ๋ฌธ์ž์—ด์˜ ์ง‘ํ•ฉ์œผ๋กœ ์—ฐ๊ฒฐ(+), ์Šฌ๋ผ์ด์Šค(.slice)๋“ฑ์˜ ์—ฐ์‚ฐ์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๋‹ค. boolean์ด๋‚˜ number ์ฒ˜๋Ÿผ string ํƒ€์ž…๋„ ๋„ค ๊ฐ€์ง€ ๋ฐฉ๋ฒ•์œผ๋กœ ์„ ์–ธํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ ๊ฐ€๋Šฅํ•˜๋‹ค๋ฉด ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ๊ฐ€ string ํƒ€์ž…์„ ์ถ”๋ก ํ•˜๋„๋ก ๋‘๋Š” ๊ฒƒ์ด ์ข‹๋‹ค. 


3.2.7 symbol

symbol์€ ES2015์— ์ƒˆ๋กœ ์ถ”๊ฐ€๋œ ๊ธฐ๋Šฅ์ด๋‹ค. ์‹ค๋ฌด์—์„œ๋Š” ์ž์ฃผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ํŽธ์ด๋ฉฐ ๊ฐ์ฒด์™€ ๋งต์—์„œ ๋ฌธ์ž์—ด ํ‚ค๋ฅผ ๋Œ€์‹ ํ•˜๋Š” ์šฉ๋„๋กœ ์‚ฌ์šฉํ•œ๋‹ค. ์‹ฌ๋ฒŒํ‚ค๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์‚ฌ๋žŒ๋“ค์ด ์ž˜ ์•Œ๋ ค์ง„ ํ‚ค๋งŒ ์‚ฌ์šฉํ•˜๋„๋ก ๊ฐ•์ œํ•  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ํ‚ค๋ฅผ ์ž˜๋ชป ์„ค์ •ํ•˜๋Š” ์‹ค์ˆ˜๋ฅผ ๋ฐฉ์ง€ํ•œ๋‹ค. 

let a = Symbol('a')  // symbol
let b:symbol = Symbol('b')  // symbol
let c = a === b  // boolean
let d = a + 'x'  // error: '+'์—ฐ์‚ฐ์„ 'symbol'ํƒ€์ž…์— ์ ์šฉํ•  ์ˆ˜ ์—†์Œ

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์—์„œ Symbol('a')๋Š” ์ฃผ์–ด์ง„ ์ด๋ฆ„์œผ๋กœ ์ƒˆ๋กœ์šด symbol์„ ๋งŒ๋“ ๋‹ค๋Š” ์˜๋ฏธ๋‹ค. ๋งŒ๋“ค์–ด์ง„ symbol์€ ๊ณ ์œ (unique)ํ•˜์—ฌ ๋‹ค๋ฅธ symbol๊ณผ == ๋˜๋Š” ===๋กœ ๋น„๊ตํ–ˆ์„ ๋•Œ ๊ฐ™์ง€ ์•Š๋‹ค๊ณ  ํŒ๋‹จ๋œ๋‹ค.(์‹ฌ์ง€์–ด ๊ฐ™์€ ์ด๋ฆ„์œผ๋กœ ๋‹ค๋ฅธ symbol์„ ๋งŒ๋“ค์–ด๋„ ๋งˆ์ฐฌ๊ฐ€์ง€์ž„) symbol๋„ symbol ํƒ€์ž…์œผ๋กœ ์ถ”๋ก ๋˜๊ฑฐ๋‚˜ ๋ช…์‹œ์ ์œผ๋กœ unique symbol์„ ์ •์˜ํ•  ์ˆ˜ ์žˆ๋‹ค. ์•„๋ž˜ ์—์‹œ๋Š” unique symbol์„ ๋งŒ๋“œ๋Š” ๋ช‡ ๊ฐ€์ง€ ๋ฐฉ๋ฒ•์ด๋‹ค.

const e = Symbol('e')  // typeof e
const f: unique symbol = Symbol('f')  // typeof f
let g: unique symbol = Symbol('f')  // 'unique symbol' ํƒ€์ž…์€ ๋ฐ˜๋“œ์‹œ 'const'์—ฌ์•ผ ํ•จ
let h = e === e  // boolean
let i = e === f  // error: 'unique symbol'ํƒ€์ž…์€ ์„œ๋กœ ๊ฒน์น˜๋Š” ์ผ์ด ์—†์œผ๋ฏ€๋กœ ์ด ๋น„๊ต๋ฌธ์˜ ๊ฒฐ๊ณผ๋Š” ํ•ญ์ƒ 'false'
  1. ์ƒˆ symbol์„ ์„ ์–ธํ•˜๊ณ  const ๋ณ€์ˆ˜์— ํ• ๋‹นํ•˜๋ฉด ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ๊ฐ€ unique symbolํƒ€์ž…์œผ๋กœ ์ถ”๋ก ํ•œ๋‹ค. ์ฝ”๋“œ ํŽธ์ง‘๊ธฐ์—์„œ๋Š” unique symbol์ด ์•„๋‹ˆ๋ผ 'typeof ๋ณ€์ˆ˜๋ช…' ํ˜•ํƒœ๋กœ ๋ณด์—ฌ์ค„ ๊ฒƒ์ด๋‹ค.
  2. const ๋ณ€์ˆ˜์˜ ํƒ€์ž…์„ unique symbol๋กœ ๋ช…์‹œ์ ์œผ๋กœ ์ •์˜ํ•  ์ˆ˜ ์žˆ๋‹ค.
  3. ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ๋Š” ์ปดํŒŒ์ผ ํƒ€์ž„์— unique symbol์ด ๋‹ค๋ฅธ unique symbol๊ณผ ๊ฐ™์ง€ ์•Š์„ ๊ฒƒ์ด๋ผ๋Š” ์‚ฌ์‹ค์„ ์•Œ ์ˆ˜ ์žˆ๋‹ค.

unique symbol๋„ ๊ฒฐ๊ตญ 1, true, "literal" ๋“ฑ ๋‹ค๋ฅธ ๋ฆฌํ„ฐ๋Ÿด ํƒ€์ž…๊ณผ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ํŠน์ • symbol์„ ๋‚˜ํƒ€๋‚ด๋Š” ํƒ€์ž…์ด๋‹ค.


3.2.8 ๊ฐ์ฒด

ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ์˜ ๊ฐ์ฒด(object) ํƒ€์ž…์€ ๊ฐ์ฒด์˜ ํ˜•ํƒœ(shape)์„ ์ •์˜ํ•œ๋‹ค. ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ ๋˜ํ•œ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์™€ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ๊ตฌ์กฐ ๊ธฐ๋ฐ˜ ํƒ€์ž…(structural type)์„ ๊ฐ–๋„๋ก ์„ค๊ณ„๋˜์–ด ์žˆ๋‹ค.

๊ตฌ์กฐ ๊ธฐ๋ฐ˜ ํƒ€์ž…ํ™”
๊ตฌ์กฐ ๊ธฐ๋ฐ˜ ํƒ€์ž…ํ™”์—์„œ๋Š” ๊ฐ์ฒด์˜ ์ด๋ฆ„์— ์ƒ๊ด€์—†์ด ๊ฐ์ฒด๊ฐ€ ์–ด๋–ค ํ”„๋กœํผํ‹ฐ๋ฅผ ๊ฐ–๊ณ  ์žˆ๋Š”์ง€๋ฅผ ๋”ฐ์ง„๋‹ค.(์ด๋ฆ„ ๊ธฐ๋ฐ˜์—์„œ๋Š” ์ด๋ฆ„์„ ๋”ฐ์ง) ์ผ๋ถ€ ์–ธ์–ด์—์„œ๋Š” ๋• ํƒ€์ดํ•‘(duck typing)์ด๋ผ๊ณ  ํ•œ๋‹ค.

ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ์—์„œ ๊ฐ์ฒด๋ฅผ ์„œ์ˆ ํ•˜๋Š” ๋ฐ ํƒ€์ž…์„ ์ด์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

1) object ํƒ€์ž…. ์–ด๋–ค ํ•„๋“œ๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๋Š”์ง€๋Š” ๊ด€์‹ฌ์ด ์—†๊ณ , ๊ทธ์ € ๊ฐ์ฒด๊ฐ€ ํ•„์š”ํ•  ๋•Œ ์‚ฌ์šฉ

let a: object = {
	b: 'x'
}

a.b  // error: 'b' ํ”„๋กœํผํ‹ฐ๋Š” 'object'์— ์กด์žฌํ•˜์ง€ ์•Š์Œ

object๋Š” any๋ณด๋‹ค ์กฐ๊ธˆ ๋” ์ข์€ ํƒ€์ž…์œผ๋กœ object๋Š” ์„œ์ˆ ํ•˜๋Š” ๊ฐ’์— ๊ด€ํ•œ ์ •๋ณด๋ฅผ ๊ฑฐ์˜ ์•Œ๋ ค์ฃผ์ง€ ์•Š์œผ๋ฉฐ, ๊ฐ’ ์ž์ฒด๊ฐ€ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๊ฐ์ฒด๋ผ๊ณ (๊ทธ๋ฆฌ๊ณ  null์ด ์•„๋‹ˆ๋ผ๊ณ ) ๋งํ•ด์ค„ ๋ฟ์ด๋‹ค.


2) ๊ฐ์ฒด ๋ฆฌํ„ฐ๋Ÿด ๋˜๋Š” ํ˜•ํƒœ๋ผ ๋ถˆ๋ฆฌ๋Š” ํ‘œ๊ธฐ๋ฒ•({a: string}). ๊ฐ์ฒด๊ฐ€ ์–ด๋–ค ํ•„๋“œ๋ฅผ ํฌํ•จํ•  ์ˆ˜ ์žˆ๋Š”์ง€ ์•Œ๊ณ  ์žˆ๊ฑฐ๋‚˜ ๊ฐ์ฒด์˜ ๋ชจ๋“  ๊ฐ’์ด ๊ฐ™์€ ํƒ€์ž…์„ ๊ฐ€์งˆ ๋•Œ ์‚ฌ์šฉ

ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ๊ฐ€ c์˜ ํ˜•ํƒœ๋ฅผ ์ถ”๋ก ํ•˜๊ฒŒ ํ•˜๊ฑฐ๋‚˜ ์ค‘๊ด„ํ˜ธ({}) ์•ˆ์—์„œ ๋ช…์‹œ์ ์œผ๋กœ ํƒ€์ž…์„ ๋ฌ˜์‚ฌํ•  ์ˆ˜ ์žˆ๋‹ค.

// ํ˜•ํƒœ ์ถ”๋ก 
let a = {
	b: 'x'
}  // {b: string}

a.b  // string

let b = {
	c: {
    	d: 'f'
    }
}  // {c: {d: string}}


// {}์•ˆ์— ๋ช…์‹œ์ ์œผ๋กœ ํƒ€์ž… ๋ฌ˜์‚ฌ
let a: {b: number} = {
	b: 12
}  // {b: number}


๊ฐ์ฒด ๋ฆฌํ„ฐ๋Ÿด ๋ฌธ๋ฒ•์€ '์ด๋Ÿฐ ํ˜•ํƒœ์˜ ๋ฌผ๊ฑด์ด ์žˆ์–ด'๋ผ๊ณ  ๋งํ•œ๋‹ค. ์ด ๋ฌผ๊ฑด์€ ๊ฐ์ฒด ๋ฆฌํ„ฐ๋Ÿด ๋˜๋Š” ํด๋ž˜์Šค ์ผ ์ˆ˜ ์žˆ๋‹ค.

let c: {
	name: string
} = {
	name: 'jaejae'
}

class Person{
	constructor{
    	public name: string  // public์€ this.name = name์„ ๋‹จ์ถ•ํ•œ ๊ฒƒ
    } { }
}
c = new Person('jae')  // OK

{name:string} ์€ ๊ฐ์ฒด์˜ ํ˜•ํƒœ๋ฅผ ๋ฌ˜์‚ฌํ•˜๋ฉฐ ๊ฐ์ฒด ๋ฆฌํ„ฐ๋Ÿด๊ณผ ํด๋ž˜์Šค ์ธ์Šคํ„ด์Šค ๋ชจ๋‘ ์ด ํ˜•ํƒœ๋ฅผ ๋งŒ์กฑํ•˜๋ฏ€๋กœ ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ๋Š” Person์„ c๋กœ ํ• ๋‹นํ•˜๋Š” ๋™์ž‘์„ ํ—ˆ์šฉํ•œ๋‹ค.

๊ธฐ๋ณธ์ ์œผ๋กœ ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ๋Š” ๊ฐ์ฒด ํ”„๋กœํผํ‹ฐ์— ์—„๊ฒฉํ•œ ํŽธ์ธ๋ฐ, ์˜ˆ๋ฅผ ๋“ค์–ด ๊ฐ์ฒด์— number ํƒ€์ž…์˜ b๋ผ๋Š” ํ”„๋กœํผํ‹ฐ๊ฐ€ ์žˆ์–ด์•ผ ํ•œ๋‹ค๊ณ  ์ •์˜ํ•˜๋ฉด ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ๋Š” b๋ฅผ ๊ธฐ๋Œ€ํ•˜๊ณ  b๊ฐ€ ์—†๊ฑฐ๋‚˜ ๋‹ค๋ฅธ ์ถ”๊ฐ€ ํ”„๋กœํผํ‹ฐ๊ฐ€ ์žˆ์œผ๋ฉด ์—๋Ÿฌ๋ฅผ ๋ฐœ์ƒ์‹œํ‚จ๋‹ค. ?๋‚˜ ์ธ๋ฑ์Šค ์‹œ๊ทธ๋‹ˆ์ฒ˜๋ฅผ ์‚ฌ์šฉํ•ด ์–ด๋–ค ํ”„๋กœํผํ‹ฐ๋Š” ์„ ํƒํ˜•์ด๊ณ  ์˜ˆ์ •์— ์—†๋˜ ํ”„๋กœํผํ‹ฐ๊ฐ€ ์ถ”๊ฐ€๋  ์ˆ˜ ์žˆ๋‹ค๊ณ  ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ์— ์•Œ๋ ค์ค„ ์ˆ˜ ์žˆ๋‹ค.

์ธ๋ฑ์Šค ์‹œ๊ทธ๋‹ˆ์ฒ˜(index signature)
[key: T]: U ๊ฐ™์€ ๋ฌธ๋ฒ•์€ ์ธ๋ฑ์Šค ์‹œ๊ทธ๋‹ˆ์ฒ˜๋ผ ๋ถ€๋ฅด๋ฉฐ ํƒ€์ž…์Šคํฌ๋ฆฝ์— ์–ด๋–ค ๊ฐ์ฒด๊ฐ€ ์—ฌ๋Ÿฌ ํ‚ค๋ฅผ ๊ฐ€์งˆ ์ˆ˜ ์žˆ์Œ์„ ์•Œ๋ ค์ค€๋‹ค. "์ด ๊ฐ์ฒด์—์„œ ๋ชจ๋“  T ํƒ€์ž…์˜ ํ‚ค๋Š” U ํƒ€์ž…์„ ๊ฐ–๋Š”๋‹ค"๋ผ๊ณ  ํ•ด์„ํ•  ์ˆ˜ ์žˆ๋‹ค. ์ธ๋ฑ์Šค ์‹œ๊ทธ๋‹ˆ์ฒ˜์˜ ํ‚ค(T)๋Š” ๋ฐ˜๋“œ์‹œ number๋‚˜ stirng ํƒ€์ž…์— ํ• ๋‹นํ•  ์ˆ˜ ์žˆ๋Š” ํƒ€์ž…์ด์–ด์•ผ ํ•œ๋‹ค. ์ธ๋ฑ์Šค ์‹œ๊ทธ๋‹ˆ์ฒ˜์˜ ํ‚ค ์ด๋ฆ„์€ ์›ํ•˜๋Š” ์ด๋ฆ„์„ ๊ฐ€์ ธ๋‹ค ๋ฐ”๊ฟ”๋„ ๋œ๋‹ค(key๊ฐ€ ์•„๋‹ˆ์–ด๋„ ๋œ๋‹ค๋Š” ๋œป)
let a: {
	b: number
    c?: string  // ์„ ํƒํ˜•(?)
    [key: number]: boolean  // ์˜ˆ์ •์— ์—†๋˜ ํ”„๋กœํ„ฐํ”ผ ์ถ”๊ฐ€๋  ์ˆ˜ ์žˆ์Œ
}


๊ฐ์ฒด ํƒ€์ž…์„ ์ •์˜ํ•  ๋•Œ ์„ ํƒํ˜•(?)๋งŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์€ ์•„๋‹ˆ๋‹ค. ํ•„์š”ํ•˜๋‹ค๋ฉด readonly ํ•œ์ •์ž๋ฅผ ์ด์šฉํ•ด ํŠน์ • ํ•„๋“œ๋ฅผ ์ฝ๊ธฐ ์ „์šฉ์œผ๋กœ ์ •์˜ํ•  ์ˆ˜ ์žˆ๋‹ค.(์ •์˜ํ•œ ํ•„๋“œ์— ์ดˆ๊นƒ์‚พ์„ ํ• ๋‹นํ•œ ๋‹ค์Œ์—๋Š” ๊ทธ ๊ฐ’์„ ๋ฐ”๊ฟ€ ์ˆ˜ ์—†๋‹ค. ๊ฐ์ฒด ํ”„๋กœํผํ‹ฐ์— const๋ฅผ ์ ์šฉํ•œ ๋“ฏํ•œ ํšจ๊ณผ)

let user: {
	readonly name: string
} = {
	name = 'jaejae'
}
user.name  // string
user.name = 
	'jaejae like apple'  // error: 'name'์€ ์ฝ๊ธฐ ์ „์šฉ ํ”„๋กœํผํ‹ฐ์ด๋ฏ€๋กœ ํ• ๋‹นํ•  ์ˆ˜ ์—†์Œ


3) ๋นˆ ๊ฐ์ฒด ๋ฆฌํ„ฐ๋Ÿด ํ‘œ๊ธฐ๋ฒ•({}).์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ๊ฒƒ์ด ์ข‹์Œ

null๊ณผ undefined๋ฅผ ์ œ์™ธํ•œ ๋ชจ๋“  ํƒ€์ž…์€ ๋นˆ ๊ฐ์ฒด ํƒ€์ž…์— ํ• ๋‹นํ•  ์ˆ˜ ์ž‡์œผ๋‚˜, ์ด๋Š” ์‚ฌ์šฉํ•˜๊ธฐ ๊นŒ๋‹ค๋กญ๊ฒŒ ๋งŒ๋“ค๊ธฐ ๋•Œ๋ฌธ์— ๊ฐ€๋Šฅํ•œ ํ•œ ๋นˆ ๊ฐ์ฒด๋ฅผ ํ”ผํ•˜๋Š” ๊ฒƒ์ด ์ข‹๋‹ค


4) Object ํƒ€์ž…. ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ๊ฒƒ์ด ์ข‹์Œ


3.2.9 ํœด์‹ ์‹œ๊ฐ„: ํƒ€์ž… ๋ณ„์นญ, ์œ ๋‹ˆ์˜จ, ์ธํ„ฐ์„น์…˜

๊ฐ’์ด ์žˆ์œผ๋ฉด ๊ฐ’์˜ ํƒ€์ž…์ด ๋ฌด์—‡์ธ์ง€์— ๋”ฐ๋ผ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๋Š” ์—ฐ์‚ฐ์ด ๋‹ฌ๋ผ์ง„๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด +๋กœ ๋‘ ์ˆซ์ž๋ฅผ ๋”ํ•˜๊ฑฐ๋‚˜ .yoUpperCase๋กœ ๋ฌธ์ž์—ด์„ ๋Œ€๋ฌธ์ž๋กœ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋‹ค. ๊ฐ’๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ํƒ€์ž…์—๋„ ์–ด๋–ค ๋™์ž‘์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๋‹ค

ํƒ€์ž… ๋ณ„์นญ

type Age = number
type Person = {
	name: string
    age: Age
}

let age = 55
let driver: Person = {
	name: 'jaejae',
    age: age
}

(let, const, var๋กœ) ๋ณ€์ˆ˜๋ฅผ ์„ ์–ธํ•ด์„œ ๊ฐ’ ๋Œ€์‹  ๋ณ€์ˆ˜๋กœ ์นญํ•˜๋“ฏ์ด ํƒ€์ž… ๋ณ„์นญ์œผ๋กœ ํƒ€์ž…์„ ๊ฐ€๋ฅดํ‚ฌ ์ˆ˜ ์žˆ๋‹ค. ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ๋Š” ๋ณ„์นญ์„ ์ถ”๋ก ํ•˜์ง€๋Š” ์•Š์œผ๋ฏ€๋กœ ๋ฐ˜๋“œ์‹œ ๋ณ„์นญ์˜ ํƒ€์ž…์„ ๋ช…์‹œ์ ์œผ๋กœ ์ •์˜ํ•ด์•ผ ํ•œ๋‹ค. ํƒ€์ž… ๋ณ„์นญ์€ ํ”„๋กœ๊ทธ๋žจ์˜ ๋…ผ๋ฆฌ์— ์˜ํ–ฅ์„ ๋ฏธ์น˜์ง€ ์•Š๊ณ  ๋ณ„์นญ์ด ๊ฐ€๋ฆฌํ‚ค๋Š” ํƒ€์ž…์œผ๋กœ ๋Œ€์น˜ํ•  ์ˆ˜ ์žˆ๋‹ค. ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๋ณ€์ˆ˜ ์„ ์–ธ(let, const, var)๊ณผ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ํ•˜๋‚˜์˜ ํƒ€์ž…์„ ๋‘ ๋ฒˆ ์ •์˜ํ•  ์ˆ˜๋Š” ์—†๋‹ค.

let๊ณผ const์ฒ˜๋Ÿผ ํƒ€์ž… ๋ณ„์นญ๋„ ๋ธ”๋ก ์˜์—ญ์— ์ ์šฉ๋œ๋‹ค. ๋ชจ๋“  ๋ธ”๋ก๊ณผ ํ•จ์ˆ˜๋Š” ์ž์‹ ๋งŒ์˜ ์˜์—ญ์„ ๊ฐ€์ง€๋ฏ€๋กœ ๋‚ด๋ถ€์— ์ •์˜ํ•œ ํƒ€์ž… ๋ณ„์นญ์ด ์™ธ๋ถ€์˜ ์ •์˜๋ฅผ ๋ฎ์–ด์“ด๋‹ค(shadowing).

ํƒ€์ž… ๋ณ„์นญ์€ ๋ณต์žกํ•œ ํƒ€์ž…์„ ๋ฐ˜๋ณตํ•˜์ง€ ์•Š๊ฒŒ ํ•ด์ฃผ๋ฉฐ ๋ณ€์ˆ˜๊ฐ€ ์–ด๋–ค ๋ชฉ์ ์œผ๋กœ ์‚ฌ์šฉ๋˜์—ˆ๋Š”์ง€ ์‰ฝ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋„์™€์ค€๋‹ค. ๊ฐ’์„ ๋ณ€์ˆ˜๋กœ ํ• ๋‹นํ• ์ง€๋ฅผ ๊ฒฐ์ •ํ•˜๋Š” ๊ฒƒ๊ณผ ๊ฐ™์€ ๊ธฐ์ค€์œผ๋กœ ํƒ€์ž… ๋ณ„์นญ์„ ์‚ฌ์šฉํ• ์ง€ ์—ฌ๋ถ€๋ฅผ ๊ฒฐ์ •ํ•  ์ˆ˜ ์žˆ๋‹ค.

์œ ๋‹ˆ์˜จ๊ณผ ์ธํ„ฐ์„น์…˜ ํƒ€์ž…

A, B๋ผ๋Š” ๋‘ ์‚ฌ๋ฌผ์ด ์žˆ์„ ๋•Œ ์ด๋ฅผ ์œ ๋‹ˆ์˜จ(ํ•ฉ์ง‘ํ•ฉ)ํ•˜๋ฉด ๋‘˜์„ ํ•ฉ์นœ ๊ฒฐ๊ณผ๊ณผ ๋‚˜์˜ค๋ฉฐ ์ธํ„ฐ์„น์…˜(๊ต์ง‘ํ•ฉ)ํ•˜๋ฉด ๋‘˜์˜ ๊ณตํ†ต ๋ถ€๋ถ„์ด ๊ฒฐ๊ณผ๋กœ ๋‚˜์˜จ๋‹ค. ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ๋Š” ํƒ€์ž…์— ์ ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ํŠน๋ณ„ํ•œ ์—ฐ์‚ฐ์ž์ธ ์œ ๋‹ˆ์˜จ(|)๊ณผ ์ธํ„ฐ์„น์…˜(&)์„ ์ œ๊ณตํ•œ๋‹ค. ํƒ€์ž…์€ ์ง‘ํ•ฉ๊ณผ ๋น„์Šทํ•˜๋ฏ€๋กœ ์ง‘ํ•ฉ์ฒ˜๋Ÿผ ์—ฐ์‚ฐ์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๋‹ค. ์‹ค์ „์—์„œ๋Š” ๋Œ€๊ฐœ ์ธํ„ฐ์„น์…˜๋ณด๋‹ค ์œ ๋‹ˆ์˜จ์„ ์ž์ฃผ ์‚ฌ์šฉํ•œ๋‹ค.


3.2.10 ๋ฐฐ์—ด

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์ฒ˜๋Ÿผ ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ ๋ฐฐ์—ด๊ณผ ์—ฐ๊ฒฐ(concatenation), ํ‘ธ์‹œ(pushing), ๊ฒ€์ƒ‰(searching), ์Šฌ๋ผ์ด์Šค(slicing) ๋“ฑ์„ ์ง€์›ํ•˜๋Š” ํŠน๋ณ„ํ•œ ๊ฐ์ฒด๋‹ค. ๋˜ํ•œ T[]์™€ Array<T>๋ผ๋Š” ๋‘ ๊ฐ€์ง€ ๋ฐฐ์—ด ๋ฌธ๋ฒ•์„ ์ง€์›ํ•œ๋‹ค. ์„ฑ๋Šฅ, ์˜๋ฏธ์ƒ ๋‘ ํ‘œํ˜„์€ ๊ฐ™์œผ๋ฏ€๋กœ ์ž์‹ ์˜ ์ทจํ–ฅ๋Œ€๋กœ ์›ํ•˜๋Š” ๋ฌธ๋ฒ•์„ ์‚ฌ์šฉํ•˜๋ฉด ๋œ๋‹ค.

๋Œ€๊ฐœ๋Š” ๋ฐฐ์—ด์„ ๋™ํ˜•(homogeneous)์œผ๋กœ ๋งŒ๋“ ๋‹ค. ์ฆ‰, ํ•œ ๋ฐฐ์—ด์— ์‚ฌ๊ณผ, ์˜ค๋ Œ์ง€, ์ˆซ์ž๋ฅผ ํ•จ๊ป˜ ์ €์žฅํ•˜์ง€ ์•Š๊ณ  ๋ฐฐ์—ด์˜ ๋ชจ๋“  ํ•ญ๋ชฉ์ด ๊ฐ™์€ ํƒ€์ž…์„ ๊ฐ–๋„๋ก ์„ค๊ณ„ํ•˜๋ ค ๋…ธ๋ ฅํ•œ๋‹ค. ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ์— ๋ฐฐ์—ด๊ณผ ๊ด€๋ จํ•œ ์ž‘์—…์ด ์•ˆ์ „ํ•œ์ง€ ์ฆ๋ช…ํ•ด์•ผ ํ•˜๋ฏ€๋กœ ์ถ”๊ฐ€ ์ž‘์—…์„ ํ•ด์•ผํ•œ๋‹ค.


3.2.11 ํŠœํ”Œ

ํŠœํ”Œ(tuple)์€ ๋ฐฐ์—ด์˜ ์„œ๋ธŒํƒ€์ž…์ด๋‹ค. ํŠœํ”Œ์€ ๊ธธ์ด๊ฐ€ ๊ณ ์ •๋˜์—ˆ๊ณ , ๊ฐ ์ธ๋ฑ์Šค์˜ ํƒ€์ž…์ด ์•Œ๋ ค์ง„ ๋ฐฐ์—ด์˜ ์ผ์ข…์ด๋‹ค. ๋‹ค๋ฅธ ํƒ€์ž…๊ณผ ๋‹ฌ๋ฆฌ ํŠœํ”Œ์€ ์„ ์–ธํ•  ๋•Œ ํƒ€์ž…์„ ๋ช…์‹œํ•ด์•ผ ํ•œ๋‹ค. ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์—์„œ ๋ฐฐ์—ด๊ณผ ํŠœํ”Œ์— ๊ฐ™์€ ๋ฌธ๋ฒ•(๋Œ€๊ด„ํ˜ธ)์„ ์‚ฌ์šฉํ•˜๋Š”๋ฐ ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ์—์„œ๋Š” ๋Œ€๊ด„ํ˜ธ๋ฅผ ๋ฐฐ์—ด ํƒ€์ž…์œผ๋กœ ์ถ”๋ก ํ•˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

let a: [string, string, number] = ['apple', 'orange', 2]
a = ['red', 'yellow', 'blue', 123]  // error: 'string'์€ 'number'ํƒ€์ž…์— ํ• ๋‹นํ•  ์ˆ˜ ์—†์Œ

ํŠœํ”Œ์€ ์„ ํƒํ˜• ์š”์†Œ๋„ ์ง€์›ํ•œ๋‹ค. ๊ฐ์ฒด ํƒ€์ž…์—์„œ์™€ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ?๋Š” '์„ ํƒํ˜•'์„ ๋œปํ•œ๋‹ค. ๋˜ํ•œ ํŠœํ”Œ์ด ์ตœ์†Œ ๊ธธ์ด๋ฅผ ๊ฐ–๋„๋ก ์ง€์ •ํ•  ๋•Œ๋Š” ๋‚˜๋จธ์ง€ ์š”์†Œ(...)๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

// ์„ ํƒํ˜•(?)
let number: [number, number?]] = [
	[3.75],
    [8.25, 7.70],
    [10.50]
]


// ๋‚˜๋จธ์ง€ ์š”์†Œ(...)
let name: [string, ...stirng[]] = ['a', 'b', 'c', 'd']

ํŠœํ”Œ์€ ์ดํ˜•(heterogeneous) ๋ฐฐ์—ด์„ ์•ˆ์ „ํ•˜๊ฒŒ ๊ด€๋ฆฌํ•  ๋ฟ ์•„๋‹ˆ๋ผ ๋ฐฐ์—ด ํƒ€์ž…์˜ ๊ธธ์ด๋„ ์กฐ์ ˆํ•œ๋‹ค. ๋”ฐ๋ผ์„œ ๋ฐฐ์—ด๋ณด๋‹ค ํŠœํ”Œ ์‚ฌ์šฉ์„ ๊ถŒ์žฅ!

์ฝ๊ธฐ ์ „์šฉ ๋ฐฐ์—ด๊ณผ ํŠœํ”Œ

ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ๋Š” readonly ๋ฐฐ์—ด ํƒ€์ž…์„ ๊ธฐ๋ณธ์œผ๋กœ ์ง€์šฐ๋„ˆํ•˜๋ฏ€๋กœ ์ด๋ฅผ ์ด์šฉํ•ด ๋ถˆ๋ณ€ ๋ฐฐ์—ด์„ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋‹ค. ์ฝ๊ธฐ ์ „์šฉ ๋ฐฐ์—ด์€ ์ผ๋ฐ˜ ๋ฐฐ์—ด๊ณผ ๊ฐ™์ง€๋งŒ ๋‚ด์šฉ์„ ๊ฐฑ์‹ ํ•  ์ˆ˜ ์—†๋‹ค๋Š” ์ ๋งŒ ๋‹ค๋ฅด๋‹ค. ์ฝ๊ธฐ ์ „์šฉ ๋ฐฐ์—ด์€ ๋ช…์‹œ์  ํƒ€์ž… ์–ด๋…ธํ…Œ์ด์…˜์œผ๋กœ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋‹ค. ์ฝ๊ธฐ ์ „์šฉ ๋ฐฐ์—ด์„ ๊ฐฑ์‹ ํ•˜๋ ค๋ฉด .push, .splice์ฒ˜๋Ÿผ ๋‚ด์šฉ์„ ๋ฐ”๊พธ๋Š” ๋™์ž‘ ๋Œ€์‹  .concat, .slice๊ฐ™์ด ๋‚ด์šฉ์„ ๋ฐ”๊พธ์ง€ ์•Š๋Š” ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•œ๋‹ค. 

์ฝ๊ธฐ ์ „์šฉ ๋ฐฐ์—ด์€ ๊ฒฐ๊ตญ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๋ฐฐ์—ด๋กœ ๊ตฌํ˜„ํ•œ ๊ฒƒ์œผ๋กœ ์ฆ‰, ์Šคํ”„๋ ˆ๋“œ(...)๋‚˜ .slice ๋“ฑ์œผ๋กœ ๋ฐฐ์—ด์„ ์กฐ๊ธˆ๋งŒ ๋ฐ”๊ฟ”๋„ ์šฐ์„  ์›๋ž˜ ๋ฐฐ์—ด์„ ๋ณต์‚ฌํ•ด์•ผ ํ•˜๋ฏ€๋กœ, ์ฃผ์˜ํ•˜์ง€ ์•Š์œผ๋ฉด ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ์˜ ์„ฑ๋Šฅ์ด ๋Š๋ ค์งˆ ์ˆ˜ ์žˆ๋‹ค. ์ž‘์€ ๋ฐฐ์—ด์—์„œ๋Š” ์ด๋Ÿฐ ์˜ค๋ฒ„ํ—ค๋“œ๊ฐ€ ์‚ฌ์†Œํ•ด๋ณด์ผ ์ˆ˜ ์žˆ์ง€๋งŒ ํฐ ๋ฐฐ์—ด์—์„œ๋Š” ํฐ ์„ฑ๋Šฅ ์ €ํ•˜๋ฅผ ์ผ์œผํ‚ฌ ์ˆ˜ ์žˆ๋‹ค.


3.2.12 null, undefinded, void, never

ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ์—์„œ undefined ๊ฐ’์˜ ํƒ€์ž…์€ ์˜ค์ง undefined๋ฟ์ด๊ณ  null ๊ฐ’์˜ ํƒ€์ž…์€ null ๋ฟ์ด๋ผ๋Š” ์ ์—์„œ ํŠน๋ณ„ํ•œ ํƒ€์ž…์ด๋‹ค. undefined์™€ null์˜ ๊ฐ’์„ ํ˜ผ์šฉํ•˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋งŽ์€๋ฐ undefined๋Š” ์•„์ง ์ •์˜ํ•˜์ง€ ์•Š์•˜์Œ์„ ์˜๋ฏธํ•˜๋Š” ๋ฐ˜๋ฉด null์€ ๊ฐ’์ด ์—†๋‹ค๋Š” ์˜๋ฏธ๋‹ค. 

ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ๋Š” null๊ณผ undefined ์™ธ์—๋„ void์™€ never ํƒ€์ž…๋„ ์ œ๊ณตํ•œ๋‹ค. void๋Š” ๋ช…์‹œ์ ์œผ๋กœ ์•„๋ฌด๊ฒƒ๋„ ๋ฐ˜ํ™˜ํ•˜์ง€ ์•Š๋Š” ํ•จ์ˆ˜์˜ ๋ฐ˜ํ™˜ ํƒ€์ž…(์˜ˆ๋ฅผ ๋“ค๋ฉด console.log)์„ ๊ฐ€๋ฆฌํ‚ค๋ฉฐ never๋Š” ์ ˆ๋Œ€ ๋ฐ˜ํ™˜ํ•˜์ง€ ์•Š๋Š”(์˜ˆ์™ธ๋ฅผ ๋˜์ง€๊ฑฐ๋‚˜ ์˜์›ํžˆ ์‹คํ–‰๋˜๋Š”) ํ•จ์ˆ˜ ํƒ€์ž…์„ ๊ฐ€๋ฆฌํ‚จ๋‹ค.

// number ๋˜๋Š” null์„ ๋ฐ˜ํ™˜ํ•˜๋Š” ํ•จ์ˆ˜
function a(x: number) {
	if (x < 10) {
    	return x
    }
    return null
}


// undefined๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ํ•จ์ˆ˜
function b() {
	return undefined
}


// void๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ํ•จ์ˆ˜
function c() {
	let a = 2 + 2
	let b = a * a
}


// never๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ํ•จ์ˆ˜
function d() {
	throw TypedError('I always error')
}


// never๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ๋˜ ๋‹ค๋ฅธ ํ•จ์ˆ˜
function e() {
	while(true) {
    	doSomething
    }
}

unknown์ด ๋ชจ๋“  ํƒ€์ž…์˜ ์ƒ์œ„ ํƒ€์ž…์ด๋ผ๋ฉด never์€ ๋ชจ๋“  ํƒ€์ž…์˜ ์„œ๋ธŒํƒ€์ž…์ด๋‹ค. ์ฆ‰, ๋ชจ๋“  ํƒ€์ž…์— never๋ฅผ ํ• ๋‹นํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ never ๊ฐ’์€ ์–ด๋””์„œ๋“  ์•ˆ์ „ํ•˜๊ฒŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.


3.2.13 ์—ด๊ฑฐํ˜•

์—ด๊ฑฐํ˜•(enum)์€ ํ•ด๋‹น ํƒ€์ž…์œผ๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๊ฐ’์„ ์—ด๊ฑฐํ•˜๋Š” ๊ธฐ๋ฒ•์ด๋‹ค. ์—ด๊ฑฐํ˜•์€ ํ‚ค๋ฅผ ๊ฐ’์— ํ• ๋‹นํ•˜๋Š”, ์ˆœ์„œ๊ฐ€ ์—†๋Š” ์ž๋ฃŒ๊ตฌ์กฐ๋‹ค.ํ‚ค๋Š” ์ปดํŒŒ์ผ ํƒ€์ž„์— ๊ณ ์ •๋œ ๊ฐ์ฒด๋ผ๊ณ  ์ƒ๊ฐํ•˜๋ฉด ์‰ฝ๋‹ค. ๋”ฐ๋ผ์„œ ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ๋Š” ํ‚ค์— ์ ‘๊ทผํ•  ๋•Œ ์ฃผ์–ด์ง„ ํ‚ค๊ฐ€ ์‹ค์ œ ์กด์žฌํ•˜๋Š”์ง€ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค. ๋ฌธ์ž์—ด์—์„œ ๋ฌธ์ž์—ด๋กœ ๋งคํ•‘ํ•˜๊ฑฐ๋‚˜ ๋ฌธ์ž์—ด์—์„œ ์ˆซ์ž๋กœ ๋งคํ•‘ํ•˜๋Š” ์—ด๊ฑฐํ˜•, ์ด๋ ‡๊ฒŒ ๋‘ ๊ฐ€์ง€๊ฐ€ ์žˆ๋‹ค. ๋‹ค์Œ์€ ์—ด๊ฑฐํ˜•์˜ ์˜ˆ์‹œ์ด๋‹ค.

enum Language {
	English,
    Spanish,
    Russian
}

ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ๋Š” ์ž๋™์œผ๋กœ ์—ด๊ฑฐํ˜•์˜ ๊ฐ ๋ฉค๋ฒ„์— ์ ์ ˆํ•œ ์ˆซ์ž๋ฅผ ์ถ”๋ก ํ•ด ํ• ๋‹นํ•˜์ง€๋งŒ, ๊ฐ’์„ ๋ช…์‹œ์ ์œผ๋กœ ์„ค์ •ํ•  ์ˆ˜๋„ ์žˆ๋‹ค.

enum Language {
	English = 0,
    Spanish = 1, 
    Russian = 2
}

(๋ณดํ†ต์˜ ๊ฐ์ฒด์—์„œ ๊ฐ’์„ ๊ฐ€์ ธ์˜ฌ ๋•Œ์ฒ˜๋Ÿผ) ์  ๋˜๋Š” ๊ด„ํ˜ธ ํ‘œ๊ธฐ๋ฒ•์œผ๋กœ ์—ด๊ฑฐํ˜• ๊ฐ’์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋‹ค

let myFirstLanguage = Language.Russian  // Language
let mySecondLanguage = Language['English']  // Language

์—ด๊ฑฐํ˜•์„ ์—ฌ๋Ÿฌ ๊ฐœ๋กœ ๋‚˜๋ˆ  ์ •์˜ํ•œ ๋‹ค์Œ ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ๊ฐ€ ์ด๋“ค์„ ํ•ฉ์น˜๋„๋ก ํ•  ์ˆ˜๋„ ์žˆ๋‹ค. ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ๋Š” ์—ฌ๋Ÿฌ ์—ด๊ฑฐํ˜• ์ •์˜ ์ค‘ ํ•œ ๊ฐ€์ง€ ๊ฐ’๋งŒ ์ถ”๋ก ํ•  ์ˆ˜ ์ž‡์œผ๋ฏ€๋กœ ์—ด๊ฑฐํ˜•์„ ๋ถ„ํ• ํ•  ๋•Œ ์ฃผ์˜ํ•ด์•ผ ํ•˜๋ฉฐ, ๋‹ค์Œ ์˜ˆ์ฒ˜๋Ÿผ ๊ฐ ์—ด๊ฑฐํ˜• ๋ฉค๋ฒ„์— ๋ช…์‹œ์ ์œผ๋กœ ๊ฐ’์„ ํ• ๋‹นํ•˜๋Š” ์Šต๊ด€์„ ๊ธฐ๋ฅด๋Š” ๊ฒƒ์ด ์ข‹๋‹ค.

enum Language {
	English = 0,
    Spanish = 1
}

enum Language {
	Russian = 2
}

๊ณ„์‚ฐ๋œ ๊ฐ’์„ ์‚ฌ์šฉํ•  ์ˆ˜๋„ ์žˆ์œผ๋ฏ€๋กœ ๋ชจ๋“  ๊ฐ’์„ ์ •์˜ํ•  ํ•„์š”๋Š” ์—†๋‹ค.(๋น ์ง„ ๊ฐ’์€ ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ๊ฐ€ ์ถ”๋ก ํ•จ)

enum Language {
	English = 100,
    Spanish = 200 + 300,
    Russian  // ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ๊ฐ€ 500 ๋‹ค์Œ ์ˆซ์ž์ธ 501๋กœ ์ถ”๋ก 
}

 ์—ด๊ฑฐํ˜•์— ๋ฌธ์ž์—ด ๊ฐ’์„ ์‚ฌ์šฉํ•˜๊ฑฐ๋‚˜ ๋ฌธ์ž์—ด๊ณผ ์ˆซ์ž ๊ฐ’์„ ํ˜ผํ•ฉํ•  ์ˆ˜ ์žˆ๋‹ค. ๋˜ํ•œ ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ์—์„œ๋Š” ๊ฐ’์ด๋‚˜ ํ‚ค๋กœ ์—ด๊ฑฐํ˜•์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋„๋ก ํ—ˆ์šฉํ•˜์ง€๋งŒ ์ด๋Š” ๋ถˆ์•ˆ์ •ํ•œ ๊ฒฐ๊ณผ๋ฅผ ์ดˆ๋ž˜ํ•˜๊ธฐ ์‰ฝ๊ธฐ ๋•Œ๋ฌธ์— ๋” ์•ˆ์ „ํ•œ ์—ด๊ฑฐํ˜• ํƒ€์ž…์ธ const enum์„ ์ด์šฉํ•œ๋‹ค.

const enum์€ ์—ญ๋ฐฉํ–ฅ ์ฐพ๊ธฐ๋ฅผ ์ง€์›ํ•˜์ง€ ์•Š์œผ๋ฏ€๋กœ ์—ด๊ฑฐํ˜•์˜ ๋™์ž‘์€ ์ผ๋ฐ˜ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๊ฐ์ฒด์™€ ๋น„์Šทํ•ด์ง„๋‹ค. ๋˜ํ•œ const enum์€ ๊ธฐ๋ณธ์ ์œผ๋กœ ์•„๋ฌด ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋„ ์ƒ์„ฑํ•˜์ง€ ์•Š์œผ๋ฉฐ ๊ทธ ๋Œ€์‹  ํ•„์š”ํ•œ ๊ณณ์— ์—ด๊ฑฐํ˜• ๋ฉค๋ฒ„์˜ ๊ฐ’์„ ์ฑ„์›Œ ๋„ฃ๋Š”๋‹ค. 

 

3.3 ๋งˆ์น˜๋ฉฐ

ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ๋Š” ๋‹ค์–‘ํ•œ ๋‚ด์žฅ ํƒ€์ž…์„ ์ œ๊ณตํ•œ๋‹ค. ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ๊ฐ€ ๊ฐ’์˜ ํƒ€์ž…์„ ์ถ”๋ก ๋„๋ก ํ•˜๊ฑฐ๋‚˜ ๊ฐ’์˜ ํƒ€์ž…์„ ๋ช…์‹œํ•  ์ˆ˜ ์žˆ๋‹ค. let๊ณผ var๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์ผ๋ฐ˜์ ์ธ ํƒ€์ž…์œผ๋กœ ์ถ”๋ก ํ•˜๋Š” ๋ฐ˜๋ฉด, const๋ฅผ ์ด์šฉํ•˜๋ฉด ๋” ๊ตฌ์ฒด์ ์ธ ํƒ€์ž…์„ ์ถ”๋ก ํ•˜๊ฒŒ ๋งŒ๋“ ๋‹ค. ๋Œ€๋ถ€๋ถ„์˜ ํƒ€์ž…์€ ์ผ๋ฐ˜ ํƒ€์ž…๊ณผ ๊ตฌ์ฒด์  ํƒ€์ž… ๋‘ ๊ฐ€์ง€๋ฅผ ์ œ๊ณตํ•˜๋ฉฐ, ๊ตฌ์ฒด์ ์ธ ํƒ€์ž…์€ ๋ณดํ†ต ์ผ๋ฐ˜ ํƒ€์ž…์˜ ์„œ๋ธŒํƒ€์ž…์ด๋‹ค.