관리 메뉴

Tech Log πŸ› οΈ

Call By Value VS Call By Reference λ³Έλ¬Έ

μΉ΄ν…Œκ³ λ¦¬ μ—†μŒ

Call By Value VS Call By Reference

sehaan 2023. 9. 28. 14:11

μžλ°”λŠ” 기본적으둜 Call By Value λ°©μ‹μœΌλ‘œ λ™μž‘ν•œλ‹€.

본문에 μ•žμ„œ λ‹€μŒ μ½”λ“œλ₯Ό 보자

 

μžλ°”μ—μ„œ 전달 받은 값을 μˆ˜μ •ν•  경우 원본 값이 λ³€ν•˜λŠ” 지 μ•Œμ•„λ³΄κΈ° μœ„ν•œ μ½”λ“œμ΄λ‹€.

 

public static void mian() {
        
        int x = 1;
        int y = 2;
       
        assertEquals(x, 1); // true
        assertEquals(y, 2); // true
        
        modify(x, y);
        
        assertEquals(x, 1); // true
        assertEquals(y, 2); // true
    }
    
    public static void modify(int x1, int y1) {
        x1 = 5;
        y1 = 10;
    }

 

λ„˜κ²¨λ°›μ€ 값을 μˆ˜μ •ν–ˆλŠ”λ° 원본 값은 λ³€ν™”ν•˜μ§€ μ•Šμ•˜μŒμ„ μ•Œ 수 μžˆλ‹€.

이 μ΄μœ λŠ” 였늘 μ•Œμ•„λ³Ό Call By Value λΌλŠ” 방식 λ•Œλ¬Έμ΄λ‹€.

 

Call By Value 와 Call By Reference 의 μ°¨μ΄λŠ” ?

- Call By Value 방식은 κ°’λ§Œ λ„˜κ²¨μ€€λ‹€. λ”°λΌμ„œ 전달 받은 값을 μˆ˜μ •ν•˜λ”λΌλ„ 원본값에 영ν–₯이 μ—†λ‹€. (참쑰값을 μˆ˜μ •ν•˜λŠ” 경우 μ œμ™Έ)

- Call By Reference λŠ” 방식은 μ£Όμ†Œκ°’ 자체λ₯Ό λ„˜κ²¨μ€€λ‹€. λ„˜κ²¨μ€€ κ°’ , 전달 받은 κ°’ λͺ¨λ‘ λ™μΌν•œ λ³€μˆ˜μ΄λ‹€.

   λ”°λΌμ„œ 전달 받은 값을 μˆ˜μ •ν•  경우 원본 값도 λ³€κ²½λœλ‹€.

 

Call By ValueλŠ” μ–΄λ–»κ²Œ λ™μž‘ν• κΉŒ ?

- λ¨Όμ € JVMμ—μ„œ μ–΄λ–»κ²Œ λ³€μˆ˜λ₯Ό μ €μž₯ν•˜λŠ” 지 μ•Œμ•„λ³΄μž

 

μ›μ‹œ νƒ€μž…

 

μŠ€νƒ μ˜μ—­μ— λ³€μˆ˜μ™€ ν•¨κ»˜ 값이 μ €μž₯λœλ‹€.

 

μ°Έμ‘° νƒ€μž…

μ°Έμ‘° νƒ€μž…μ˜ 경우, λ³€μˆ˜λ₯Ό λ³΅μ‚¬ν•˜μ—¬ μ£Όμ†Œκ°’μ„ μ €μž₯ν•œλ‹€.

μ—¬κΈ°μ„œ μ˜€ν•΄ν•˜μ§€ 말아야 ν•˜λŠ”κ²ƒμ€ μ£Όμ†Œκ°’ 자체λ₯Ό λ°›λŠ” 것이 μ•„λ‹Œ λ³΅μ‚¬ν•˜μ—¬ λ°›λŠ” λ‹€λŠ” 것이닀.

λ”°λΌμ„œ μ°Έμ‘°ν•˜λŠ” 값을 λ³€κ²½ν•  경우 원본 값에도 영ν–₯을 λ―ΈμΉœλ‹€.

 

이제 λ³€μˆ˜λ₯Ό λ³€κ²½ν•  경우 각각 μ–΄λ–»κ²Œ λ™μž‘ν•˜λŠ” 지 μ•Œμ•„λ³΄μž

 

μ›μ‹œ νƒ€μž…

μ›μ‹œ νƒ€μž…μ˜ 경우 λ„˜κ²¨ 받은 값은 μ•„μ˜ˆ λ‹€λ₯Έ λ³€μˆ˜μ΄κΈ° λ•Œλ¬Έμ— μˆ˜μ •ν•˜λ”λΌλ„ 원본 값에 μ•„λ¬΄λŸ° 영ν–₯이 μ—†λ‹€.

 

μ°Έμ‘° νƒ€μž…

μ°Έμ‘° νƒ€μž… λ˜ν•œ λ‹¨μˆœνžˆ λ³΅μ‚¬λœ λ³€μˆ˜μ΄κΈ° λ•Œλ¬Έμ— λ„˜κ²¨ 받은 값에 μƒˆλ‘œμš΄ 값을 ν• λ‹Ήν•˜λ”λΌλ„ 원본 κ°’μ—λŠ” 영ν–₯이 μ—†λ‹€.

ν•˜μ§€λ§Œ μ°Έμ‘°ν•˜λŠ” 값을 μ§μ ‘μ μœΌλ‘œ μˆ˜μ •ν•  κ²½μš°λŠ” 논외이닀. (ex. λ°°μ—΄)

 

 

Call By Reference μ™€μ˜ μ°¨μ΄λŠ”?

근데 μ£Όμ†Œκ°’μ„ λ°›κΈ° λ•Œλ¬Έμ— Call By Reference 방식과 ν—·κ°ˆλ¦΄ 수 μžˆλ‹€.

λͺ…ν™•νžˆ ν•΄μ•Όν•  것은 Call By Reference 방식은 λ³€μˆ˜ 자체λ₯Ό λ„˜κ²¨μ£Όκ³  μžλ°”λŠ” λ³€μˆ˜λ₯Ό λ³΅μ‚¬ν•΄μ„œ λ°›κΈ° λ•Œλ¬Έμ—

μ—„μ—°νžˆ 차이가 μžˆλ‹€.

 

참고자료

https://www.baeldung.com/java-pass-by-value-or-pass-by-reference