μƒˆμ†Œμ‹

Languages/C

Cμ–Έμ–΄ [call by value & call by reference]

  • -
λ°˜μ‘ν˜•

ν•¨μˆ˜μ˜ λ§€κ°œλ³€μˆ˜ 전달 ν˜•νƒœλŠ” 크게 λ‘κ°€μ§€μ˜ λ°©λ²•μœΌλ‘œ 정리 ν•  수 μžˆλŠ”λ°μš”~

μ˜€λŠ˜μ€ call by value 와 call by reference κ°€ 무엇인지 μ•Œμ•„λ³΄λ„λ‘ ν•˜κ² μŠ΅λ‹ˆλ‹€!

 

일단 λ‘˜μ˜ 큰 차이라 ν•˜λ©΄

' 값을 κ·ΈλŒ€λ‘œ λ³΅μ‚¬ν•˜μ—¬ 처리λ₯Ό ν•˜λŠλƒ, ν˜Ήμ€ 직접 μ°Έμ‘°λ₯Ό ν•˜λŠλƒ' μ •λ„μΈλ°μš”!

 

ν•˜λ‚˜μ”© μžμ„Ένžˆ μ•Œμ•„λ³΄λ„λ‘ ν• κ²Œμš”!

 


 

Call by value [값에 μ˜ν•œ 호좜 / κ°’ 전달 방식] 

λ―Έν‘ν•œ μ‹€λ ₯μ΄μ§€λ§Œ μ„€λͺ…을 돕기 μœ„ν•΄ κ°„λ‹¨νžˆ 그림으둜 κ·Έλ €λ΄€μ–΄μš”!

μ΄λ ‡κ²Œ 값을 전달 ν•˜λŠ” 방식을 call by value 방식이라고 ν•©λ‹ˆλ‹€.

 

이 방식은 μ‹€λ§€κ°œ λ³€μˆ˜μ˜ "κ°’"만 ν˜•μ‹λ§€κ°œλ³€μˆ˜λ‘œ 전달이 λ˜λ―€λ‘œ

ν˜•μ‹ λ§€κ°œλ³€μˆ˜λ§Œ 변경이 κ°€λŠ₯ν•˜κ³ , μ‹€ λ§€κ°œλ³€μˆ˜μ—λŠ” 접근이 λΆˆκ°€λŠ₯ ν•©λ‹ˆλ‹€.

μ‹€ λ§€κ°œλ³€μˆ˜μ™€ ν˜•μ‹ λ§€κ°œλ³€μˆ˜λŠ” μœ„ 그림에 "ex" 처럼 각 λ‹€λ₯Έ λ³€μˆ˜λ‘œ μ·¨κΈ‰λ˜λ―€λ‘œ μ„œλ‘œ λ‹€λ₯΄λ‹€κ³  ν•  수 있으며

ν˜•μ‹ λ§€κ°œλ³€μˆ˜μ˜ 값이 λ³€κ²½ λœλ‹€κ³  ν•΄μ„œ μ§μ ‘μ μœΌλ‘œ 값을 볡사해쀀 μ‹€ λ§€κ°œλ³€μˆ˜μ— 영ν–₯을 λ―ΈμΉ˜λŠ” 것이 μ•„λ‹ˆκΈ° λ•Œλ¬Έμ—

λŒ€ν‘œμ μΈ ν•¨μˆ˜ν˜ΈμΆœμ— μ˜ˆμ‹œμΈ swap() ν•¨μˆ˜μ—μ„œλ„ 값이 λ°”λ€Œμ§€ μ•Šκ³  swap ν•¨μˆ˜ λ‚΄μ—μ„œλ§Œ μž‘μš© ν•©λ‹ˆλ‹€.

즉 μœ„μ˜ κ·Έλ¦Ό "ex2" μ—μ„œ 처럼 a의 값을 20, b의 값을 30 으둜 μ£Όκ³  swap ν•¨μˆ˜λ‘œ λ„˜μ–΄κ°€

값을 바꿔도 swap ν•¨μˆ˜ λ‚΄μ—μ„œλ§Œ λ°”λ€” 뿐 

λ‹€μ‹œ main ν•¨μˆ˜λ‘œ λŒμ•„κ°€λ©΄, κ·Έ 값은 μ›λž˜ main ν•¨μˆ˜μ˜ κ°’ κ·ΈλŒ€λ‘œλ₯Ό 좜λ ₯ ν•  κ²ƒμž…λ‹ˆλ‹€.

 

Call by reference  [참쑰에 μ˜ν•œ 호좜 / μ£Όμ†Œ κ°’ 전달 방식] 

μ΄λ ‡κ²Œ μ£Όμ†Œλ₯Ό 전달 ν•˜λŠ” 방식을 call by reference 방식이라고 ν•©λ‹ˆλ‹€.

 

이 방식은 μ‹€λ§€κ°œ λ³€μˆ˜ 즉 ν˜ΈμΆœν•˜λŠ” μͺ½μ˜ μ£Όμ†Œκ°’μ„ ν˜ΈμΆœν•˜μ—¬ 

ν•¨μˆ˜μ˜ ν˜•μ‹ λ§€κ°œλ³€μˆ˜μ— μ „λ‹¬ν•˜λŠ” λ°©μ‹μœΌλ‘œ μ£Όμ†Œλ₯Ό μ•Œκ³  있고 μ ‘κ·Ό ν•˜κΈ° λ•Œλ¬Έμ—

μ‹€ 맀개 λ³€μˆ˜μ˜ 값을 λ³€κ²½ ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

λ˜ν•œ μœ„μ— κ·Έλ¦Ό "ex" 처럼 λ‘˜μ€ λ™μΌν•œ 기얡곡간을 μ‚¬μš©ν•˜λŠ” λ³€μˆ˜μ΄λ©°,

ν•¨μˆ˜ν˜ΈμΆœμ— μ˜ˆμ‹œμΈ swap() ν•¨μˆ˜ 즉 "ex2" 그림을 μ°Έκ³ ν•˜μ—¬ 보면

swap ν•¨μˆ˜ λ‚΄μ—μ„œ 뿐만 μ•„λ‹ˆλΌ main ν•¨μˆ˜μ—μ„œλ„ ꡐ체가 이루어 μ§€λŠ” 것을 확인 ν•˜μ‹€ 수 μžˆμŠ΅λ‹ˆλ‹€.

즉 call by reference 방식을 μ΄μš©ν•˜λ©΄ 값을 λ³€κ²½μ‹œ λ©”λͺ¨λ¦¬μƒμ˜ 값도 변경됨을 μ•Œ 수 μžˆμ§€μš”!

 

Cμ–Έμ–΄λŠ” μœ„μ™€ 같은 방식을 λ”°λ‘œ μ§€μ •ν•˜μ§€ μ•ŠλŠ”λ‹€κ³  ν•©λ‹ˆλ‹€.

μ—„λ°€νžˆ 따지면 μ£Όμ†Œκ°’ 자체λ₯Ό 볡사 ν•΄μ„œ λ„˜κ²¨μ£Όλ―€λ‘œ

call by valueμͺ½μ˜ 가깝닀고 ν•©λ‹ˆλ‹€ (= call by address)

κ·Έλ ‡κΈ° λ•Œλ¬Έμ— 결과적으둜 call by address λ₯Ό μ΄μš©ν•˜μ—¬ call by reference 와 같이, μ‚¬μš©μ΄ κ°€λŠ₯ν•˜μ—¬

같은 의미둜 κ·Έλƒ₯ μ‚¬μš©λ˜λŠ” 것이라고 ν•©λ‹ˆλ‹€.

β€» 포인터(*) λ₯Ό μ‚¬μš©ν•˜μ—¬ 참쑰에 μ˜ν•œ 호좜 방식 μ‚¬μš©

 

 


Call by value 

β–Ά μž₯점 : λ³΅μ‚¬ν•˜μ—¬ μ²˜λ¦¬ν•˜κΈ° λ•Œλ¬Έμ—, μ›λž˜μ˜ 값이 보쑴이 λ˜μ–΄ μ•ˆμ „ν•˜λ‹€.  (원본 데이터 λ³€κ²½ κ°€λŠ₯μ„± x) 

β–Ά 단점 : 인자λ₯Ό λ„˜κ²¨μ€„ λ•Œ λ§ˆλ‹€ λ©”λͺ¨λ¦¬ 곡간을 ν• λ‹Ή ν•˜λ―€λ‘œ κ³΅κ°„μ˜ μ†ŒλΉ„λŸ‰ (즉 λ©”λͺ¨λ¦¬ μ‚¬μš©λŸ‰) 이 λŠ˜μ–΄λ‚œλ‹€. 

 

Call by reference

β–Ά μž₯점 : λ©”λͺ¨λ¦¬ κ³΅κ°„μ˜ ν• λ‹Ή λ¬Έμ œκ°€ μ—†λ‹€. (λ©”λͺ¨λ¦¬ μ†ŒλΉ„ x)

β–Ά 단점 : μ›λ³Έμ˜ 데이터λ₯Ό 훼손 ν•  μˆ˜κ°€ μžˆλ‹€.

 

μ΄λ ‡κ²Œ !

Call by value 와 reference 에 λŒ€ν•΄ μ„€λͺ…을 λ“œλ ΈλŠ”λ°μš”!

μ΄λŸ°μ‹μœΌλ‘œ μ£Όμ†Œκ°’μ„ 전달 ν•˜μ—¬, 

addν•¨μˆ˜, sub ν•¨μˆ˜ λ“±λ“± ..::ν•¨μˆ˜λ“€μ„ ν˜ΈμΆœν•˜μ—¬ μ—°μ‚°ν•˜λŠ” ν”„λ‘œκ·Έλž¨μ„ 

μ‘°λ§Œκ°„ λ§Œλ“€μ–΄ κ°€μ Έμ˜€λ„λ‘ ν• κ²Œμš” γ…Žγ…Ž

μ„€λͺ…이 λ―Έν‘ν•˜μ§€λ§Œ λ‹€λ“€! μ—΄μ‹¬νžˆ κ³΅λΆ€ν•΄λ΄μš” ^_^:

 

λ°˜μ‘ν˜•
Contents

ν¬μŠ€νŒ… μ£Όμ†Œλ₯Ό λ³΅μ‚¬ν–ˆμŠ΅λ‹ˆλ‹€

이 글이 도움이 λ˜μ—ˆλ‹€λ©΄ 곡감 λΆ€νƒλ“œλ¦½λ‹ˆλ‹€.