πŸ’» Computer Science

Call By Value & Call By Reference

jobey 2024. 4. 5. 15:27
λ°˜μ‘ν˜•
ν•¨μˆ˜κ°€ 인자둜 받은 값을 μ²˜λ¦¬ν•˜λŠ” λ§€μ»€λ‹ˆμ¦˜μ— κ΄€ν•œ κ°œλ… μž…λ‹ˆλ‹€.

 

 

Call By Value

ν•¨μˆ˜κ°€ νŠΉμ • μžλ£Œν˜•μ˜ 인자둜 받은 값을 볡사 ν•΄μ„œ μ²˜λ¦¬ν•˜λŠ” λ°©μ‹μž…λ‹ˆλ‹€. 

 

κΈ°λ³Έ μžλ£Œν˜•: Boolean Type, Numberic Type

μ°Έμ‘° μžλ£Œν˜•: Class Type, Array Type λ“± κΈ°λ³Έ μžλ£Œν˜• μ΄μ™Έμ˜ μžλ£Œν˜•

 

κΈ°λ³Έ μžλ£Œν˜•μ€ λŒ€λΆ€λΆ„μ˜ ν”„λ‘œκ·Έλž˜λ° μ–Έμ–΄μ—μ„œ μ•„λž˜μ™€ 같이 Call By Value둜 μ²˜λ¦¬λ©λ‹ˆλ‹€.

plusλΌλŠ” λ©”μ„œλ“œ ( ν•¨μˆ˜ ) μ—μ„œ num μ΄λΌλŠ” μΈμžμ— 9λ₯Ό 더해도 원본 값은 1둜 변함이 μ—†λŠ” λͺ¨μŠ΅μ„ λ³΄μž…λ‹ˆλ‹€.

public class main
{
    public static void main(String[] args)
    {
        int num = 1;
        System.out.prinfln(plus(num)); // 10
        System.out.prinfln(num); // 1
    }

    static void plus(int num) {
        num += 9
        return num;
    }
}

 

일뢀 μ–Έμ–΄μ—μ„œλŠ” λ©”λͺ¨λ¦¬ μ°Έμ‘° 값을 νž™ ( Heap )에 μ €μž₯ν•˜κ³  κ°œλ°œμžκ°€ νž™μ— μ €μž₯된 데이터λ₯Ό μ‚¬μš©ν•˜λŠ” ν˜•νƒœλ₯Ό μ·¨ν•˜κ³  μžˆμŠ΅λ‹ˆλ‹€.

특히 μžλ°”(Java)와 같은 객체 μ§€ν–₯ μ–Έμ–΄μ—μ„œλŠ” νž™(heap)μ΄λΌλŠ” λ©”λͺ¨λ¦¬ μ˜μ—­μ„ μ‚¬μš©ν•΄ 객체 데이터λ₯Ό κ΄€λ¦¬ν•©λ‹ˆλ‹€.

νž™μ€ 동적 λ©”λͺ¨λ¦¬ 할당을 μœ„ν•œ κ³΅κ°„μœΌλ‘œ, ν”„λ‘œκ·Έλž¨ μ‹€ν–‰ 쀑에 객체의 크기와 μˆ˜μ— 따라 λ©”λͺ¨λ¦¬λ₯Ό ν• λ‹Ήν•˜κ³  ν•΄μ œν•˜λŠ” 관리가 κ°€λŠ₯ν•©λ‹ˆλ‹€.

 

νž™μ— μ €μž₯된 λ°μ΄ν„°λŠ” 객체의 μ‹€μ œ λ©”λͺ¨λ¦¬ μ£Όμ†Œλ₯Ό κ°€λ¦¬ν‚€λŠ” 'μ°Έμ‘° κ°’'μž…λ‹ˆλ‹€. 예λ₯Ό λ“€μ–΄, μžλ°”μ—μ„œ κ°œλ°œμžκ°€ 객체λ₯Ό μƒμ„±ν•˜λ©΄

이 κ°μ²΄λŠ” νž™ λ©”λͺ¨λ¦¬μ— μ €μž₯되고, 객체λ₯Ό κ°€λ¦¬ν‚€λŠ” μ°Έμ‘° 값이 μƒμ„±λ©λ‹ˆλ‹€.

 

이 μ°Έμ‘° 값을 톡해 κ°œλ°œμžλŠ” ν•΄λ‹Ή 객체에 μ ‘κ·Όν•  수 μžˆμŠ΅λ‹ˆλ‹€.

μ€‘μš”ν•œ 점은, μžλ°”μ™€ 같은 μ–Έμ–΄μ—μ„œ κ°œλ°œμžκ°€ μ§μ ‘μ μœΌλ‘œ λ©”λͺ¨λ¦¬ μ£Όμ†Œλ₯Ό λ‹€λ£¨λŠ” 것은 ν—ˆμš©λ˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.

 

λŒ€μ‹ , μ•ˆμ „ν•˜κ²Œ λ©”λͺ¨λ¦¬λ₯Ό 닀루기 μœ„ν•΄ μ°Έμ‘°λ₯Ό μ‚¬μš©ν•©λ‹ˆλ‹€. 이 μ°Έμ‘°λŠ” 객체가 μ €μž₯된 μ‹€μ œ λ©”λͺ¨λ¦¬ μ£Όμ†Œλ₯Ό 직접 λ‚˜νƒ€λ‚΄μ§€ μ•Šκ³ , 객체에 μ ‘κ·Όν•˜κΈ° μœ„ν•œ 좔상적인 μˆ˜λ‹¨μ„ μ œκ³΅ν•©λ‹ˆλ‹€.

μ΄λŸ¬ν•œ 방식 λ•Œλ¬Έμ— μžλ°”μ—μ„œλŠ” call by value /  call by address λ‘κ°€μ§€λ‘œ λ‹€μ‹œ λ‚˜λˆ„κΈ°λ„ ν•©λ‹ˆλ‹€.

객체에 λŒ€ν•œ μ°Έμ‘°λ₯Ό λ³΅μ‚¬ν•œ 것 이기 λ•Œλ¬Έμ— call by reference와 call by value의 쀑간 지점 κ·Έ μ–΄λ”˜κ°€ 라고 생각 ν•  수 도 있기 λ•Œλ¬Έμž…λ‹ˆλ‹€.

 

 

Call By Reference

μœ„μ—μ„œ λ§ν•œ call by valueμ™€λŠ” λ‹€λ₯΄κ²Œ μ‹€μ œ λ©”λͺ¨λ¦¬λ₯Ό κ°€λ₯΄ν‚€λŠ” μ£Όμ†Œκ°’μ„ λ³΅μ‚¬ν•΄μ„œ ν•¨μˆ˜μ— μ „λ‹¬ν•˜λŠ” λ°©μ‹μž…λ‹ˆλ‹€.

public class Main {
    public static void main(String[] args) {
        int[] num = {1};
        plus(num);
        System.out.println(num[0]); // 10
    }

    static void plus(int[] num) {
        num[0] += 9;
    }
}

λŒ€ν‘œμ μΈ μ°Έμ‘° νƒ€μž… ArrayλŠ” ν•¨μˆ˜μ—μ„œ 값을 λ³€κ²½ν•˜λ©΄ μ‹€μ œ 값도 λ³€κ²½ λ©λ‹ˆλ‹€.

   int[] num = {1};

 

λ°°μ—΄ int[] num은 νž™ λ©”λͺ¨λ¦¬μ— μƒμ„±λ©λ‹ˆλ‹€. 이 λ•Œ, num λ³€μˆ˜λŠ” νž™μ— μ €μž₯된 λ°°μ—΄μ˜ μ°Έμ‘°λ₯Ό κ°€μ§‘λ‹ˆλ‹€.

νž™μ— μ €μž₯된 배열은 μ‹€μ œ λ©”λͺ¨λ¦¬μ˜ μ°Έμ‘°κ°’μž…λ‹ˆλ‹€.

 

즉 μ‹€μ œ λ©”λͺ¨λ¦¬ μ–΄λ”˜κ°€μ— num에 λŒ€ν•œ 값이 μ €μž₯은 λ˜μ–΄μžˆκ³  νž™ λ©”λͺ¨λ¦¬μ—μ„œλŠ” 이 μœ„μΉ˜μ— λŒ€ν•œ μ°Έμ‘°λ₯Ό κ°€μ§€κ³  있고, JAVA μ—μ„œλŠ” 이 μ°Έμ‘°λ₯Ό λ³΅μ‚¬ν•˜μ—¬ μ‚¬μš©ν•˜λŠ” ν˜•νƒœμΈ κ²ƒμž…λ‹ˆλ‹€.

 

νž™ λ©”λͺ¨λ¦¬ λΌλŠ” κ³΅κ°„μ—μ„œ 이 λ³€μˆ˜λ“€μ„ κ΄€λ¦¬ν•˜κ³  κ°œλ°œμžλŠ” num을 λ³€κ²½ν•˜λ©΄ νž™ λ©”λͺ¨λ¦¬μ— 참쑰값을 따라 μ‹€μ œ λ©”λͺ¨λ¦¬μ˜ 데이터λ₯Ό κ°„μ ‘μ μœΌλ‘œ λ‚˜λ§ˆ λ³€κ²½ν•  수 μžˆμŠ΅λ‹ˆλ‹€. 

 

κ²°κ΅­ νž™ λ©”λͺ¨λ¦¬μ™€ μ‹€μ œ λ©”λͺ¨λ¦¬μ˜ λ°μ΄ν„°λŠ” call by reference κ΄€κ³„λΌλŠ” 것을 μ•Œ 수 μžˆμŠ΅λ‹ˆλ‹€.

λ”°λΌμ„œ JAVAλŠ” call by valueλ₯Ό 기반으둜 μž‘λ™ν•˜λ©°, call by reference λ°©μ‹μœΌλ‘œ μ‹€μ œ λ©”λͺ¨λ¦¬ 값을 μ°Έμ‘° ν•˜μ—¬ νž™ λ©”λͺ¨λ¦¬μ— μ €μž₯ν•˜κ³  이 값을 λ³΅μ‚¬ν•˜μ—¬ μ‚¬μš©ν•œλ‹€κ³  κ²°λ‘  λ‚Ό 수 μžˆμŠ΅λ‹ˆλ‹€.

 

 

 

 

 

 

 

 

λ°˜μ‘ν˜•
λŒ“κΈ€μˆ˜0