๐ป ์์ ํ์
(primitive type) vs ๊ฐ์ฒด ํ์
(object/reference)
์๋ฐ์คํฌ๋ฆฝํธ์์ ์ ๊ณตํ๋ 7๊ฐ์ง ๋ฐ์ดํฐ ํ์
(์ซ์, ๋ฌธ์์ด, ๋ถ๋ฆฌ์ธ, null, undefined, Symbol, Object)์ ํฌ๊ฒ ์์ ํ์
(primitive type)
๊ณผ ๊ฐ์ฒด(object/reference type)
์ผ๋ก ๊ตฌ๋ถ๋๋ค.
์์ ํ์
๊ณผ ๊ฐ์ฒด ํ์
์ ํฌ๊ฒ 3๊ฐ์ง ์ธก๋ฉด์์ ๋ค๋ฅด๋ค.
์์ ํ์
์ ๊ฐ, ์ฆ ์์ ๊ฐ์ ๋ณ๊ฒฝ ๋ถ๊ฐ๋ฅํ ๊ฐ(immutable value)
๋ค.
๊ฐ์ฒด ํ์
์ ๋ณ๊ฒฝ ๊ฐ๋ฅํ ๊ฐ(mutable value)
๋ค.
์์ ๊ฐ์ ๋ณ์์ ํ ๋นํ๋ฉด ๋ณ์(ํ๋ณด๋ ๋ฉ๋ชจ๋ฆฌ ๊ณต๊ฐ)์๋ ์ค์ ๊ฐ์ด ์ ์ฅ
๋๋ค.
๊ฐ์ฒด๋ ๋ณ์์ ํ ๋นํ๋ฉด ๋ณ์(ํ๋ณด๋ ๋ฉ๋ชจ๋ฆฌ ๊ณต๊ฐ)์ ์ฐธ์กฐ ๊ฐ์ด ์ ์ฅ
๋๋ค.
์์ ๊ฐ์ ๊ฐ๋ ๋ณ์๋ฅผ ๋ค๋ฅธ ๋ณ์์ ํ ๋นํ๋ฉด ์๋ณธ์ ์์ ๊ฐ์ด ๋ณต์ฌ๋์ด ์ ๋ฌ๋๋ค. ์ด๋ฅผ ๊ฐ์ ์ํ ์ ๋ฌ(pass by value)
๋ผ๊ณ ํ๋ค.
๊ฐ์ฒด๋ ๊ฐ๋ฆฌํค๋ ๋ณ์๋ฅผ ๋ค๋ฅธ ๋ณ์์ ํ ๋นํ๋ฉด ์๋ณธ์ ์ฐธ์กฐ ๊ฐ์ด ๋ณต์ฌ๋์ด ์ ๋ฌ๋๋ค. ์ด๋ฅผ ์ฐธ์กฐ์ ์ํ ์ ๋ฌ(pass by reference)
๋ผ๊ณ ํ๋ค.
๋ณ๊ฒฝ ๋ถ๊ฐ๋ฅํ ๊ฐ(immutable value)
๋ณ๊ฒฝ ๋ถ๊ฐ๋ฅ ํ ๊ฐ์ ๋ค์ ๋งํด, ํ๋ฒ ์์ฑ๋ ์์ ๊ฐ์ ์ฝ๊ธฐ ์ ์ฉ(read only)
๊ฐ์ผ๋ก์ ๋ณ๊ฒฝํ ์ ์์์ ์๋ฏธํ๋ค.
์ด๋ฌํ ๋ถ๋ณ์ฑ์ ์์ ๊ฐ ๋ฐ์ดํฐ์ ์ ๋ขฐ์ฑ์ ๋ณด์ฅ
ํ๋ค.
์ฐธ๊ณ ๋ก! ๋ณ๊ฒฝ ๋ถ๊ฐ๋ฅํ๋ค๋ ๊ฒ์ ๋ณ์๊ฐ ์๋๋ผ ๊ฐ์ ๋ํ ์ด์ผ๊ธฐ์ด๋ค.
์ฆ, ์์๊ฐ ์์ฒด๋ฅผ ๋ณ๊ฒฝ ํ ์ ์๋ค๋ ๊ฑฐ์ง ๋ณ์ ๊ฐ์ ๋ณ๊ฒฝํ ์ ์๋ค๋ ๊ฒ์ ์๋๋ค. ๋ณ์๋ ์ธ์ ๋ ์ง ์ฌํ ๋นํด์ ๊ฐ์ ๋ณ๊ฒฝ ํ ์ ์๋ค. ์๋ ์์ ๋ฅผ ์ฐธ๊ณ ํ์.
let str = "123" ;
// ์์๊ฐ์ธ ๋ฌธ์์ด์ ์ธ๋ฑ์ค๋ก ์ ๊ทผํด์ ๋ณ๊ฒฝํจ, ์๋ฌ๋ ๋ฐ์ํ์ง ์์ง๋ง ๊ฐ์ด ๋ณ๊ฒฝ๋์ง๋ ์์
str [ 0 ] = "4" ;
console . log ( str ) ; // "123"
str = "456" ; // ๋ณ์๋ฅผ ์ฌํ ๋นํด์ ๊ฐ์ ๋ฐ๊ฟ
console . log ( str ) ; // "456"
์ ์ด๋ฏธ์ง์ฒ๋ผ ์๋ฐ์คํฌ๋ฆฝํธ์์ ์์ ๊ฐ์ ํ ๋นํ ๋ณ์์ ์๋ก์ด ์์ ๊ฐ์ ์ฌํ ๋นํ๋ฉด, ๋ฉ๋ชจ๋ฆฌ ๊ณต๊ฐ์ ์ ์ฅ๋์ด ์๋ ์ฌํ ๋น ์ด์ ์ ์์ ๊ฐ์ ๋ณ๊ฒฝํ๋ ๊ฒ์ด ์๋! ์๋ก์ด ๋ฉ๋ชจ๋ฆฌ ๊ณต๊ฐ์ ํ๋ณดํ๊ณ ์ฌํ ๋นํ ์์ ๊ฐ์ ์ ์ฅ ํ ํ, ๋ณ์๋ ์ฌํ ๋นํ ์์๊ฐ์ ๊ฐ๋ฆฌํจ๋ค.
์ด๋ฌํ ๋์ ์๋ฆฌ์ ์ด์ ๊ฐ ๋ฐ๋ก ๋ณ์์ ํ ๋น๋ ์์ ๊ฐ์ด ๋ณ๊ฒฝ ๋ถ๊ฐ๋ฅํ ๊ฐ์ด๊ธฐ ๋๋ฌธ์ด๋ค.
๋ง์ฝ, ์์ ๊ฐ์ด ๋ณ๊ฒฝ ๊ฐ๋ฅํ ๊ฐ์ด๋ผ๋ฉด ๋ณ์๊ฐ ๊ฐ๋ฆฌํค๋ ๋ฉ๋ชจ๋ฆฌ ๊ณต๊ฐ์ ์ฃผ์๋ฅผ ๋ฐ๊ฟ ํ์์์ด ์์ ๊ฐ ์์ฒด๋ฅผ ๋ณ๊ฒฝํ๋ฉด ๊ทธ๋ง์ด๋ค. ๋น์ฐํ ๋ฉ๋ชจ๋ฆฌ ๊ณต๊ฐ์ ์ฃผ์๋ ๋ฐ๋์ง ์๋๋ค.
ํ์ง๋ง, ์์ ๊ฐ์ ๋ณ๊ฒฝ ๋ถ๊ฐ๋ฅ ํ ๊ฐ์ด๋ฉฐ, ๊ฐ์ ์ง์ ๋ฐ๊ฟ ์ ์๋ค. ๋ฐ๋ผ์ ๋ณ์ ๊ฐ์ ๋ณ๊ฒฝํ๊ธฐ ์ํด ์ฌํ ๋น ํ๋ฉด ์๋ก์ด ๋ฉ๋ชจ๋ฆฌ ๊ณต๊ฐ์ ํ๋ณดํ๊ณ ์ฌํ ๋นํ ๊ฐ์ ์ ์ฅ ํ ํ, ๋ณ์๊ฐ ์ฐธ์กฐํ๋ ๋ฉ๋ชจ๋ฆฌ ๊ณต๊ฐ์ ์ฃผ์๋ฅผ ๋ณ๊ฒฝํ๋ค. ์ด๋ฌํ ํน์ง์ด ๋ฐ๋ก ๋ถ๋ณ์ฑ(immutability)
์ด๋ผ ํ๋ค.
์์ ๊ฐ์ ๊ฐ๋ ๋ณ์๋ฅผ ๋ค๋ฅธ ๋ณ์์ ํ ๋นํ๋ฉด ์๋ณธ์ ์์ ๊ฐ์ด ๋ณต์ฌ๋์ด ์ ๋ฌ๋๋ค. ์ด๋ฅผ ๊ฐ์ ์ํ ์ ๋ฌ(pass by value)
๋ผ๊ณ ํ๋ค.
let score = 80 ;
let copy = score ;
console . log ( score ) ; // 80
console . log ( copy ) ; // 80
console . log ( score === copy ) ; // true
์ ์์ ์ฒ๋ผ copy ๋ณ์์๋ค score(80๋ก ํ๊ฐ)์ ํ ๋นํ๋ฉด copy ๋ณ์์๋ 80์ด ํ ๋น๋๋ค. ์ด๋ ์๋ก์ด ์ซ์ ๊ฐ 80์ด ์์ฑ๋์ด ํ ๋น๋๋ค.
score์ copy๋ ๊ฐ์ ์ซ์ 80์ ๊ฐ๋๋ค๋ ์ ์์ ๋์ผํ๋ค. ํ์ง๋ง ์ ์ด๋ฏธ์ง์ฒ๋ผ score์ copy์ ๊ฐ 80์ ๊ฐ๊ฐ ๋ค๋ฅธ ๋ฉ๋ชจ๋ฆฌ ๊ณต๊ฐ์ ์ ์ฅ๋๋ค.
let score = 80 ;
let copy = score ;
console . log ( score === copy ) ; // true
score = 100 ;
console . log ( score ) ; // 100
console . log ( copy ) ; // 80
console . log ( score === copy ) ; // false
score์ copy ๋ณ์์ ๊ฐ 80์ ๊ฐ๊ฐ ๋ค๋ฅธ ๋ฉ๋ชจ๋ฆฌ ๊ณต๊ฐ์ ์ ์ฅ๋ ๋ณ๊ฐ์ ๊ฐ์ ์ฃผ์ํด์ผํ๋ค.
๋ฐ๋ผ์ score ๊ฐ์ 100์ผ๋ก ๋ณ๊ฒฝํ๋ค๋ฉด? copy์ ์ด๋ ํ ์ํฅ์ ์ฃผ์ง ์์ผ๋ฉฐ, ์๋ก ๊ฐ์์ง ๋น๊ต๋ฅผ ํด๋ false๋ก ํ๊ฐ๋๋ค.
์ฌ์ค ECMAScript ์ฌ์์๋ ๋ณ์๋ฅผ ํตํด ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์ด๋ป๊ฒ ๊ด๋ฆฌํ๋์ง ์ ํํ ์ ์๋์ด ์์ง ์๋๋ค.
๋ฐ๋ผ์ ์ค์ ์๋ฐ์คํฌ๋ฆฝํธ ์์ง์ ๊ตฌํํ๋ ์ ์กฐ์ฌ์ ๋ฐ๋ผ ์ค์ ๋ด๋ถ ๋์์ ๋ฏธ๋ฌํ ์ฐจ์ด
๊ฐ ์์ ์ ์๋ค.
๊ธฐ์กด ๊ทธ๋ฆผ์์๋ ๋ณ์์ ์์ ๊ฐ์ ๊ฐ๋ ๋ณ์๋ฅผ ํ ๋นํ๋ฉด ์์ ๊ฐ์ด ๋ณต์ฌ๋๋ ๊ฒ์ผ๋ก ํํํ๋๋ฐ, ๋ฐ๋ก ์์ ๊ทธ๋ฆผ์ฒ๋ผ ๋ณ์์ ์์ ๊ฐ์ ๊ฐ๋ ๋ณ์๋ฅผ ํ ๋นํ๋ ์์ ์๋ ๋ ๋ณ์๊ฐ ๊ฐ์ ์์ ๊ฐ์ ์ฐธ์กฐ
ํ๋ค๊ฐ ์ด๋ ํ์ชฝ์ ๋ณ์์ ์ฌํ ๋น์ด ์ด๋ค์ก์ ๋ ๋น๋ก์ ์๋ก์ด ๋ฉ๋ชจ๋ฆฌ ๊ณต๊ฐ์ ์ฌํ ๋น๋ ๊ฐ์ ์ ์ฅํ๋๋ก ๋์
ํ ์๋ ์๋ค.
์ฐธ๊ณ ๋ก ์ค์ ๋ก ํ์ด์ฌ
์ ์ด์ฒ๋ผ ๋์ํ๋ค.
๋ ๋ค๋ฅธ ์ฌ์ค2 ๊ฐ์ ์ํ ์ ๋ฌ
์ด๋ผ๋ ์ฉ์ด๋ ์ฌ์ค ECMAScript ์ฌ์์ ๋ฑ์ฅํ์ง ์๋๋ค. ๊ฐ์ ์ํ ์ ๋ฌ์ด๋ผ๋ ์ฉ์ด๊ฐ ์คํด๋ฅผ ๋ถ๋ฌ์ผ์ผํฌ ์ ์๋ค.
์๊ฒฉํ๊ฒ ํํํ์๋ฉด ๋ณ์์๋ ๊ฐ์ด ์ ๋ฌ๋๋ ๊ฒ์ด ์๋๋ผ ๋ฉ๋ชจ๋ฆฌ ์ฃผ์๊ฐ ์ ๋ฌ
๋๊ธฐ ๋๋ฌธ์ด๋ค. ์ด๋ ๋ณ์์ ๊ฐ์ ์๋ณ์๋ ๊ฐ์ด ์๋๋ผ ๋ฉ๋ชจ๋ฆฌ ์ฃผ์๋ฅผ ๊ธฐ์ต
ํ๊ณ ์๊ธฐ ๋๋ฌธ์ด๋ค!
์๋ณ์๋ ์ด๋ค ๊ฐ์ ๊ตฌ๋ณํด ๋ผ ์ ์๋ ๊ณ ์ ํ ์ด๋ฆ
์ด๋ค. ๊ฐ์ ๋ฉ๋ชจ๋ฆฌ ๊ณต๊ฐ์ ์ ์ฅ
๋์ด ์๋ค. ๋ฐ๋ผ์ ์๋ณ์๋ ๋ฉ๋ชจ๋ฆฌ ๊ณต๊ฐ์ ์ ์ฅ๋์ด ์๋ ์ด๋ค ๊ฐ์ ์๋ณํด๋ด๋ ๋ณ์๋ค.
๋ฐ๋ผ์! ์๋ณ์๋ ๊ฐ์ด ์๋ ๋ฉ๋ชจ๋ฆฌ ์ฃผ์๋ฅผ ๊ธฐ์ตํ๊ณ ์์ด์ผ ํ๋ค.
๋ณ๊ฒฝ ๊ฐ๋ฅํ ๊ฐ(mutable value)
๊ฐ์ฒด(์ฐธ์กฐ) ํ์
์ ๊ฐ, ์ฆ ๊ฐ์ฒด๋ ๋ณ๊ฒฝ ๊ฐ๋ฅํ ๊ฐ
์ด๋ค.
์์ ๊ฐ์ ํ ๋นํ ๋ณ์๊ฐ ๊ธฐ์ตํ๋ ๋ฉ๋ชจ๋ฆฌ ์ฃผ์
๋ฅผ ํตํด ๋ฉ๋ชจ๋ฆฌ ๊ณต๊ฐ์ ์ ๊ทผํ๋ฉด ์์ ๊ฐ์ ์ ๊ทผ
ํ ์ ์๋ค.
๊ทธ์ ๋ฐํด, ๊ฐ์ฒด๋ ํ ๋นํ ๋ณ์๊ฐ ๊ธฐ์ตํ๋ ๋ฉ๋ชจ๋ฆฌ ์ฃผ์๋ฅผ ํตํด ๋ฉ๋ชจ๋ฆฌ ๊ณต๊ฐ์ ์ ๊ทผํ๋ฉด ์ฐธ์กฐ ๊ฐ(reference value)์ ์ ๊ทผ
ํ ์ ์๋ค.
์ฐธ์กฐ ๊ฐ์ ์์ฑ๋ ๊ฐ์ฒด๊ฐ ์ ์ฅ๋ ๋ฉ๋ชจ๋ฆฌ ๊ณต๊ฐ์ ์ฃผ์, ๊ทธ ์์ฒด๋ค.
์ ๊ทธ๋ฆผ ์ฒ๋ผ ๊ฐ์ฒด๋ฅผ ํ ๋นํ ๋ณ์๋ฅผ ์ฐธ์กฐํ๋ฉด ๋ฉ๋ชจ๋ฆฌ ์ ์ฅ๋์ด ์๋ ์ฐธ์กฐ ๊ฐ(์์ฑ๋ ๊ฐ์ฒด๊ฐ ์ ์ฅ๋ ๋ฉ๋ชจ๋ฆฌ ๊ณต๊ฐ์ ์ฃผ์)
์ ํตํด ์ค์ ๊ฐ์ฒด์ ์ ๊ทผํ๋ค.
const person = {
name : "Lee" ,
} ;
person . name = "Kim" ;
person . address = "Seoul" ;
console . log ( person ) ; // { name: "Kim", address: "Seoul" }
์์ ๊ฐ์ ๋ณ๊ฒฝ ๋ถ๊ฐ๋ฅํ ๊ฐ์ด๋ฏ๋ก ์์ ๊ฐ์ ๊ฐ๋ ๋ณ์์ ๊ฐ์ ๋ณ๊ฒฝํ๋ ค๋ฉด ์ฌํ ๋น ์ธ์๋ ์๋ค.
์ฌ์ง์ด const๋ก ์ ์ธํ์ผ๋ฉด ๊ทธ๋ง์ ๋ ์๋๋ค.
๊ฐ์ฒด๋ ๊ณ์ ์ธ๊ธํ์ง๋ง ๋ณ๊ฒฝ ๊ฐ๋ฅํ ๊ฐ์ด๋ค. ์ฌํ ๋น ์์ด๋ ๊ฐ์ฒด์ ๋ด์ฉ์ ์ง์ ๋ฐ๊ฟ ์ ์๋ค. ์ฆ, ํ๋กํผํฐ ๊ฐ์ ๋์ ์ผ๋ก ์ถ๊ฐ, ์ญ์ , ๊ฐฑ์ ์ด ๊ฐ๋ฅํ๋ค.
์ ๊ทธ๋ฆผ์ฒ๋ผ ๊ฐ์ฒด๋ ๋ฉ๋ชจ๋ฆฌ์ ์ ์ฅ๋ ๊ฐ์ฒด๋ฅผ ์ง์ ์์ ํ ์ ์๋ค. ์ด๋ ๊ฐ์ฒด๋ฅผ ํ ๋นํ ๋ณ์์ ์ฌํ ๋น์ ํ์ง ์์์ผ๋ฏ๋ก ๊ฐ์ฒด๋ฅผ ํ ๋นํ ๋ณ์์ ์ฐธ์กฐ ๊ฐ์ ๋ณ๊ฒฝ๋์ง ์๋๋ค.
๊ฐ์ฒด๋ฅผ ์์ฑํ๊ณ ๊ด๋ฆฌํ๋ ๋ฐฉ์์ ๋งค์ฐ ๋ณต์กํ๋ฉฐ ๋น์ฉ์ด ๋ง์ด ๋ ๋ค.
๊ฐ์ฒด๋ฅผ ๋ณ๊ฒฝํ ๋๋ง๋ค ์์ ๊ฐ์ฒ๋ผ ์ด์ ๊ฐ์ ๋ณต์ฌํด์ ์๋กญ๊ฒ ์์ฑํ๋ค๋ฉด ๋ช
ํํ๊ณ ์ ๋ขฐ์ฑ์ ๋ณด์ฅ๋๊ฒ ์ง๋ง, ๊ฐ์ฒด์ ํฌ๊ธฐ๊ฐ ๋งค์ฐ ํฌ๋ค๋ฉด?!
๋ณต์ฌํด์ ์์ฑํ๋ ๋น์ฉ์ด ๊ต์ฅํ ๋ง์ด ๋ ๋ค.
๊ฐ์ฒด๋ ์์๊ฐ์ฒ๋ผ ํฌ๊ธฐ๊ฐ ๊ณ ์ ์ ์ด์ง๋ ์๊ณ , ํ๋กํผํฐ์ ๊ฐ์ด ๋ ๊ฐ์ฒด์ผ ์๋ ์๋ค!
๊ฒฐ๊ณผ์ ์ผ๋ก ๋ฉ๋ชจ๋ฆฌ์ ํจ์จ์ฑ์ด ๋ฎ๊ณ , ์ฑ๋ฅ์ด ๋๋น ์ง ์ ์๋ค.
์์ ๊ฐ์ ์ด์ ๋ก ๊ฐ์ฒด๋ฅผ ๋ณต์ฌํด์ ์์ฑํ๋ ๋น์ฉ์ ์ ์ฝํ์ฌ ์ฑ๋ฅ์ ํฅ์์ํค๊ธฐ ์ํด ๊ฐ์ฒด๋ ๋ณ๊ฒฝ ๊ฐ๋ฅํ ๊ฐ์ผ๋ก ์ค๊ณ๋ ๊ฒ์ด๋ค!
๋ฌผ๋ก ์ด๋ฌํ ๊ตฌ์กฐ๋ ๋จ์ ๋ ์๋ค. ์์ ๊ฐ๊ณผ๋ ๋ค๋ฅด๊ฒ ์ฌ๋ฌ ๊ฐ์ ์๋ณ์๊ฐ ํ๋์ ๊ฐ์ฒด๋ฅผ ๊ณต์ ํ ์๋ ์๋ค๋ ๊ฒ์ด๋ค!
const person = {
name : "Lee" ,
} ;
const copy = person ; // ์ฐธ์กฐ ๊ฐ์ ๋ณต์ฌ
console . log ( person === copy ) ; // true
copy . name = "Kim" ;
console . log ( person ) ; // { name: "Kim" }
๊ฐ์ฒด๋ฅผ ๊ฐ๋ฆฌํค๋ ์๋ณธ ๋ณ์๋ฅผ ๋ค๋ฅธ ๋ณ์์ ํ ๋นํ๋ฉด ์๋ณธ์ ์ฐธ์กฐ ๊ฐ์ด ๋ณต์ฌ๋์ด ์ ๋ฌ๋๋ค ์ด๋ฅผ ์ฐธ์กฐ์ ์ํ ์ ๋ฌ
์ด๋ผ๊ณ ํ๋ค.
์ ๊ทธ๋ฆผ์ฒ๋ผ ์๋ณธ person์ copy์ ํ ๋นํ๋ฉด ์๋ณธ person์ ์ฐธ์กฐ ๊ฐ์ ๋ณต์ฌํด์ copy์ ์ ์ฅํ๋ค.
์ด๋ person๊ณผ copy๋ ์ ์ฅ๋ ๋ฉ๋ชจ๋ฆฌ ์ฃผ์๋ ๋ค๋ฅด์ง๋ง ๋์ผํ ์ฐธ์กฐ ๊ฐ์ ๊ฐ๋๋ค. ๋ค์ ๋งํด ๋ ๋ค ๊ฐ์ ๊ฐ์ฒด๋ฅผ ๊ฐ๋ฆฌํจ๋ค.
์ด๋ฌํ ๋์์ ์์ ์ฝ๋ ์์์ฒ๋ผ ์๋ณธ ๋๋ ์ฌ๋ณธ ์ค ์ด๋ ํ์ชฝ์ ๊ฐ์ฒด๋ฅผ ๋ณ๊ฒฝํ๋ฉด ์๋ก ์ํฅ์ ์ฃผ๊ณ ๋ฐ๋ ๊ฒฐ๊ณผ๋ฅผ ์ด๋ํ๋ค.
๋ชจ๋ ์๋ฐ์คํฌ๋ฆฝํธ Deep Dive