Skip to content

Latest commit

Β 

History

History
331 lines (219 loc) Β· 17 KB

File metadata and controls

331 lines (219 loc) Β· 17 KB

ν”„λ‘œκ·Έλž˜λ°μ—μ„œ 데이터 νƒ€μž…μ€ 맀우 μ€‘μš”ν•œ μš”μ†Œμž…λ‹ˆλ‹€. 그런데, μ™œμΌκΉŒμš”? μ–΄μ°¨ν”Ό λ°μ΄ν„°λŠ” 컴퓨터 λ©”λͺ¨λ¦¬μ— 2μ§„μˆ˜λ‘œ μ €μž₯될 ν…λ°μš”, μ™œ νƒ€μž…μ„ κ΅¬λΆ„ν•΄μ„œ μ •μ˜ν–ˆμ„κΉŒμš”?

데이터 νƒ€μž…(Data Type)

κ°’μ˜ μ’…λ₯˜λ‘œμ„œ λ©”λͺ¨λ¦¬μ˜ 곡간을 효율적으둜 μ‚¬μš©ν•˜κΈ° μœ„ν•΄ ν•„μš”ν•©λ‹ˆλ‹€.

λΆ„λ₯˜

데이터 νƒ€μž…μ€ 크게 μ›μ‹œ(Primitive) νƒ€μž…κ³Ό 객체(λ˜λŠ” μ°Έμ‘°, Object/Reference) νƒ€μž…μœΌλ‘œ λΆ„λ₯˜ν•©λ‹ˆλ‹€.

  1. Number, String, Boolean, undefined, null, Symbol은 μ›μ‹œ νƒ€μž…μž…λ‹ˆλ‹€. κ·Έ μ™ΈλŠ” 객체 νƒ€μž…μž…λ‹ˆλ‹€.
  2. μ›μ‹œ νƒ€μž…μ€ λ³€κ²½ λΆˆκ°€λŠ₯ν•œ κ°’(Immutable Value)μž…λ‹ˆλ‹€.
  3. μ°Έμ‘° νƒ€μž…μ€ λ³€κ²½ κ°€λŠ₯ν•œ κ°’(Mutable Value)μž…λ‹ˆλ‹€.

잠깐, λ‚΄μš©μ΄ κΈΈμ–΄μ§ˆ 수 밖에 μ—†λŠ” μ›μ‹œ κ°’κ³Ό 객체의 비ꡐ ν•­λͺ©μž…λ‹ˆλ‹€. κ΅¬λΆ„μ„ μœΌλ‘œ λΆ„λ¦¬ν•˜κ³  κ°ˆκΉŒμš”?




변경이 λΆˆκ°€λŠ₯ν•˜λ‹€, κ°€λŠ₯ν•˜λ‹€? μ΄μƒν•˜μ§€ μ•Šλ‚˜μš”? μ €ν¬λŠ” λ³€μˆ˜μ˜ 값을 자주 λ°”κΏ¨μŠ΅λ‹ˆλ‹€. μ•„λž˜μ²˜λŸΌμš”.

// constλŠ” μƒμˆ˜λ₯Ό μ˜λ―Έν•˜κΈ°μ— μž¬ν• λ‹Ήμ΄ λΆˆκ°€λŠ₯ν•©λ‹ˆλ‹€!
let x = 5;
x = 10;
console.log(x); // 10

λΆ„λͺ… x의 값은 λ³€κ²½λ˜μ—ˆλŠ”λ°... λŒ€μ²΄ 뭐가 λΆˆκ°€λŠ₯이고 κ°€λŠ₯μΌκΉŒμš”?

μš°λ¦¬λŠ” λ¨Όμ € λ³€μˆ˜μ˜ μ˜λ―Έμ— λŒ€ν•΄ 생각해봐야 ν•©λ‹ˆλ‹€. λ³€μˆ˜λŠ” λ©”λͺ¨λ¦¬ 곡간 자체이자 λ©”λͺ¨λ¦¬ 곡간을 μ‹λ³„ν•˜κΈ° μœ„ν•΄ 뢙인 μ΄λ¦„μž…λ‹ˆλ‹€. 값은 이름에 μ €μž₯된 싀체(데이터)λ‘œμ„œ ν‘œν˜„μ‹μ΄ ν‰κ°€λ˜μ–΄ μƒμ„±λœ κ²°κ³Όμž…λ‹ˆλ‹€.

즉 λ³€κ²½ λΆˆκ°€λŠ₯ν•˜λ‹€, λ³€κ²½ κ°€λŠ₯ν•˜λ‹€λΌλŠ” 건 λ³€μˆ˜ μžμ²΄κ°€ μ•„λ‹ˆλΌ 값에 λŒ€ν•œ λ‚΄μš©μΈ 것이죠.

κΈ€λ‘œλ§Œ 보면 μ΄ν•΄ν•˜κΈ° νž˜λ“€κ±°μ—μš”. κ·Έλ¦Όκ³Ό ν•¨κ»˜ λ΄…μ‹œλ‹€.


μ›μ‹œ νƒ€μž…(Primitiv Type) : λ³€κ²½ λΆˆκ°€λŠ₯ν•œ κ°’(Immutable Value)

기쑴에 ν• λ‹Ήλœ 값을 직접 λ³€κ²½ν•˜λŠ” 것이 μ•„λ‹ˆλΌ μƒˆλ‘œμš΄ μ›μ‹œ 값을 μƒμ„±ν•©λ‹ˆλ‹€.

μ—¬κΈ° λ³€μˆ˜ scoreλ₯Ό μ„ μ–Έν•˜κ³  ν• λ‹Ήν•œ μ½”λ“œκ°€ μžˆμŠ΅λ‹ˆλ‹€.

let score = 80;
score = 100;
console.log(score); // 100;
let copy = score;

μš°λ¦¬λŠ” μ‰½κ²Œ μΆ”λ‘ ν•  수 μžˆμŠ΅λ‹ˆλ‹€. 맨 처음 λ³€μˆ˜ scoreκ°€ μ„ μ–Έλ©λ‹ˆλ‹€. λ™μ‹œμ— 졜초 κ°’ 80이 ν• λ‹Ήλ˜λ©° μ΄ˆκΈ°ν™” λ©λ‹ˆλ‹€. κ·Έ ν›„ λ³€μˆ˜ score에 100을 μž¬ν• λ‹Ήν•˜μ£ . μš°λ¦¬λŠ” 이λ₯Ό 톡해 값이 λ³€κ²½λ˜μ—ˆλ‹€κ³  μ΄ν•΄ν•©λ‹ˆλ‹€.

κ±°κΈ°μ„œ 끝이 μ•„λ‹ˆμ£ ? λ³€μˆ˜ copyλ₯Ό μ„ μ–Έν•˜λ©΄μ„œ, score의 κ°’μœΌλ‘œ μ΄ˆκΈ°ν™”ν•©λ‹ˆλ‹€. 이 λ‹€μŒ λ‹¨κ³„λ‘œ λ³€μˆ˜ copy에 90을 μž¬ν• λ‹Ήν•©λ‹ˆλ‹€. λΉ„κ΅ν•˜λ©΄ μ–΄λ–»κ²Œ λ κΉŒμš”? λ‹Ήμ—°νžˆ score = 100, copy = 90이겠죠?

이제 μ–ΈκΈ‰ν•œ 일련의 μ ˆμ°¨κ°€ λ‚΄λΆ€μ—μ„œ μ–΄λ–»κ²Œ λ™μž‘λ˜λŠ”μ§€ 그림으둜 λ³ΌκΉŒμš”?

λ³€μˆ˜ score의 κ°’ ν• λ‹Ήκ³Ό μž¬ν• λ‹Ήμ— λŒ€ν•œ λ©”λͺ¨λ¦¬ μ£Όμ†Œ


이처럼 μ›μ‹œ 값은 μž¬ν• λ‹Ήμ΄ 되면 λ©”λͺ¨λ¦¬ μ£Όμ†Œκ°€ 변경이 λ©λ‹ˆλ‹€. 즉, 값에 λŒ€ν•œ 변경이 κΈ°μ‘΄ λ©”λͺ¨λ¦¬ μ£Όμ†Œκ°€ κ°€μ§„ 데이터 자체λ₯Ό λ³€κ²½μ‹œν‚€λŠ” 게 μ•„λ‹ˆλΌλŠ” κ±°μ£ .


μ›μ‹œ 값을 볡사할 λ•Œμ˜ λ©”λͺ¨λ¦¬ μƒνƒœ


이 그림은 변경이 λΆˆκ°€λŠ₯ν•˜λ‹€μ™€λŠ” 쑰금 λ‹€λ₯Έ 의미의 μ˜ˆμ œμ΄μ§€λ§Œ, μ•„λž˜ μ„€λͺ…ν•  변경이 κ°€λŠ₯ν•œ 값에 λŒ€ν•œ λ‚΄μš©μ΄ μ—°κ΄€λ˜λ―€λ‘œ ν•œ 번 보고만 κ°‘μ‹œλ‹€. μƒˆλ‘œμš΄ λ³€μˆ˜μ— 이 값을 ν• λ‹Ήν•˜λ©΄ μ–΄λ–€ 일이 μΌμ–΄λ‚ κΉŒμš”? κ°’ 자체λ₯Ό λ³΅μ‚¬ν•΄μ„œ, μƒˆλ‘œμš΄ λ©”λͺ¨λ¦¬μ— ν• λ‹Ήν•  λΏμž…λ‹ˆλ‹€. 즉, λ©”λͺ¨λ¦¬ μ£Όμ†Œκ°€ λ³€κ²½λ˜μ–΄ 각각 λ‹€λ₯Έ λ©”λͺ¨λ¦¬ μ£Όμ†Œλ₯Ό κ°€λ¦¬ν‚€λ―€λ‘œ, κΉŠμ€ 볡사라고 ν•©λ‹ˆλ‹€.

이λ₯Ό 값에 μ˜ν•œ 전달(Pass by Value) λ˜λŠ” 값에 μ˜ν•œ 호좜(Call by Value) 이라고 ν•©λ‹ˆλ‹€.


μ›μ‹œ 값이 변경될 λ•Œμ˜ 논리


κ²°κ΅­, λ³€μˆ˜ copyλŠ” λ³€μˆ˜ score의 값을 λ³΅μ‚¬ν•œ 것일 뿐이며, μ„œλ‘œκ°€ μ—°κ΄€λ˜μ§€ μ•Šκ³  μž¬ν• λ‹Ήμ„ ν•  λ•Œλ§ˆλ‹€ λ©”λͺ¨λ¦¬ μ£Όμ†Œκ°€ λ³€κ²½λ˜λŠ” ν˜•νƒœμΈ 것이죠.

그럼 이제, λ³€κ²½ κ°€λŠ₯ν•œ 값인 객체λ₯Ό λ³Ό μ°¨λ‘€μž…λ‹ˆλ‹€.


객체 νƒ€μž…(Object Type) : λ³€κ²½ κ°€λŠ₯ν•œ κ°’(Mutable Value)

κ°μ²΄λŠ” μ°Έμ‘° 값에 μ ‘κ·Όν•˜λŠ” ν˜•νƒœλ‘œ, 기쑴에 ν• λ‹Ήλœ 이 μ°Έμ‘° 값을 직접 λ³€κ²½ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

μžλ°”μŠ€ν¬λ¦½νŠΈμ—μ„œμ˜ κ°μ²΄λŠ” ν”„λ‘œνΌν‹°(Property)의 κ°œμˆ˜κ°€ ν•œμ •μ μ΄μ§€ μ•ŠμœΌλ©°, λ™μ μœΌλ‘œ μΆ”κ°€/μ‚­μ œλ  수 μžˆμŠ΅λ‹ˆλ‹€. λ˜ν•œ ν”„λ‘œνΌν‹°μ˜ 값도 μ œμ•½μ΄ μ—†μŠ΅λ‹ˆλ‹€.

그렇기에 μ›μ‹œ κ°’κ³Ό 같이 λ©”λͺ¨λ¦¬ κ³΅κ°„μ˜ 크기λ₯Ό λͺ…ν™•νžˆ μ •μ˜ν•  수 μ—†μœΌλ©°, 이 볡합적인 자료ꡬ쑰인 κ°μ²΄λŠ” μ›μ‹œ κ°’κ³Ό λ‹€λ₯Έ λ°©μ‹μœΌλ‘œ λ™μž‘ν•˜λ„λ‘ 섀계 λ˜μ—ˆμŠ΅λ‹ˆλ‹€.

자, 이제 예제λ₯Ό λ³ΌκΉŒμš”? μ—¬κΈ° 객체λ₯Ό μ„ μ–Έν•˜κ³ , λ‚΄λΆ€ ν”„λ‘œνΌν‹°λ₯Ό ν• λ‹Ήν•œ μ½”λ“œκ°€ μžˆμŠ΅λ‹ˆλ‹€.

const score = {
  math: '100',
};
const copy = score;
copy.history = '80';
score.sociology = '99';

μ›μ‹œ 값을 ν• λ‹Ήν•œ λ³€μˆ˜λŠ” μ›μ‹œ κ°’ 자체λ₯Ό κ°’μœΌλ‘œ κ°–μŠ΅λ‹ˆλ‹€. κ·ΈλŸ¬λ‚˜ 객체의 경우, ν• λ‹Ήν•œ λ³€μˆ˜κ°€ κΈ°μ–΅ν•˜λŠ” λ©”λͺ¨λ¦¬ μ£Όμ†ŒμΈ μ°Έμ‘° κ°’(Reference Value)에 μ ‘κ·Όν•  수 μžˆμŠ΅λ‹ˆλ‹€. μ°Έμ‘° 값은 객체가 μ €μž₯된 λ©”λͺ¨λ¦¬ κ³΅κ°„μ˜ μ£Όμ†Œμž…λ‹ˆλ‹€.

그렇기에 κ°μ²΄λŠ” μž¬ν• λ‹Ή 없이 객체λ₯Ό 직접 λ³€κ²½ν•  수 있으며 λ™μ μœΌλ‘œ ν”„λ‘œνΌν‹°μ˜ 값을 κ°±μ‹ ν•  수 μžˆλŠ” 것이죠. 이제 그림으둜 객체의 μ„ μ–Έκ³Ό ν• λ‹Ή, ν”„λ‘œνΌν‹° 갱신에 λŒ€ν•œ λ‚΄λΆ€ λ™μž‘μ„ λ³ΌκΉŒμš”?

λ³€μˆ˜ score에 객체 μ„ μ–Έ ν›„ λ³€μˆ˜ copy에 ν• λ‹Ή


μ„ μ–Έκ³Ό μ΄ˆκΈ°ν™”λ₯Ό 거친 λ³€μˆ˜ scoreλŠ” 객체 { math: '100' }을 가리킀고(μ°Έμ‘°ν•˜κ³ ) μžˆμŠ΅λ‹ˆλ‹€. 이λ₯Ό λ³€μˆ˜ copy에 ν• λ‹Ήν•˜λ©΄ κ°’ 자체λ₯Ό ν• λ‹Ήν•˜λŠ” 것이 μ•„λ‹Œ, scoreκ°€ κ°€λ¦¬ν‚€λŠ” 객체의 μ£Όμ†Œλ₯Ό ν• λ‹Ήν•˜κ²Œ λ©λ‹ˆλ‹€. 마치 λ³΅μ‚¬ν•œ 것 같은 νš¨κ³Όκ°€ μΌμ–΄λ‚©λ‹ˆλ‹€.

이λ₯Ό 참쑰에 μ˜ν•œ 전달(Pass by Referecne) λ˜λŠ” 참쑰에 μ˜ν•œ 호좜(Call by Reference) 이라고 λΆ€λ¦…λ‹ˆλ‹€.


객체λ₯Ό λ³€κ²½ν–ˆμ„ λ•Œμ˜ λ©”λͺ¨λ¦¬ ν˜•νƒœ


κ°μ²΄λŠ” λ³€κ²½ κ°€λŠ₯ν•œ κ°’μœΌλ‘œ, λ©”λͺ¨λ¦¬μ— μ €μž₯된 객체λ₯Ό μˆ˜μ •ν•  수 μžˆμŠ΅λ‹ˆλ‹€. μ΄μœ λŠ”? μœ„μ—μ„œ μ–ΈκΈ‰ν•œλŒ€λ‘œ λ©”λͺ¨λ¦¬ μ£Όμ†Œλ₯Ό 가리킀고 있기 λ•Œλ¬Έμ΄μ£ . μ΄λ•Œ 객체λ₯Ό μ €μž₯ν•œ λ³€μˆ˜μ— μž¬ν• λ‹Ήμ„ ν•˜μ§€ μ•ŠμœΌλ―€λ‘œ λ³€μˆ˜κ°€ μ°Έμ‘°ν•˜λŠ” μ£Όμ†Œ(κ°’)은 λ³€ν•˜μ§€ μ•Šκ³  λ‚¨μ•„μžˆκ²Œ λ©λ‹ˆλ‹€.


객체 μ„ μ–Έ, ν• λ‹Ή, 동적 ν• λ‹Ήκ³Ό κ·Έ κ²°κ³Ό


μ΄λ ‡κ²Œ μ„€κ³„λœ μ΄μœ λŠ” κ²°κ΅­ 객체λ₯Ό μƒμ„±ν•˜κ³  κ΄€λ¦¬ν•˜λŠ” 방식은 맀우 λΉ„μš©μ΄ 많이 λ“€κΈ° λ•Œλ¬Έμž…λ‹ˆλ‹€. μ›μ‹œ κ°’μ²˜λŸΌ μ œμ–΄ν•œλ‹€λ©΄, λ©”λͺ¨λ¦¬κ°€ λ‚­λΉ„λ˜κ³  μ„±λŠ₯이 μ•…ν™”λ˜μ£ . ν”„λ‘œκ·Έλž˜λ°μ€ λ‹Ήμ—°νžˆ νš¨μœ¨μ μ΄μ–΄μ•Ό ν•˜λ©°, 이λ₯Ό κ°œμ„ ν•˜κΈ° μœ„ν•΄ 변경이 κ°€λŠ₯ν•œ κ°’μœΌλ‘œ 섀계가 되고, λ©”λͺ¨λ¦¬μ˜ μ£Όμ†Œλ₯Ό μ°Έμ‘°ν•˜λŠ” ν˜•νƒœκ°€ 된 κ²ƒμž…λ‹ˆλ‹€.

λ¬Όλ‘ , μœ„μ˜ 그림처럼 문제점이 μ‘΄μž¬ν•©λ‹ˆλ‹€. μ–΄μ§Έμ„œ λ³€μˆ˜ score와 λ³€μˆ˜ copy에 각각 λ™μ μœΌλ‘œ ν• λ‹Ήν•œ ν”„λ‘œνΌν‹° history, sociologyκ°€ μ‘΄μž¬ν• κΉŒμš”? μ΄λŠ” ꡬ쑰적인 λ‹¨μ μœΌλ‘œ, μ—¬λŸ¬ μ‹λ³„μžκ°€ ν•˜λ‚˜μ˜ 객체λ₯Ό κ³΅μœ ν•˜κΈ° λ•Œλ¬Έμž…λ‹ˆλ‹€. λ©”λͺ¨λ¦¬ μ£Όμ†Œκ°€ λ³€κ²½λ˜μ§€ μ•Šκ³  λ™μΌν•œ μ£Όμ†Œλ₯Ό λ°”λΌλ³΄λ―€λ‘œ 얕은 볡사 라고 ν•˜λ©°, μ΄λŸ¬ν•œ λ¬Έμ œμ μ„ ν•΄κ²°ν•˜κΈ° μœ„ν•΄μ„œλŠ” 객체 λ‚΄λΆ€μ˜ λͺ¨λ“  κ°μ²΄κΉŒμ§€ λ³΅μ‚¬ν•˜λŠ” κΉŠμ€ 볡사λ₯Ό 거쳐야 ν•©λ‹ˆλ‹€.


정리 : μ›μ‹œ κ°’κ³Ό 객체

사싀 μ΄λ ‡κ²Œ κ΅¬λΆ„ν•˜μ—¬λ„, 값에 μ˜ν•œ 전달과 참쑰에 μ˜ν•œ 전달은 μ‹λ³„μžκ°€ κΈ°μ–΅ν•˜λŠ” λ©”λͺ¨λ¦¬ 곡간에 μ €μž₯λ˜μ–΄ μžˆλŠ” 값을 λ³΅μ‚¬ν•˜μ—¬ μ „λ‹¬ν•˜λŠ” λ©΄μ—μ„œ λ™μΌν•©λ‹ˆλ‹€. μ΄λ ‡κ²Œ 보면 κ²°κ΅­ μžλ°”μŠ€ν¬λ¦½νŠΈμ—μ„œλŠ” 값에 μ˜ν•œ μ „λ‹¬λ§Œ μ‘΄μž¬ν•œλ‹€κ³  ν•  수 있죠. 가끔 κ³΅μœ μ— μ˜ν•œ 전달이라고도 ν•©λ‹ˆλ‹€λ§Œ, μ–΄λŠ μͺ½μ΄λ“  상관 μ—†μŠ΅λ‹ˆλ‹€.

ν•˜μ§€λ§Œ μ €ν¬λŠ” μ›μ‹œ κ°’κ³Ό 객체λ₯Ό κ΅¬λΆ„ν•˜κΈ° μœ„ν•΄ 값에 μ˜ν•œ 전달과 참쑰에 μ˜ν•œ μ „λ‹¬λ‘œ κ΅¬λ³„ν•©λ‹ˆλ‹€.

μ—¬κΈ°μ„œ κΈ°μ–΅ν•΄μ•Ό ν•  것은, λ‹€λ₯Έ ν”„λ‘œκ·Έλž˜λ° μ–Έμ–΄λŠ” 포인터(Pointer)의 쑴재둜 인해 전달 방식이 λͺ…ν™•νžˆ κ΅¬λΆ„λ˜λ©°, μžλ°”μŠ€ν¬λ¦½νŠΈκ°€ λ§ν•˜λŠ” μ „λ‹¬μ˜ μ˜λ―Έμ™€λŠ” μ™„λ²½ν•˜κ²Œ μΌμΉ˜ν•˜μ§€ μ•ŠμŒμ„ κΈ°μ–΅ν•΄μ£Όμ„Έμš”.




μ—¬κΈ°κΉŒμ§€ μ›μ‹œ κ°’κ³Ό 객체에 λŒ€ν•œ μ„€λͺ…μ΄μ—ˆμŠ΅λ‹ˆλ‹€. λ‹€μ‹œ λŒμ•„κ°€μ„œ, 데이터 νƒ€μž…μ΄ κ°€μ§€λŠ” νŠΉμ§•μ„ μ‚΄νŽ΄λ΄…λ‹ˆλ‹€. 숫자 1κ³Ό λ¬Έμžμ—΄ '1'은 λΉ„μŠ·ν•΄ λ³΄μ΄μ§€λ§Œ λ‹€λ¦…λ‹ˆλ‹€. μš©λ„(μ—°μ‚°, 화면에 좜λ ₯ λ“±) 뿐만 μ•„λ‹ˆλΌ 각 νƒ€μž…λ³„ 확보할 λ©”λͺ¨λ¦¬ κ³΅κ°„μ˜ 크기와 2μ§„μˆ˜ 값도 λ‹€λ₯΄κ³  심지어 해석쑰차 ν‹€λ¦½λ‹ˆλ‹€.

ν•„μš”μ„±

λ§Œμ•½ κ°™λ‹€λ©΄ μ–΄λ–»κ²Œ λ κΉŒμš”? νƒ€μž…μ€ μ˜λ―Έκ°€ μ—†μ–΄μ§€κ³  μ—°μ‚°, 좜λ ₯ λ“± ν”„λ‘œκ·Έλž˜λ° μ–Έμ–΄λ‘œμ¨μ˜ κΈ°λŠ₯을 μ„±μ‹€νžˆ μˆ˜ν–‰ν•  수 μžˆμ„κΉŒμš”?

κ°œλ°œμžκ°€ λΆˆλŸ¬μ˜€λ €λŠ” 값이 생각과 λ‹€λ₯΄κ²Œ μ œμ–΄λœλ‹€λ©΄ 기초적인 μ• ν”Œλ ˆμΌ€μ΄μ…˜μ„ μž‘μ„±ν•  μˆ˜λ„ 없을 κ²ƒμž…λ‹ˆλ‹€. 예λ₯Ό λ“€μ–΄ 1 + 3 연산을 μ§„ν–‰ν–ˆλŠ”λ° 13이 될 μˆ˜λ„ 있고, 4κ°€ 될 μˆ˜λ„ μžˆμŠ΅λ‹ˆλ‹€. 이런 기초적인 μ—°μ‚°μ‘°μ°¨ ν˜Όλ™μ΄ 올 수 μžˆμ–΄μš”.

μš°μ„ , μžλ°”μŠ€ν¬λ¦½νŠΈ 엔진은 데이터 νƒ€μž…, 즉 κ°’μ˜ μ’…λ₯˜μ— 따라 μ •ν•΄μ§„ λ©”λͺ¨λ¦¬ 곡간을 ν™•λ³΄ν•©λ‹ˆλ‹€. κ·Έ 말은 λ³€μˆ˜μ— ν• λ‹Ήλ˜λŠ” 데이터 νƒ€μž…μ— 따라 λ©”λͺ¨λ¦¬ 곡간이 μƒμ΄ν•˜λ‹€λŠ” κ²ƒμž…λ‹ˆλ‹€.

μ™œ 데이터 νƒ€μž…λ³„λ‘œ λ©”λͺ¨λ¦¬ 곡간이 λ‹€λ₯΄κ²Œ ν• λ‹Ήλ κΉŒμš”? μ–ΈκΈ‰ν–ˆλ“―, μ»΄ν“¨ν„°μ˜ λ©”λͺ¨λ¦¬μ—λŠ” λͺ¨λ“  데이터가 2μ§„μˆ˜λ‘œ μ €μž₯λ©λ‹ˆλ‹€. μ•„λž˜λ₯Ό λ³ΌκΉŒμš”?

// μ‹€μ œ λ©”λͺ¨λ¦¬μ— μ €μž₯λ˜λŠ” κ°’ : 0100 0001
// μˆ«μžν˜•μœΌλ‘œλŠ” 65, λ¬Έμžμ—΄λ‘œλŠ” 'A'
let a = 'A';

// μ•„λž˜μ˜ κ²°κ³ΌλŠ”?
console.log(a);
let b = a + 15;
// μ•„λž˜μ˜ κ²°κ³ΌλŠ”?
console.log(b);

λ¬Έμžμ—΄ 'A'λŠ” charν˜•μœΌλ‘œ 0100 0001 λΉ„νŠΈ(λ©”λͺ¨λ¦¬μ— μ €μž₯λ˜λŠ” 2μ§„μˆ˜λŠ” λΉ„νŠΈλ₯Ό λ‚˜μ—΄ν•œ 것과 κ°™μ•„μš”!)μž…λ‹ˆλ‹€. μ΄λŠ” 숫자둜 ν•΄μ„ν•˜λ©΄ 65μž…λ‹ˆλ‹€. κ·Έλ ‡λ‹€λ©΄ console.log(b)의 κ²°κ³ΌλŠ” 80μΌκΉŒμš”?

  • μ˜ˆμƒμΉ˜ λͺ»ν•œ A15λΌλŠ” 값이 λ‚˜μ˜€κ²Œ λ©λ‹ˆλ‹€. μ΄λŠ” μžλ°”μŠ€ν¬λ¦½νŠΈμ˜ 동적 νƒ€μž… 언어적 νŠΉμ„± λ•Œλ¬ΈμΈλ°μš”, 이 뢀뢄은 λ„˜μ–΄κ°€λ„λ‘ ν•˜κ² μŠ΅λ‹ˆλ‹€(ν›„μˆ ν•©λ‹ˆλ‹€).

μžλ°”μŠ€ν¬λ¦½νŠΈ 엔진은 λ©”λͺ¨λ¦¬μ—μ„œ 값을 μ½μ–΄μ˜¬ λ•Œ 데이터 νƒ€μž…μ„ μΆ”λ‘ (Type Inference)ν•˜μ—¬ ν‘œν˜„ν•©λ‹ˆλ‹€. 즉, 숫자 65κ°€ μ•„λ‹ˆλΌ λ¬Έμžμ—΄ 'A'둜 μ΄ν•΄ν•˜λŠ” κ²ƒμž…λ‹ˆλ‹€. μ—¬κΈ°μ„œ 데이터 νƒ€μž…μ˜ ν•„μš”μ„±μ„ 생각해볼 수 μžˆμŠ΅λ‹ˆλ‹€.

  1. λ©”λͺ¨λ¦¬ κ³΅κ°„μ˜ 크기λ₯Ό κ²°μ • : 데이터 νƒ€μž…μ— 따라 값을 μ €μž₯ν•  λ•Œ ν•„μš”ν•œ 곡간이 달라진닀.
  2. 2μ§„μˆ˜λ₯Ό ν•΄μ„ν•˜λŠ” 방법을 κ²°μ • : 데이터 νƒ€μž…μ— 따라 λ©”λͺ¨λ¦¬μ—μ„œ μ½μ–΄μ˜¨ 값을 ν•΄μ„ν•˜λŠ” 방법이 달라진닀.

동적 νƒ€μž…κ³Ό 정적 νƒ€μž…?

μƒμ†Œν•œ 단어가 λ‚˜μ™”μŠ΅λ‹ˆλ‹€. κ·Έ 전에, ν•œ 번 μƒκ°ν•΄λ΄…μ‹œλ‹€. μžλ°”μŠ€ν¬λ¦½νŠΈμ—μ„œ λ³€μˆ˜λ₯Ό μ„ μ–Έν•  λ•Œ, μš°λ¦¬λŠ” νƒ€μž…μ„ μ •ν•΄μ€„κΉŒμš”?

C, Java 등은 int a = 0 ν˜•νƒœλ‘œ λ³€μˆ˜λ₯Ό μ„ μ–Έν•©λ‹ˆλ‹€. 즉 μ΄ˆκΈ°ν™”-할당을 ν•  λ³€μˆ˜μ˜ νƒ€μž…μ„ μ§€μ •ν•΄μ£ΌλŠ” ν˜•νƒœμ£ . 그런데 JavaScript, Python은 μ–΄λ–€κ°€μš”? νƒ€μž…μ„ μ§€μ •ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.

μš°λ¦¬λŠ” C와 Java처럼 λ³€μˆ˜μ— ν• λ‹Ήν•  수 μžˆλŠ” νƒ€μž…μ„ μ§€μ •ν•΄μ•Όλ§Œ ν•˜λŠ” μ–Έμ–΄λ₯Ό 정적 νƒ€μž… μ–Έμ–΄(static/strong type) 라고 λ¬Άμ–΄ μ§€μΉ­ν•˜λ©°, 이λ₯Ό λͺ…μ‹œμ  νƒ€μž… μ„ μ–Έ(explicit type declaration)이라고 ν•©λ‹ˆλ‹€.

λ°˜λŒ€λ‘œ JavaScript와 Python처럼 λ³€μˆ˜λ₯Ό μ„ μ–Έν•  λ•Œ νƒ€μž…μ„ μ„ μ–Έν•˜μ§€ μ•ŠλŠ” μ–Έμ–΄λ₯Ό 동적 νƒ€μž… μ–Έμ–΄(dynamic/weak type) 라고 λ¬Άμ–΄ μ§€μΉ­ν•˜λ©°, 이λ₯Ό μ•”μ‹œμ  νƒ€μž… μ„ μ–Έ(implicit type declaration)이라고 λΆ€λ¦…λ‹ˆλ‹€.

그럼 νŠΉμ§•μ„ μ‚΄νŽ΄λ³ΌκΉŒμš”?

  • 정적 νƒ€μž… μ–Έμ–΄

    • λ³€μˆ˜μ˜ νƒ€μž…μ„ λ³€κ²½ν•  수 μ—†μ–΄ μ„ μ–Έν•œ νƒ€μž…μ— λ§žλŠ” κ°’λ§Œ ν• λ‹Ήν•  수 μžˆμŠ΅λ‹ˆλ‹€.
      // μžλ°”
      int a = 0;
      a = 'A';  // Compile Error
    • λŒ€λΆ€λΆ„μ˜ 정적 νƒ€μž… μ–Έμ–΄λŠ” 컴파일 μ–Έμ–΄(Compile Language)둜써 컴파일 μ‹œμ μ— νƒ€μž…μ„ μ²΄ν¬ν•©λ‹ˆλ‹€.
      • νƒ€μž… 체크(Type Check) : μ„ μ–Έν•œ 데이터 νƒ€μž…μ— λ§žλŠ” 값을 ν• λ‹Ήν–ˆλŠ”μ§€ 검사
    • μœ„μ˜ 절차둜 νƒ€μž…μ˜ 일관성을 κ°•μ œν•˜μ—¬ μ•ˆμ •μ μΈ μ½”λ“œλ₯Ό κ΅¬ν˜„ν•˜κ³ , λŸ°νƒ€μž„(μ‹€ν–‰)에 λ°œμƒν•˜λŠ” μ—λŸ¬λ₯Ό μ€„μž…λ‹ˆλ‹€.
  • 동적 νƒ€μž… μ–Έμ–΄

    • 미리 μ„ μ–Έν•œ 데이터 νƒ€μž…μ˜ 값이 μ•„λ‹ˆλΌ, μ–΄λ–€ νƒ€μž…μ΄λΌλ„ 자유둭게 ν• λ‹Ήν•  수 μžˆμŠ΅λ‹ˆλ‹€.
      // μžλ°”μŠ€ν¬λ¦½νŠΈ
      let a = 0;
      a = 'A';  // Not Problem
      # 파이썬
      a = 0
      a = 'A'
    • μœ„μ˜ 절차둜, 선언이 μ•„λ‹Œ 할당에 μ˜ν•΄ νƒ€μž…μ΄ κ²°μ •(νƒ€μž… μΆ”λ‘ )되며 νƒ€μž…μ˜ λ³€ν™˜μ— 맀우 μžμœ λ‘­μŠ΅λ‹ˆλ‹€.
    • 단, νƒ€μž…μ˜ 일관성을 κ°•μ œν•˜μ§€ μ•ŠμœΌλ―€λ‘œ μ½”λ“œ κ΅¬ν˜„κ³Ό λŸ°νƒ€μž„ κ°„ μ—λŸ¬κ°€ λ°œμƒν•  수 μžˆμŠ΅λ‹ˆλ‹€.
      • 이런 μ—¬λŸ¬ λ¬Έμ œμ μ„ ν•΄κ²°ν•˜κ³ μž μžλ°”μŠ€ν¬λ¦½νŠΈ μ§„μ˜μ—μ„œλŠ” νƒ€μž…μŠ€ν¬λ¦½νŠΈ(TypeScript)λΌλŠ” μƒˆλ‘œμš΄ μ–Έμ–΄(μžλ°”μŠ€ν¬λ¦½νŠΈ 기반)κ°€ νƒ„μƒν–ˆμŠ΅λ‹ˆλ‹€.
    • 이와 λ³„κ°œλ‘œ, μžλ°”μŠ€ν¬λ¦½νŠΈλŠ” 개발자의 μ˜λ„μ™€ 상관 없이 엔진에 μ˜ν•΄ μ•”λ¬΅μ μœΌλ‘œ νƒ€μž…μ΄ μžλ™ λ³€ν™˜ λ˜κΈ°λ„ ν•©λ‹ˆλ‹€. μ•„λž˜λŠ” μœ„μ—μ„œ μ–ΈκΈ‰ν–ˆλ˜ μ½”λ“œμž…λ‹ˆλ‹€.
      let a = 'A';
      let b = a + 15;
      console.log(b);
      • 엔진은 a와 μ—°μ‚°ν•˜λŠ” 15λ₯Ό λ¬Έμžμ—΄λ‘œ λ³€ν™˜ν•˜μ—¬ λ¬Έμžμ—΄ λ§μ…ˆμ„ μ‹œν–‰ν•©λ‹ˆλ‹€. 이처럼 λ¬Έμžμ—΄ νƒ€μž… λ³€μˆ˜λΌκ³  μ˜ˆμΈ‘ν–ˆμœΌλ‚˜ 싀은 숫자 νƒ€μž…μ΄μ—ˆλ‹€ λŠ” λ¬Έμ œκ°€ λ°œμƒν•©λ‹ˆλ‹€.
    • 즉 동적 νƒ€μž… μ–Έμ–΄λŠ” μœ μ—°μ„±(flexibility)은 λ†’μ§€λ§Œ μ‹ λ’°μ„±(reliability)은 λ–¨μ–΄μ§‘λ‹ˆλ‹€.

μ΄λŒ€λ‘œ λλ‚΄κΈ°μ—λŠ” 쑰금 μ•„μ‰¬μš°λ‹ˆ, νƒ€μž…λ³„λ‘œ κ°„λž΅ν•˜κ²Œ 짚고 λ„˜μ–΄κ°€λ³΄μ£ .


데이터 νƒ€μž… : Number

μžλ°”μŠ€ν¬λ¦½νŠΈλŠ” int, long, float, double λ“± λ‹€μ–‘ν•œ 숫자 νƒ€μž…μ΄ μ‘΄μž¬ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.

ECMAScript μ‚¬μ–‘μ—μ„œλŠ” 숫자 νƒ€μž…μ˜ 값을 배정밀도 64λΉ„νŠΈ λΆ€λ™μ†Œμˆ˜μ  ν˜•μ‹μ„ 따라 μ‹€μˆ˜λ‘œ μ²˜λ¦¬ν•©λ‹ˆλ‹€.

  • 예제 μ½”λ“œ
    // λͺ¨λ‘ 숫자 νƒ€μž…
    const int = 1;
    const db = 1.12;
    const ng = -1;
    
    // ν‘œκΈ°λ²•μ€ λ‹€λ₯΄μ§€λ§Œ λͺ¨λ‘ 같은 κ°’
    const binary = 0b01000001;  // 2μ§„μˆ˜
    const octal = 0o101;        // 8μ§„μˆ˜
    const hex = 0x41;           // 16μ§„μˆ˜
    
    console.log(binary);        // 65
    console.log(octal);         // 65
    console.log(hex);           // 65
    
    // 숫자 νƒ€μž…μ€ λͺ¨λ‘ μ‹€μˆ˜λ‘œ 처리
    console.log(1 === 1.0);     // true
    
    // νŠΉλ³„ν•œ 숫자 값도 쑴재
    const INF = Infinity;       // μ–‘μ˜ λ¬΄ν•œλŒ€
    console.log(-INF);          // 음의 λ¬΄ν•œλŒ€
    console.log(INF * 'a')      // NaN(not a number, μ—°μ‚° λΆˆκ°€)

데이터 νƒ€μž… : String

0개 이상 16λΉ„νŠΈ μœ λ‹ˆμ½”λ“œ 문자(UTF-16)의 μ§‘ν•©μœΌλ‘œ μ „ 세계 λŒ€λΆ€λΆ„μ˜ 문자λ₯Ό ν‘œν˜„ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

μž‘μ€ λ”°μ˜΄ν‘œ('), 큰 λ”°μ˜΄ν‘œ("), λ°±ν‹±(`)을 톡해 ν‘œκΈ°ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

  • 백틱을 톡해 ν…œν”Œλ¦Ώ λ¦¬ν„°λŸ΄μ„ μ‚¬μš©ν•  수 있으며, 자유둭게 JavaScript의 λ³€μˆ˜λ₯Ό κ°€μ Έλ‹€ μ‚¬μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

μ΄μŠ€μΌ€μ΄ν”„ μ‹œν€€μŠ€(escape sequence)λ₯Ό μ•Œμ•„λ‘λ©΄ λ‹€μ–‘ν•œ ν‘œν˜„μ„ ν•  수 μžˆμ§€λ§Œ, 닀루지 μ•ŠμŠ΅λ‹ˆλ‹€. μžμ„Έν•œ λ‚΄μš©μ€ μ—¬κΈ°λ₯Ό μ°Έμ‘°ν•˜μ„Έμš”.

  • 이 쀑 μ–ΈκΈ‰ν•˜κ³  λ„˜μ–΄κ°€μ•Ό ν•˜λŠ” 뢀뢄은 CR(carriage Return, \r)κ³Ό LF(Line Feed, \n)μž…λ‹ˆλ‹€.
  • CRLFλŠ” Window μ²΄κ³„μ˜ κ°œν–‰ λ°©μ‹μž…λ‹ˆλ‹€.
  • LFλŠ” Unix μ²΄κ³„μ˜ κ°œν–‰ λ°©μ‹μž…λ‹ˆλ‹€.
  • μžλ°”μŠ€ν¬λ¦½νŠΈλŠ” 두 κ°œν–‰λ°©μ‹μ„ μ§€μ›ν•˜μ§€λ§Œ, LFλ₯Ό ꢌμž₯ν•©λ‹ˆλ‹€.

데이터 νƒ€μž… : Boolean

논리적 μ°Έκ³Ό 거짓을 λ‚˜νƒ€λƒ…λ‹ˆλ‹€.


데이터 νƒ€μž… : undefined

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

undefined 값은 μœ μΌν•©λ‹ˆλ‹€.


데이터 νƒ€μž… : null

λ³€μˆ˜μ— null을 할당함은 이전에 μ°Έμ‘°ν•˜λ˜ 값을 더 이상 μ°Έμ‘°ν•˜μ§€ μ•ŠλŠ”λ‹€λŠ”, 값에 λŒ€ν•œ μ°Έμ‘°λ₯Ό λͺ…μ‹œμ μœΌλ‘œ μ œκ±°ν•˜λŠ” μ˜λ―Έμž…λ‹ˆλ‹€.

null 값은 μœ μΌν•©λ‹ˆλ‹€.


데이터 νƒ€μž… : Symbol

ES6μ—μ„œ μΆ”κ°€λμœΌλ©° λ³€κ²½ λΆˆκ°€λŠ₯ν•œ μ›μ‹œ νƒ€μž…μ˜ κ°’μœΌλ‘œ μ€‘λ³΅λ˜μ§€ μ•ŠλŠ” μœ μΌλ¬΄μ΄ν•œ κ°’μž…λ‹ˆλ‹€.


데이터 νƒ€μž… : Object

μ°¨ν›„ 깊게 λ‹€λ£Ήλ‹ˆλ‹€. μ—¬κΈ°μ„œλŠ” μžλ°”μŠ€ν¬λ¦½νŠΈκ°€ 객체 기반의 μ–Έμ–΄ 이며 μžλ°”μŠ€ν¬λ¦½νŠΈμ˜ 거의 λͺ¨λ“  것이 객체 라고 μ•Œμ•„λ‘μ„Έμš”.