Java의 Call by value(pass by value)

C++μ—μ„œμ˜ swap() μœ ν‹Έλ¦¬ν‹° ν•¨μˆ˜λŠ” μ£Όμ†Œκ°’μ„ κ΅ν™˜ν•˜λŠ” call by reference λ°©μ‹μœΌλ‘œμ„œ λ™μž‘ν•œλ‹€. tmp λ³€μˆ˜λ₯Ό 쀑간 맀개둜 μ£Όμ†Œκ°’(κ°’μ˜ μœ„μΉ˜)을 μ„œλ‘œ κ΅ν™˜ν•œλ‹€.

void swap(int &a, int &b) {
    int temp = a;
    a = b;
    b = temp;
}

Javaμ—μ„œ primitive type, reference type에 ν•΄λ‹Ήν•˜λŠ” 값을 μ €μž₯ν•˜λŠ” 방식에 차이가 μžˆλ‹€.

  • JVM λ©”λͺ¨λ¦¬μ—μ„œ primitive type은 stack μ˜μ—­μ— μ €μž₯λœλ‹€

  • reference type은 κ·Έ 객체인 값이 heap μ˜μ—­μ— μ €μž₯되고, stack μ˜μ—­μ— μžˆλŠ” λ³€μˆ˜κ°€ 객체의 μ£Όμ†Œκ°’μ„ κ°€μ§€κ³  μžˆλ‹€.

Screen Shot 2022-10-09 at 7.13.01 PM.png

λ§Œμ•½ swap λ©”μ„œλ“œμ—μ„œ reference λ³€μˆ˜λ₯Ό νŒŒλΌλ―Έν„°λ‘œ λ„˜κΈ°κ²Œ 되면 ν•΄λ‹Ή 객체λ₯Ό κ°€λ¦¬ν‚€λŠ” μƒˆλ‘œμš΄ λ³€μˆ˜κ°€ stack μ˜μ—­μ— μ •μ˜κ°€ λœλ‹€. μƒˆλ‘­κ²Œ λ§Œλ“€μ–΄μ§„ λ³€μˆ˜μ˜ μ£Όμ†Œκ°’μ„ μ„œλ‘œ κ΅ν™˜ν•˜κ±°λ‚˜, 값을 λ³€κ²½ν•œλ‹€κ³  ν•΄μ„œ 기쑴의 λ³€μˆ˜κ°’μ΄ λ³€ν•˜μ§€ μ•ŠλŠ”λ‹€. κ·Έλ ‡κΈ° λ•Œλ¬Έμ— JavaλŠ” 항상 call by value(pass by value) λ°©μ‹μœΌλ‘œ λ™μž‘ν•œλ‹€κ³  ν•  수 μžˆλ‹€.

  • λ©”μ„œλ“œ 호좜 방식 κ°œλ…

    • Call by value λ°©μ‹μ˜ λ©”μ„œλ“œ 호좜 λ°©μ‹μ—μ„œ λ©”μ„œλ“œ 호좜자(caller)와 ν˜ΈμΆœλ‹Ήν•˜λŠ” μˆ˜μ‹ μž(callee)의 νŒŒλΌλ―Έν„°λŠ” λ³΅μ‚¬λ˜μ–΄μ„œ μ„œλ‘œ λ‹€λ₯Έ λ³€μˆ˜μ΄λ‹€. λ”°λΌμ„œ μˆ˜μ‹ μžμ˜ νŒŒλΌλ―Έν„°λ₯Ό μˆ˜μ •ν•΄λ„ 호좜자의 λ³€μˆ˜κ°€ λ°”λ€Œμ§€ μ•ŠλŠ”λ‹€.

    • call by reference 방식은 μ°Έμ‘°(μ£Όμ†Œ)λ₯Ό 직접 μ „λ‹¬ν•˜κΈ° λ•Œλ¬Έμ— caller의 λ³€μˆ˜μ™€ callee의 νŒŒλΌλ―Έν„°κ°€ μ™„μ „νžˆ λ™μΌν•œ λ³€μˆ˜μ΄λ‹€. μˆ˜μ‹ μžμ˜ νŒŒλΌλ―Έν„°λ₯Ό μˆ˜μ •ν•˜λ©΄ 호좜자의 λ³€μˆ˜λ„ 바뀐닀.

  • μžλ°”μ—μ„œλŠ” κΈ°λ³Έμ μœΌλ‘œλŠ” Reference type을 μ΄μš©ν•΄μ„œ swap을 κ΅¬ν˜„ν•΄μ•Όν•˜μ§€λ§Œ, primitive λ³€μˆ˜ 값을 κ΅ν™˜ν•˜λŠ” νŠΈλ¦­λ„ μžˆλ‹€. Collections νŒ¨ν‚€μ§€μ—μ„œ list λ‚΄μ˜ μ›μ†Œκ°’ κ°„μ˜ swap λ©”μ„œλ“œλ₯Ό μ§€μ›ν•œλ‹€.

Last updated