관리 메뉴

Daehyunii's Dev-blog

11μž₯ μ›μ‹œ κ°’κ³Ό 객체의 비ꡐ λ³Έλ¬Έ

πŸ“š Language & CS knowledge/JavaScript (λͺ¨λ˜μžλ°”μŠ€ν¬λ¦½νŠΈ Deep Dive)

11μž₯ μ›μ‹œ κ°’κ³Ό 객체의 비ꡐ

Daehyunii 2022. 7. 1. 21:57

11μž₯ μ›μ‹œ κ°’κ³Ό 객체의 비ꡐ

  μ›μ‹œ νƒ€μž…μ˜ κ°’(μ›μ‹œ κ°’) 객체 νƒ€μž…μ˜ κ°’(객체)
κ°’μ˜ λ³€κ²½ κ°€λŠ₯ μ—¬λΆ€ λ³€κ²½ λΆˆκ°€λŠ₯ν•œ κ°’ λ³€κ²½ κ°€λŠ₯ν•œ κ°’
λ³€μˆ˜μ— ν• λ‹Ήμ‹œ, μ €μž₯λ˜λŠ” 것 μ‹€μ œ 값이 μ €μž₯ μ°Έμ‘° 값이 μ €μž₯
값이 ν• λ‹Ή 된 λ³€μˆ˜λ₯Ό λ‹€λ₯Έ λ³€μˆ˜μ— ν• λ‹Ήμ‹œ 값에 μ˜ν•œ 전달(μ›μ‹œ κ°’ 볡사) 참쑰에 μ˜ν•œ 전달(μ°Έμ‘° κ°’ 볡사)

11.1 μ›μ‹œ κ°’

11.1.1 λ³€κ²½ λΆˆκ°€λŠ₯ν•œ κ°’(μ›μ‹œ νƒ€μž…μ˜ κ°’, μ›μ‹œ κ°’)

  μ›μ‹œ νƒ€μž…μ˜ κ°’, 즉 μ›μ‹œ 값은 λ³€κ²½ λΆˆκ°€λŠ₯ν•œ 값이닀. ν•œλ²ˆ μƒμ„±λœ μ›μ‹œ 값은 읽기 μ „μš© κ°’μœΌλ‘œ λ³€κ²½ν•  수 μ—†λ‹€. λ³€κ²½ λΆˆκ°€λŠ₯ν•˜λ‹€λŠ” 것은 λ³€μˆ˜κ°€ μ•„λ‹ˆλΌ 값에 λŒ€ν•œ 이야기이닀. λ³€μˆ˜λŠ” μž¬ν• λ‹Ήμ„ 톡해 μ–Έμ œλ“ μ§€ λ³€μˆ˜ 값을 λ³€κ²½ν•  수 μžˆλ‹€. μž¬ν• λ‹Ή μ΄μ „μ˜ μ›μ‹œ 값을 λ³€κ²½ν•˜λŠ” 것이 μ•„λ‹ˆλΌ μƒˆλ‘œμš΄ λ©”λͺ¨λ¦¬ 곡간을 ν™•λ³΄ν•˜κ³  μž¬ν• λ‹Ήν•œ μ›μ‹œ 값을 μ €μž₯ν•œ ν›„, λ³€μˆ˜λŠ” μƒˆλ‘­κ²Œ μž¬ν• λ‹Ήν•œ μ›μ‹œ 값을 가리킨닀. μ΄λ•Œ λ³€μˆ˜κ°€ μ°Έμ‘°ν•˜λ˜ λ©”λͺ¨λ¦¬ κ³΅κ°„μ˜ μ£Όμ†Œκ°€ 바뀐닀. 이처럼 μ›μ‹œ 값은 λ³€κ²½ λΆˆκ°€λŠ₯ν•œ 값이기 λ•Œλ¬Έμ— 직접 λ³€κ²½ν•  수 μ—†λ‹€. κ°’μ˜ μ΄λŸ¬ν•œ νŠΉμ„±μ„ λΆˆλ³€μ„±μ΄λΌ ν•œλ‹€. μ΄λŸ¬ν•œ νŠΉμ„±μœΌλ‘œ 인해 μ›μ‹œ 값을 할당받은 λ³€μˆ˜λŠ” μž¬ν• λ‹Ή 이외에 λ³€μˆ˜ 값을 λ³€κ²½ν•  수 μžˆλŠ” 방법이 μ—†λ‹€.

 

11.1.2 λ¬Έμžμ—΄κ³Ό λΆˆλ³€μ„±

  μ›μ‹œ 값을 μ €μž₯ν•˜λ €λ©΄ λ¨Όμ € 확보해야 ν•˜λŠ” λ©”λͺ¨λ¦¬ κ³΅κ°„μ˜ 크기λ₯Ό κ²°μ •ν•΄μ•Ό ν•œλ‹€. 이λ₯Ό μœ„ν•΄ μ›μ‹œ νƒ€μž…λ³„λ‘œ λ©”λͺ¨λ¦¬ κ³΅κ°„μ˜ 크기가 미리 μ •ν•΄μ Έ μžˆλ‹€.( exλŒ€λž΅μ μœΌλ‘œ λ¬Έμžμ—΄ 문자 λ‹Ή 2λ°”μ΄νŠΈ, μˆ«μžλŠ” 8λ°”μ΄νŠΈ ) μ›μ‹œ 값인 λ¬Έμžμ—΄μ€ λ‹€λ₯Έ μ›μ‹œ κ°’κ³Ό 비ꡐ할 λ•Œ λ…νŠΉν•œ νŠΉμ§•μ΄ μžˆλ‹€. 숫자 κ°’μ˜ κ²½μš°μ—λŠ” 숫자 κ°’ 1 이든, 숫자 κ°’ 10000 이든 λͺ¨λ‘ 8λ°”μ΄νŠΈμ˜ λ©”λͺ¨λ¦¬ 곡간이 ν•„μš”ν•˜μ§€λ§Œ, λ¬Έμžμ—΄μ˜ κ²½μš°λ„€λŠ” λ¬Έμžλ‹Ή 2λ°”μ΄νŠΈκ°€ ν•„μš”ν•˜λ‹€. 즉 1개의 문자둜 이뀄진 λ¬Έμžμ—΄μ€ 2λ°”μ΄νŠΈ, 10개의 문자둜 이뀄진 λ¬Έμžμ—΄μ€ 20λ°”μ΄νŠΈκ°€ ν•„μš”ν•˜λ‹€.

var str1 = 'hi'; // 2개의 문자둜 이뀄진 λ¬Έμžμ—΄(λŒ€λž΅μ μœΌλ‘œ 4λ°”μ΄νŠΈμ˜ λ©”λͺ¨λ¦¬ 곡간이 ν•„μš”) 
var str2 = 'hello'; // 5개의 문자둜 이뀄진 λ¬Έμžμ—΄(λŒ€λž΅μ μœΌλ‘œ 10λ°”μ΄νŠΈμ˜ λ©”λͺ¨λ¦¬ 곡간이 ν•„μš”)

λ˜ν•œ λ¬Έμžμ—΄μ€ μœ μ‚¬ λ°°μ—΄ κ°μ²΄μ΄λ©΄μ„œ μ΄ν„°λŸ¬λΈ”μ΄λ―€λ‘œ λ°°μ—΄κ³Ό μœ μ‚¬ν•˜κ²Œ 각 λ¬Έμžμ— μ ‘κ·Όν•  수 μžˆλ‹€. λ¬Έμžμ—΄μ€ 마치 λ°°μ—΄μ²˜λŸΌ 인덱슀λ₯Ό 톡해 각 λ¬Έμžμ— μ ‘κ·Όν•  수 있으며, length ν”„λ‘œνΌν‹°λ₯Ό κ°–κΈ° λ•Œλ¬Έμ— μœ μ‚¬ λ°°μ—΄ 객체이고 for문으둜 μˆœνšŒν•  μˆ˜λ„ μžˆλ‹€.

 

β€»κΈ°μ΄ˆκ°œλ…

-μœ μ‚¬ λ°°μ—΄ 객체 : μœ μ‚¬ λ°°μ—΄ κ°μ²΄λž€ 마치 λ°°μ—΄μ²˜λŸΌ 인덱슀둜 ν”„λ‘œνΌν‹° 값에 μ ‘κ·Όν•  수 있고, length ν”„λ‘œνΌν‹°λ₯Ό κ°–λŠ” 객체λ₯Ό λ§ν•œλ‹€. 

-λ¬Έμžμ—΄ : μœ μ‚¬ λ°°μ—΄ 객체(1.인덱슀둜 ν”„λ‘œνΌν‹° 값에 μ ‘κ·Ό κ°€λŠ₯ & 2.length ν”„λ‘œνΌν‹°λ₯Ό κ°–μŒ) +  μ΄ν„°λŸ¬λΈ”(forλ¬Έ 순회 κ°€λŠ₯) νŠΉμ§•μ„ μ§€λ‹˜

var str = 'string';
console.log(str[0]); // λ¬Έμžμ—΄ s (인덱슀λ₯Ό ν†΅ν•œ ν”„λ‘œνΌν‹° κ°’ μ ‘κ·Ό)
console.log(str.length); // 숫자 κ°’ 6 (length ν”„λ‘œνΌν‹° μ ‘κ·Ό)
//μ›μ‹œ 값인 λ¬Έμžμ—΄μ΄ 마치 객체처럼 λ™μž‘ν•œλ‹€.(μžμ„Έν•œ λ‚΄μš©μ€ ν›„μˆ )

ν•˜μ§€λ§Œ, 이미 μƒμ„±λœ λ¬Έμžμ—΄μ˜ 일뢀 문자λ₯Ό 변경해도 λ°˜μ˜λ˜μ§€ μ•ŠλŠ”λ‹€. λ¬Έμžμ—΄μ€ λ³€κ²½ λΆˆκ°€λŠ₯ν•œ 값이기 λ•Œλ¬Έμ΄λ‹€. (λ³€μˆ˜ κ°’ μž¬ν• λ‹Ήμ€ λ‹Ήμ—°νžˆ λ˜λŠ” 것이닀.) μ›μ‹œ 값은 μ–΄λ–€ 일이 μžˆμ–΄λ„ λΆˆλ³€ν•œλ‹€. λ”°λΌμ„œ 예기치 λͺ»ν•œ λ³€κ²½μœΌλ‘œλΆ€ν„° 자유둭고 λ°μ΄ν„°μ˜ 신뒰성을 보μž₯ν•  수 μžˆλ‹€.

var str = 'string';
str[0] = 'A';
console.log(str); // string(μœ μ‚¬ λ°°μ—΄μ΄μ§€λ§Œ μ›μ‹œ 값이기 λ•Œλ¬Έμ— μ›μ‹œ κ°’μ˜ 일뢀 λ³€κ²½ λΆˆκ°€λŠ₯)

11.1.3 값에 μ˜ν•œ 전달

var score = 80;
var copy = score;

console.log(score); // 80
console.log(copy); // 80

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

  μœ„μ˜ 예제처럼 μ›μ‹œ 값을 κ°–λŠ” λ³€μˆ˜λ₯Ό ν• λ‹Ήν•˜λ©΄ ν• λ‹Ήλ°›λŠ” λ³€μˆ˜(copy)μ—λŠ” ν• λ‹Ήλ˜λŠ” λ³€μˆ˜(score)의 μ›μ‹œ 값이 λ³΅μ‚¬λ˜μ–΄ μ „λ‹¬λœλ‹€. 즉 ν• λ‹Ήλ˜λŠ” λ³€μˆ˜(score)λŠ” λ³€μˆ˜ κ°’ 80으둜 ν‰κ°€λ˜κ³ , 숫자 κ°’ 80이 λ³΅μ‚¬λ˜μ–΄ ν• λ‹Ήλ°›λŠ” λ³€μˆ˜(copy)에 ν• λ‹Ήλœλ‹€. 두 λ³€μˆ˜ 값은 μ„œλ‘œ λ‹€λ₯Έ λ©”λͺ¨λ¦¬ 곡간에 μ €μž₯된 λ³„κ°œμ˜ 값이닀. λ”°λΌμ„œ score λ³€μˆ˜μ˜ 값을 변경해도 copy λ³€μˆ˜μ˜ κ°’μ—λŠ” μ–΄λ– ν•œ 영ν–₯도 주지 μ•ŠλŠ”λ‹€. 이λ₯Ό '값에 μ˜ν•œ 전달'이라고 ν•œλ‹€. 더 μ—„λ°€νžˆ λ§ν•˜λ©΄ λ³€μˆ˜λͺ… 즉, μ‹λ³„μžκ°€ κΈ°μ–΅ν•˜λŠ” 것은 사싀 값이 μ•„λ‹ˆλΌ λ©”λͺ¨λ¦¬ μ£Όμ†Œλ₯Ό κΈ°μ–΅ν•˜λ―€λ‘œ '값에 μ˜ν•œ 전달'도 사싀은 값을 μ „λ‹¬ν•˜λŠ” 것이 μ•„λ‹ˆλΌ 값을 λ³΅μ‚¬ν•΄μ„œ μ €μž₯된 λ©”λͺ¨λ¦¬ μ£Όμ†Œλ₯Ό μ „λ‹¬ν•œλ‹€. 단, μ „λ‹¬λœ λ©”λͺ¨λ¦¬ μ£Όμ†Œλ₯Ό 톡해 λ©”λͺ¨λ¦¬ 곡간에 μ ‘κ·Όν•˜λ©΄ 값을 μ°Έμ‘°ν•  수 μžˆλ‹€. 

 

κ°€μž₯ μ€‘μš”ν•œ 것은 결ꡭ은 두 λ³€μˆ˜μ˜ μ›μ‹œ 값은 μ„œλ‘œ λ‹€λ₯Έ λ©”λͺ¨λ¦¬ 곡간에 μ €μž₯된 λ³„κ°œμ˜ 값이 λ˜μ–΄ μ–΄λŠ ν•œμͺ½μ—μ„œ μž¬ν• λ‹Ήμ„ 톡해 값을 λ³€κ²½ν•˜λ”λΌλ„ μ„œλ‘œ κ°„μ„­ν•  수 μ—†λ‹€λŠ” 것이닀.

 

11.2 객체

  κ°μ²΄λŠ” λ³€κ²½ κ°€λŠ₯ν•œ 값이기 λ•Œλ¬Έμ— μ›μ‹œ κ°’κ³Ό 같이 확보해야 ν•  λ©”λͺ¨λ¦¬ κ³΅κ°„μ˜ 크기λ₯Ό 사전에 μ •ν•΄ λ‘˜ 수 μ—†λ‹€. 객체λ₯Ό μƒμ„±ν•˜κ³  ν”„λ‘œνΌν‹°μ— μ ‘κ·Όν•˜λŠ” 것도 μ›μ‹œ κ°’κ³Ό 비ꡐ할 λ•Œ λΉ„μš©μ΄ 많이 λ“œλŠ” 일이닀. μ™œλƒν•˜λ©΄ ν”„λ‘œνΌν‹°μ˜ κ°œμˆ˜λ„ μ •ν•΄μ Έ μžˆμ§€ μ•ŠμœΌλ©°, ν”„λ‘œν”Όν‹° κ°’μ—λŠ” λͺ¨λ“  값이 올 수 있기 λ•Œλ¬Έμ΄λ‹€. λ”°λΌμ„œ κ°μ²΄λŠ” μ›μ‹œ κ°’κ³ΌλŠ” λ‹€λ₯Έ λ°©μ‹μœΌλ‘œ λ™μž‘ν•˜λ„λ‘ μ„€κ³„λ˜μ–΄ μžˆλ‹€. 

 

11.2.1 λ³€κ²½ κ°€λŠ₯ν•œ κ°’

  객체 νƒ€μž…μ˜ κ°’, 즉 κ°μ²΄λŠ” λ³€κ²½ κ°€λŠ₯ν•œ 값이닀. μ›μ‹œ 값을 ν• λ‹Ήν•œ λ³€μˆ˜λŠ” μ›μ‹œ κ°’ 자체λ₯Ό κ°’μœΌλ‘œ κ°–λŠ”λ‹€. ν•˜μ§€λ§Œ 객체λ₯Ό ν• λ‹Ήν•œ λ³€μˆ˜κ°€ κΈ°μ–΅ν•˜λŠ” λ©”λͺ¨λ¦¬ μ£Όμ†Œλ₯Ό 톡해 λ©”λͺ¨λ¦¬ 곡간에 μ ‘κ·Όν•˜λ©΄ μ°Έμ‘° 값에 μ ‘κ·Ό ν•  수 μžˆλ‹€. μ°Έμ‘° κ°’μ΄λž€ μƒμ„±λœ 객체가 μ €μž₯된 λ©”λͺ¨λ¦¬ κ³΅κ°„μ˜ μ£Όμ†Œ κ·Έ μžμ²΄λ‹€. λ‹€μ‹œ 말해, 객체λ₯Ό ν• λ‹Ήν•œ λ³€μˆ˜κ°€ κΈ°μ–΅ν•˜λŠ” λ©”λͺ¨λ¦¬ μ£Όμ†Œμ— λ“€μ–΄ μžˆλŠ” 것은 객체가 μ €μž₯λ˜μ–΄ μžˆλŠ” λ©”λͺ¨λ¦¬ μ£Όμ†Œκ°€ μ €μž₯λ˜μ–΄ μžˆλŠ” 것이닀.

  x, y λ³€μˆ˜κ°€ κΈ°μ–΅ν•˜λŠ” 것 x, y λ³€μˆ˜κ°€ κΈ°μ–΅ν•˜λŠ” λ©”λͺ¨λ¦¬ μ£Όμ†Œμ— μ ‘κ·Όμ‹œ
μ›μ‹œ 값이 ν• λ‹Ή 된 x λ³€μˆ˜ λ©”λͺ¨λ¦¬ μ£Όμ†Œ μ›μ‹œ κ°’ 자체
객체가 ν• λ‹Ή 된 y λ³€μˆ˜ λ©”λͺ¨λ¦¬ μ£Όμ†Œ 객체가 μ €μž₯된 λ©”λͺ¨λ¦¬ κ³΅κ°„μ˜ μ£Όμ†Œ(μ°Έμ‘° κ°’)

즉, 객체λ₯Ό ν• λ‹Ήν•œ λ³€μˆ˜λŠ” μ°Έμ‘° 값을 톡해 객체에 μ ‘κ·Όν•  수 μžˆλ‹€. λ˜ν•œ μ›μ‹œ 값은 λ³€κ²½ λΆˆκ°€λŠ₯ν•œ κ°’μ΄λ―€λ‘œ μ›μ‹œ 값을 κ°–λŠ” λ³€μˆ˜μ˜ 값을 λ³€κ²½ν•˜λ €λ©΄ μž¬ν• λ‹Ή μ™Έμ—λŠ” 방법이 μ—†λ‹€. ν•˜μ§€λ§Œ κ°μ²΄λŠ” λ³€κ²½ κ°€λŠ₯ν•œ κ°’μ΄λ―€λ‘œ, 객체λ₯Ό ν• λ‹Ήν•œ λ³€μˆ˜λŠ” μž¬ν• λ‹Ή 없이 객체λ₯Ό 직접 λ³€κ²½ν•  수 μžˆλ‹€.

 

11.2.2 참쑰에 μ˜ν•œ 전달

  객체λ₯Ό κ°€λ¦¬ν‚€λŠ” λ³€μˆ˜(A)λ₯Ό λ‹€λ₯Έ λ³€μˆ˜(B)에 ν• λ‹Ήν•˜λ©΄ μ›λ³Έμ˜ μ°Έμ‘° κ°’(객체가 μ €μž₯된 λ©”λͺ¨λ¦¬ κ³΅κ°„μ˜ μ£Όμ†Œ)이 λ³΅μ‚¬λ˜μ–΄ 전달 λœλ‹€. 이λ₯Ό 참쑰에 μ˜ν•œ 전달이라 ν•œλ‹€. μ‰½κ²Œ 말해, 객체에 μ ‘κ·Όν•  수 μžˆλŠ” μ£Όμ†Œκ°€ λ³΅μ‚¬λ˜μ–΄ 전달 λœλ‹€λŠ” 것이닀. 즉 Aλ³€μˆ˜μ™€ Bλ³€μˆ˜κ°€ μ €μž₯된 λ©”λͺ¨λ¦¬ μ£Όμ†ŒλŠ” λ‹€λ₯΄μ§€λ§Œ λ™μΌν•œ μ°Έμ‘° 값을 κ°–λŠ”λ‹€. 즉, 두 개의 μ‹λ³„μžκ°€ ν•˜λ‚˜μ˜ 객체λ₯Ό κ³΅μœ ν•œλ‹€λŠ” 것이닀. λ”°λΌμ„œ Aλ³€μˆ˜ λ˜λŠ” Bλ³€μˆ˜ 쀑 μ–΄λŠ ν•œμͺ½μ—μ„œ 객체λ₯Ό λ³€κ²½ν•˜λ©΄ μ„œλ‘œ 영ν–₯을 μ£Όκ³  λ°›λŠ”λ‹€.

λ³€μˆ˜ λ©”λͺ¨λ¦¬ μ£Όμ†Œ λ©”λͺ¨λ¦¬μ— μ €μž₯ 된 λ‚΄μš©
객체λ₯Ό κ°€λ₯΄ν‚€λŠ” λ³€μˆ˜ A 1111111 객체가 μ €μž₯된 λ©”λͺ¨λ¦¬ μ£Όμ†Œ (1234111)
λ³€μˆ˜ Aκ°€ ν• λ‹Ή 된 λ³€μˆ˜ B 2222222 객체가 μ €μž₯된 λ©”λͺ¨λ¦¬ μ£Όμ†Œ (1234111)
  1234111 객체