<๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ๋ ๋ฐฉ์์ ๋ฐ๋ฅธ ๋ถ๋ฅ>
์์ ์๋ฃํ(primitive data type) = number, string, boolean, null, undefined ๊ณผ ๊ฐ์ ๊ณ ์ ๋ ์ ์ฅ ๊ณต๊ฐ์ ์ฐจ์งํ๋ ๋ฐ์ดํฐ
์ฐธ์กฐ ์๋ฃํ(reference data type) = array, object, function
์์ ์๋ฃํ์ ํน์ง๊ณผ ์ข ๋ฅ
string, number, bigint, boolean, undefined, symbol, (null)
- ๋ณต์ฌํ๋ค๋ฉด ๊ฐ์ ๋ณต์ฌ
- ์์ ์๋ฃํ์ ๋ณด๊ดํจ์ธ ๋ณ์์๋ ํ๋์ ์์ ์๋ฃํ๋ง ๋ด์ ์ ์๋ค. ์ผ์ ํ ํฌ๊ธฐ์ ๋ฐ์ดํฐ๊ฐ ์จ๋ค๊ณ ์์ํ ์ ์๊ธฐ ๋๋ฌธ์ ์์ ์๋ฃํ์ด ๋ด๊ธฐ๋ ๋ณด๊ดํจ์ ํฌ๊ธฐ๋ ๊ณ ์ ํ๋ ๊ฒ์ด๋ค.
- ๋ณ์์๋ ๋ฐ์ดํฐ์ ํฌ๊ธฐ์๋ ๊ด๊ณ์์ด ํ๋์ ๋ฐ์ดํฐ๋ง ๋ด์ ์ ์๋ค. ์์ ์๋ฃํ์ ๊ฐ ์์ฒด์ ๋ํ ๋ณ๊ฒฝ์ด ๋ถ๊ฐ๋ฅ(immutable)ํ์ง๋ง, ๋ณ์์ ๋ค๋ฅธ ๋ฐ์ดํฐ๋ฅผ ํ ๋นํ ์๋ ์๋ค.
์ฐธ์กฐ ์๋ฃํ์ ํน์ง๊ณผ ์ข ๋ฅ
๋ฐฐ์ด([])๊ณผ ๊ฐ์ฒด({}), ํจ์(function(){})
JavaScript์์ ์์ ์๋ฃํ์ด ์๋ ๋ชจ๋ ๊ฒ์ ์ฐธ์กฐ ์๋ฃํ์ด๋ค.
- ๋ณต์ฌํ๋ค๋ฉด ์ฃผ์๋ฅผ ๋ณต์ฌ
- ์ฐธ์กฐ ์๋ฃํ์๋ ํ๋์ ๋ฐ์ดํฐ๊ฐ ์๋ ์ฌ๋ฌ ๋ฐ์ดํฐ๊ฐ ๋ด๊ธฐ๊ฒ ๋๋ค.
- ๋ณ์์๋ ํน๋ณํ ๋ฐ์ดํฐ ๋ณด๊ดํจ์ ์ฐพ์๊ฐ ์ ์๋ ์ฃผ์๊ฐ ๋ด๊ฒจ์๊ณ , ์ด ์ฃผ์๋ฅผ ๋ฐ๋ผ๊ฐ ๋ณด๋ฉด ํน๋ณํ ๋ฐ์ดํฐ ๋ณด๊ดํจ์ ์ฐพ์ ์ ์๋๋ฐ, ์ด ํน๋ณํ ๋ฐ์ดํฐ ๋ณด๊ดํจ(heap)์์๋ ์๊ธฐ ๋ง์๋๋ก ์ฌ์ด์ฆ๋ฅผ ๋๋ ธ๋ค๊ฐ ์ค์ผ ์ ์๋ค.
- ์ฐธ์กฐ ์๋ฃํ์ธ ๋ฐฐ์ด๊ณผ ๊ฐ์ฒด๋ ์์ ์๋ฃํ๊ณผ ๋ฌ๋ฆฌ ์ ์ฅ ๊ณต๊ฐ์ด ๊ณ์ ๋์ด๋๋ค. ๊ทธ ์ด์ ๋ ๋ฐฐ์ด๊ณผ ๊ฐ์ฒด, ๊ทธ๋ฆฌ๊ณ ํจ์๊ฐ ๋ด๊ฒจ์๋ ์ ์ฅ ๊ณต๊ฐ์ ํน๋ณํ ์ ์ฅ ๊ณต๊ฐ(heap)์ ์ฌ์ฉํ๊ธฐ ๋๋ฌธ์ด๋ค. ์ด์ฒ๋ผ ๋ฐ์ดํฐ๋ ๋ณ๋๋ก ๊ด๋ฆฌ๋๊ณ , ์ฐ๋ฆฌ๊ฐ ์ง์ ๋ค๋ฃจ๋ ๋ณ์์๋ ์ฃผ์๊ฐ ์ ์ฅ๋๊ธฐ ๋๋ฌธ์ reference data type์ด๋ผ๊ณ ๋ถ๋ฅธ๋ค.
์ฐธ์กฐ ์๋ฃํ์ ===(strict equality)๋ ์ฃผ์๊ฐ์ด ๊ฐ์์ง๋ฅผ ํ์ธํ๋ค.
๊ทธ๋ ๊ธฐ ๋๋ฌธ์ ๋ ์ฐธ์กฐ ์๋ฃํ์ ์ฃผ์๊ฐ์ ๋ค๋ฅด๋ค๊ณ ํ๋จ์ ๋ด๋ฆด ์ ์๋ค.
์์์๋ฃํ๊ณผ ์ฐธ์กฐ์๋ฃํ์ ์ค์ํ ์ฐจ์ด์
- ์์ ํ์ ๋ฐ์ดํฐ๋ ๊ฐ ๋ณ์ ๊ฐ์ ์์ ํ์ ๋ฐ์ดํฐ๋ฅผ ๋ณต์ฌํ ๊ฒฝ์ฐ ๋ฐ์ดํฐ ๊ฐ์ด ๋ณต์ฌ๋๊ธฐ ๋๋ฌธ์ ๊ธฐ์กด์ ๋ฐ์ดํฐ์ ์ํฅ์ ์ฃผ์ง ์๋๋ค.
- ์ฐธ์กฐ ํ์ ๋ฐ์ดํฐ๋ ์ฃผ์๋ฅผ ๋ณต์ฌํ๊ธฐ ๋๋ฌธ์ ๋ณต์ฌํ ๋ฐ์ดํฐ์์ ์์๋ฅผ ๋ณ๊ฒฝํ๊ฒ ๋๋ค๋ฉด ์ฃผ์์์ ์๋ ๋ฐ์ดํฐ๊ฐ ๋ณ๊ฒฝ์ด ๋๊ธฐ ๋๋ฌธ์ ๊ธฐ์กด์ ๋ฐ์ดํฐ์๋ ์ํฅ์ด ๊ฐ๋ค.
- ์์ ์๋ฃํ์ด ํ ๋น๋ ๋์๋ ๋ณ์์ ๊ฐ(value) ์์ฒด๊ฐ ๋ด๊ธฐ๊ณ , ์ฐธ์กฐ ์๋ฃํ์ด ํ ๋น๋ ๋๋ ๋ณด๊ดํจ์ ์ฃผ์(reference)๊ฐ ๋ด๊ธด๋ค.
- ๊ทธ๋์ ์ฐธ์กฐ ์๋ฃํ์ ๊ธฐ์กด์ ๊ณ ์ ๋ ํฌ๊ธฐ์ ๋ณด๊ดํจ์ด ์๋๋ผ, ๋์ ์ผ๋ก ํฌ๊ธฐ๊ฐ ๋ณํ๋ ํน๋ณํ ๋ณด๊ดํจ์ ์ฌ์ฉํ ์ ์๋ค.
let first = [10, 20, 30, 40];
let second = first;
second[0] = 5;
first์ 0๋ฒ์งธ ์ธ๋ฑ์ค์ ์๋ ์์๋ 5์ด๋ค. true
first์ second๋ ๊ฐ์ ์ฃผ์๋ฅผ ๊ณต์ ํ๊ณ ์๋ค. true // ๋ฐฐ์ด์ ์ฐธ์กฐ์๋ฃํ์ด๊ธฐ ๋๋ฌธ์ด๋ค.
first์ second๋ ์ฐธ์กฐ ์๋ฃํ์ด๋ค. true
first === second๋ true๋ค. true // second๋ first๊ฐ ๊ฐ์ง๊ณ ์๋ ์ฃผ์๋ฅผ ๊ทธ๋๋ก ๊ฐ์ง๊ณ ์๊ธฐ ๋๋ฌธ์ด๋ค.
console.log([1,2,3] === [1,2,3]); // false
์ฐธ์กฐ ์๋ฃํ์ ===(strict equality)๋ ์ฃผ์๊ฐ์ด ๊ฐ์์ง๋ฅผ ํ์ธํ๋ค.
๊ทธ๋ ๊ธฐ ๋๋ฌธ์ ๋ ์ฐธ์กฐ ์๋ฃํ์ ์ฃผ์๊ฐ์ ๋ค๋ฅด๋ค๊ณ ํ๋จ์ ๋ด๋ฆด ์ ์๋ค.
์ปดํจํฐ๊ฐ ์ ์ฝ๋๋ฅผ ์ฝ์ผ๋ฉด์, ์ด๋ฏธ ๋ ๊ฐ์ heap ์ ์ฅ ๊ณต๊ฐ์ ์ฃผ์๋ฅผ ํ๋ณดํ ๊ฒ์ผ๋ก ๋ณด๋ฉด ๋๋ค. ๋ฐฐ์ด([])๊ณผ ๊ฐ์ฒด({}) ๋ฑ ์ฐธ์กฐ ์๋ฃํ์ ์ฝ์ ๋, ๋ฏธ๋ฆฌ ์ฃผ์๊ฐ๊ณผ ๋ฉ๋ชจ๋ฆฌ ๊ฐ์ ์ก์๋๋ค๊ณ ์๊ฐํ๋ฉด ํธํฉ๋๋ค. ๊ทธ๋ฌ๋ฏ๋ก [] === [] ๋ true๊ฐ ๋์ค์ง ์๋ ๊ฒ์ด๋ค.
์ปดํจํฐ๊ณตํ์์์ reference๋!?
๋ณ์๋ฅผ ์ฝ๋ ๊ฒ์ด ์๋๋ผ, ๊ทธ ๋ณ์์ ์ฃผ์๋ฅผ "์ฐธ์กฐ"ํ์ฌ ์ค์ ๋ณ์๊ฐ ์๋ ์ฅ์์ ์ด๋ค ๋ฐ์ดํฐ๊ฐ ์๋์ง ๋์ฐฉํ๊ณ ๋์์ผ ๋น๋ก์ "์ฝ์ ์" ์๋ ๊ฒ์ด๋ค.
๋ณ์(variable)๋ ํ๋์ ๊ฐ์ ์ ์ฅํ๊ธฐ ์ํด ํ๋ณดํ ๋ฉ๋ชจ๋ฆฌ ๊ณต๊ฐ ์์ฒด ๋๋ ๊ทธ ๋ฉ๋ชจ๋ฆฌ ๊ณต๊ฐ์ ์๋ณํ๊ธฐ ์ํด ๋ถ์ธ ์ด๋ฆ์ด๋ค.
๋ณ์๋ ๊ฐ์ ์์น๋ฅผ ๊ฐ๋ฆฌํค๋ ์์ง์ ์ธ ์ด๋ฆ์ด๋ค. ๋ณ์ ์ด๋ฆ์ ์๋ณ์(identifier)๋ผ๊ณ ๋ ํ๋ค.
๋ณ์์ ๊ฐ์ ์ ์ฅํ๋ ๊ฒ์ ํ ๋น(assignment)/๋์ /์ ์ฅ์ด๋ผ๊ณ ํ๊ณ , ๋ณ์์ ์ ์ฅ๋ ๊ฐ์ ์ฝ์ด ๋ค์ด๋ ๊ฒ์ ์ฐธ์กฐ(reference)๋ผ๊ณ ํ๋ค.
์๋ณ์๋ ๊ฐ์ด ์๋๋ผ ๋ฉ๋ชจ๋ฆฌ ์ฃผ์๋ฅผ ๊ธฐ์ตํ๊ณ ์๋ค.
์ฐธ๊ณ ๋ก ๋ณ์, ํจ์, ํด๋์ค ๋ฑ์ ์ด๋ฆ์ ๋ชจ๋ ์๋ณ์๋ค!! ๋ฉ๋ชจ๋ฆฌ ์์ ์กด์ฌํ๋ ์ด๋ค ๊ฐ์ ์๋ณํ ์ ์๋ ์ด๋ฆ์ ๋ชจ๋ ์๋ณ์๋ผ๊ณ ๋ถ๋ฅธ๋ค.