DevLog

Primitive type & Reference type ๋ณธ๋ฌธ

๐Ÿง‘๐Ÿป‍๐Ÿ’ป ๊ฐœ๋ฐœ๊ฐœ๋ฐœ/๊ธฐํƒ€

Primitive type & Reference type

Seungjae Lee 2021. 5. 28. 15:10

<์›์‹œ ์ž๋ฃŒํ˜• & ์ฐธ์กฐ ์ž๋ฃŒํ˜•>

 

๋ฌธ์ œ: ์ฝ”๋“œ๊ฐ€ ์‹คํ–‰๋œ ํ›„, x.foo์˜ ๊ฐ’์€ ๋ฌด์—‡์ผ๊นŒ์š”?

let x = { foo: 3 };
let y = x;
y.foo = 2;

// ์˜ค๋‹ต : 3
// ์ •๋‹ต : 2;

 

๋”๋ณด๊ธฐ

ํ•ด์„ค

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์—์„œ ์›์‹œ ์ž๋ฃŒํ˜•์ด ์•„๋‹Œ ๋ชจ๋“  ๊ฒƒ์€ Object ์ž…๋‹ˆ๋‹ค. ๋ฐฐ์—ด([])๊ณผ ๊ฐ์ฒด({}), ํ•จ์ˆ˜(function(){})๊ฐ€ ๋Œ€ํ‘œ์ ์ž…๋‹ˆ๋‹ค. ์ด๋Ÿฐ ์ž๋ฃŒํ˜•์„ ์ฐธ์กฐ ์ž๋ฃŒํ˜• (reference data type)์ด๋ผ๊ณ  ๋ถ€๋ฆ…๋‹ˆ๋‹ค.

์ฐธ์กฐ ์ž๋ฃŒํ˜•์ด ๋ณ€์ˆ˜์— ํ• ๋‹น๋˜๋Š” ๊ฒฝ์šฐ๋Š”, ๋ณ€์ˆ˜์— ์ด ๋ฐ์ดํ„ฐ๊ฐ€ ์ €์žฅ๋˜๋Š” ๊ณณ์˜ ์ฃผ์†Œ๊ฐ€ ํ• ๋‹น์ด ๋ฉ๋‹ˆ๋‹ค.

๋ณ€์ˆ˜๋Š” ์‚ฌ์‹ค ์ปดํ“จํ„ฐ์˜ ๋ฉ”๋ชจ๋ฆฌ์— ๋ฌด์–ธ๊ฐ€๋ฅผ ์ €์žฅํ•˜๋Š” ๊ฒƒ์„ ๋ณด๋‹ค ์ธ๊ฐ„์ด ์ดํ•ดํ•˜๊ธฐ ์‰ฝ๊ฒŒ ํ•˜๊ธฐ ์œ„ํ•ด์„œ ๋งŒ๋“  ๊ฐœ๋…์ž…๋‹ˆ๋‹ค. ๊ทธ๋ ‡๊ธฐ ๋•Œ๋ฌธ์— ๋ณ€์ˆ˜์˜ ์„ ์–ธ์€ ๋ฉ”๋ชจ๋ฆฌ์— ์ž๋ฆฌ๋ฅผ ์žก๋Š” ๊ฒƒ์ด๊ณ , ๊ฐ’์˜ ํ• ๋‹น์€ ๋ฉ”๋ชจ๋ฆฌ์— ๊ฐ’์„ ์ฑ„์šฐ๋Š” ๊ฒƒ์ด๋ผ๊ณ  ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์›์‹œ ์ž๋ฃŒํ˜•์€ ๋ฐฐ์—ด๊ณผ ๊ฐ์ฒด์™€๋Š” ๋‹ค๋ฅด๊ฒŒ ํ•˜๋‚˜์˜ ์ •๋ณด๋งŒ ๋‹ด๊ณ  ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ๋ณ€์ˆ˜์— ์ง์ ‘ ๊ฐ’์„ ๋ณต์‚ฌํ•ด๋„ ํฐ ๋ฌธ์ œ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ๋ณ€์ˆ˜ ํ•˜๋‚˜์— ๊ฐ’ ํ•˜๋‚˜, ๋‹จ์ˆœํ•˜๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ฐ์ฒด์™€ ๋ฐฐ์—ด์€ ์กฐ๊ธˆ ๋‹ค๋ฆ…๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๊ฐ€ ์–ด๋–ป๊ฒŒ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๋А๋ƒ์— ๋”ฐ๋ผ์„œ ๋‹ด๊ธธ ์ˆ˜ ์žˆ๋Š” ์ •๋ณด์˜ ํฌ๊ธฐ๊ฐ€ ์ฒœ์ฐจ๋งŒ๋ณ„์ž…๋‹ˆ๋‹ค. (100๋งŒ๊ฐœ์˜ ํšŒ์›์ •๋ณด๊ฐ€ ๋‹ด๊ธด ๋ฐฐ์—ด์„ ์ƒ์ƒํ•ด๋ด…์‹œ๋‹ค.) ๊ทธ๋ ‡๊ธฐ ๋•Œ๋ฌธ์— ๋™์ (dynamic)์œผ๋กœ ๋ณ€์ˆ˜์˜ ํฌ๊ธฐ๊ฐ€ ๋ณ€ํ•  ์ˆ˜ ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋ณ€์ˆ˜์— ํ•˜๋‚˜์˜ ๊ฐ์ฒด๋ฅผ ํ†ต์งธ๋กœ ๋„ฃ์„ ์ˆ˜ ์—†๋Š” ํ•ฉ๋ฆฌ์ ์ธ ์ด์œ ๊ฐ€ ์ƒ๊ธด๊ฑฐ์ฃ .

๊ทธ๋ž˜์„œ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋Š” ๋จธ๋ฆฌ๋ฅผ ์”๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋ฉด ๋ฉ”๋ชจ๋ฆฌ์— ๊ณต๊ฐ„์€ ๋‚ด๊ฐ€ ์•Œ์•„์„œ ๋ถ€์—ฌํ•˜๊ณ , ๋ณ€์ˆ˜๋Š” ๊ทธ ๊ณต๊ฐ„์˜ ์ฃผ์†Œ๋งŒ ์ฐธ์กฐํ•˜๋„๋ก ํ•˜์ž! ๊ทธ๋ž˜์„œ ์ฐธ์กฐ ์ž๋ฃŒํ˜•์ด ํƒ„์ƒํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

let y = x;

๋ณ€์ˆ˜ x๋ฅผ ๋ณ€์ˆ˜ y์— ํ• ๋‹นํ•˜๋Š” ๊ฒฝ์šฐ, ๋ณ€์ˆ˜ x์˜ ๊ฐ’์€ ์ฐธ์กฐ ์ž๋ฃŒํ˜•์ด๊ธฐ ๋•Œ๋ฌธ์— x์˜ ๊ฐ’ { foo: 3 }์˜ ์ฃผ์†Œ๋ฅผ y์— ํ• ๋‹นํ•ฉ๋‹ˆ๋‹ค. ๊ฐ’ ์ž์ฒด๋ฅผ ํ• ๋‹นํ–ˆ๋˜ 1๋ฒˆ ๋ฌธ์ œ์™€์˜ ์ฐจ์ด์ ์ด์ฃ .

์ด ์ƒํƒœ๋Š” ๋ณ€์ˆ˜ x์™€ ๋ณ€์ˆ˜ y์— ๋ชจ๋‘ ๊ฐ™์€ { foo : 3 } ์ด๋ผ๋Š” ๊ฐ์ฒด์˜ ์ฃผ์†Œ๋ฅผ ๋ฐ”๋ผ๋ณด๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

y.foo = 2;

y.foo = 2, ๊ฐ’์ด 3์ด์˜€๋˜ y.foo์— 2๋ฅผ ํ• ๋‹น์„ ํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋ฉด x.foo๋Š” ๋ฌด์—‡์ผ๊นŒ์š”? ํ˜„์žฌ๋Š” ๊ฐ™์€ ์ฃผ์†Œ๋ฅผ ๋ฐ”๋ผ๋ณด๊ณ  ์žˆ๋Š” y.foo๊ฐ€ 2๋กœ ๋ณ€๊ฒฝ์ด ๋˜์—ˆ์œผ๋‹ˆ, ๊ฐ™์€ ๊ณณ์„ ๋ฐ”๋ผ๋ณด๊ณ  ์žˆ์—ˆ๋˜ x.foo๋„ 2๊ฐ€ ๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

 

๋ฌธ์ œ : ์ฝ”๋“œ๊ฐ€ ์‹คํ–‰๋œ ํ›„, myArray์˜ ๊ฐ’์€ ๋ฌด์—‡์ผ๊นŒ์š”?

let myArray = [2, 3, 4, 5]; 
let ourArray = myArray; ourArray[2] = 25; 
ourArray = undefined;

// ์˜ค๋‹ต : [2, 3, 4, 5]
// ์ •๋‹ต : [2, 3, 25, 5]

 

๋”๋ณด๊ธฐ

ํ•ด์„ค

let ourArray = myArray;

๋ณ€์ˆ˜ ourArray์— myArray์˜ ์ฃผ์†Œ๊ฐ’์ด ํ• ๋‹น ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

ourArray[2] = 25;

ourArray ์ฃผ์†Œ๊ฐ’์— ์œ„์น˜ํ•œ ๋ฐฐ์—ด์˜ ์˜ 2๋ฒˆ์งธ ์š”์†Œ๋ฅผ 25๋กœ ๋ณ€๊ฒฝํ•ฉ๋‹ˆ๋‹ค. ourArray์™€ myArray์˜ ์ฃผ์†Œ๊ฐ’์€ ๊ฐ™์Œ์œผ๋กœ ํ˜„์žฌ myArray๋Š” [2, 3, 25, 5] ์ž…๋‹ˆ๋‹ค.

ourArray = undefined;

์ด์ œ ๋ณ€์ˆ˜ ourArray์— ์›์‹œ ์ž๋ฃŒํ˜• undefined๊ฐ€ ํ• ๋‹น๋˜์—ˆ๊ธฐ ๋•Œ๋ฌธ์—, myArray์— ์ ‘๊ทผํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ myArray๋Š” ๊ทธ๋Œ€๋กœ [2, 3, 25, 5]์ด๊ธฐ ๋•Œ๋ฌธ์— ๋‹ต์€ [2, 3, 25, 5] ์ž…๋‹ˆ๋‹ค.

๋ฌธ์ œ : ์ฝ”๋“œ๊ฐ€ ์‹คํ–‰๋œ ํ›„, player.score์˜ ๊ฐ’์€ ๋ฌด์—‡์ผ๊นŒ์š”?

let player = { score: 3 };

function doStuff(obj) {
	obj.score = 2;
}

doStuff(player);

// ์˜ค๋‹ต : undefined
// ์ •๋‹ต : 2

 

๋”๋ณด๊ธฐ

ํ•ด์„ค

doStuff(player);

ํ•จ์ˆ˜ doStuff์— ๋ณ€์ˆ˜ player๋ฅผ ์ธ์ž๋กœ ์ „๋‹ฌํ•˜์—ฌ ํ˜ธ์ถœํ•ฉ๋‹ˆ๋‹ค. (์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.)

function doStuff(obj) { obj.score = 2; }

ํ•จ์ˆ˜๊ฐ€ ํ˜ธ์ถœ๋˜๋ฉด (์‹คํ–‰๋˜๋ฉด) ๋งค๊ฐœ๋ณ€์ˆ˜ obj์— ๋ณ€์ˆ˜ player์˜ ๊ฐ’์ด ํ• ๋‹น๋ฉ๋‹ˆ๋‹ค. { score: 3 }์˜ ์ฃผ์†Œ๊ฐ’์ด๊ฒ ์ฃ ? obj.score์— 2๋ฅผ ํ• ๋‹นํ•˜๋ฉด, obj์™€ player๋Š” ๊ฐ™์€ ์ฃผ์†Œ๊ฐ’์„ ๊ฐ€์ง€๊ณ  ์žˆ๊ธฐ ๋•Œ๋ฌธ์—, player.score๋„ 2๊ฐ€ ๋˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. ์ •๋‹ต์€ 2์ž…๋‹ˆ๋‹ค.

 

๋ฌธ์ œ : ์ฝ”๋“œ๊ฐ€ ์‹คํ–‰๋œ ํ›„, score ์˜ ๊ฐ’์€ ๋ฌด์—‡์ผ๊นŒ์š”?

let score = 80; 
function doStuff(value) { 
	value = 90; 
}

doStuff(score)

// ์˜ค๋‹ต : undefined
// ์ •๋‹ต : 80

 

๋”๋ณด๊ธฐ

ํ•ด์„ค

doStuff(score)

ํ•จ์ˆ˜ doStuff์— score์˜ ๊ฐ’์„ ์ธ์ž๋กœ ์ „๋‹ฌํ•˜์—ฌ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.

function doStuff(value) { value = 90; }

๋งค๊ฐœ๋ณ€์ˆ˜ value์— score์˜ ๊ฐ’ 80์ด ์ „๋‹ฌ๋˜๊ณ ,

value = 90์—์„œ value์— 90์ด ํ• ๋‹น๋ฉ๋‹ˆ๋‹ค.

๋‹ค๋งŒ ๋ณ€์ˆ˜ score์˜ ๊ฐ’ 80์€, ์ฐธ์กฐ ์ž๋ฃŒํ˜•์ด ์•„๋‹ˆ๊ธฐ ๋•Œ๋ฌธ์— ์ฃผ์†Œ๊ฐ’์„ ์ „๋‹ฌํ•˜์ง€ ์•Š๊ณ , ๊ฐ’ ์ž์ฒด๋ฅผ ๋ณต์‚ฌํ•˜์—ฌ ์ „๋‹ฌํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ ํ•จ์ˆ˜์—์„œ ์–ด๋–ค ์ผ์ด ๋ฐœ์ƒํ–ˆ๋˜๊ฐ€์™€ ๊ด€๋ จ์ด ์—†์ด score๋Š” ์ดˆ๊ธฐ์— ํ• ๋‹น๋œ ๊ฐ’ 80์ด ๊ทธ๋Œ€๋กœ ์œ ์ง€๋ฉ๋‹ˆ๋‹ค. ์ •๋‹ต์€ 80์ž…๋‹ˆ๋‹ค.

Comments