β μ΄λ€ λ©΄μμ νλ‘κ·Έλλ°μ 그림그리λ κ²κ³Ό κ°λ€. λΉμ μ νΉμ ν κΈ°λ³Έ μ¬λ£λ€κ³Ό νμ μΊλ²μ€μμ μμνλ€.
κ·Έκ²λ€μ κ°μ§κ³ 무μμ ν μ§ κ²°μ νκΈ° μν΄μ λΉμ μ κ³Όν, κΈ°μ , κΈ°μμ μ‘°ν©μ μ¬μ©νλ€ β- Andrew Hunt
The Pragmatic Programmer μ μ μ

μλ°μ Call by Value / Call by Reference
νλ‘κ·Έλλ°μ νλ€λ³΄λ©΄ λ°λμ λ§μ£ΌμΉλ κ²μ΄ λ°λ‘ call by value / call by reference κ°λ μ΄λ€.
ν¨μμ 맀κ°λ³μμμ κ°μ 볡μ¬νλλ μ£Όμκ°μ μ°Έμ‘°νλλμ λ°λΌ λ°ν κ²°κ³Όκ° λ¬λΌμ§κΈ° λλ¬Έμ λλΆλΆμ νλ‘κ·Έλλ° κ΅μ‘κ³Όμ μμ μ€μμ νκ² μ¬κΈ΄λ€.
μλ°μμλ μμ call by value μ call by reference λμ μ°¨μ΄κ° μ‘΄μ¬νλ€.
μλ°μ λ°μ΄ν°νμ μμ보면 ν¬κ² λκ°μ§λ‘ λλκ² λλ€.
- κΈ°λ³Έν(primitive type) - Boolean Type(boolean), Numeric Type(short, int, long, float, double, char)
- μ°Έμ‘°ν(reference type) - Class Type, Interface Type, Array Type, Enum Type, κΈ°λ³Ένμ μ μΈν λͺ¨λ κ²λ€
κ·Έλ°λ° λ©μλμ μ λ ₯κ°(νλΌλ―Έν°)μ μμκ°(primitive type)μ μ λ¬νλ κ²κ³Ό κ°μ²΄(reference type)λ₯Ό μ λ¬νλ κ²μλ ν° λμ μ°¨μ΄κ° μλ€.
μλ μμ μ½λμμλ int νμ
μ λ³μμ int[] λ°°μ΄ νμ
μ λ³μλ₯Ό κ°κ° main λ©μλμμ μ μΈ νλ€.
κ°μ μ μν λ°μ΄ν° μ΄κ² μ§λ§ μλ°μμλ μ΄λ€μ κ°κ° primitive νμ κ³Ό reference νμ μΌλ‘ ꡬλΆνμ¬ μΈμνλ€.
κ·ΈλΌ μ΄ λ κ°μ§ μ’ λ₯μ νμ μ λ©μλμ μ λ ₯κ°μΌλ‘ μ λ¬ν΄μ λνκΈ° μ°μ°μ νλ©΄ μ΄λ»κ² λλμ§ μ΄ν΄ 보μ.
public class main
{
public static void main(String[] args)
{
Sample sample = new Sample();
int var = 1; // primitive νμ
λ³μ int
int[] arr = { 1 }; // reference νμ
λ³μ int[] λ°°μ΄
// λ³μ μ체λ₯Ό 보λ (call by value)
add_value(var);
System.out.println(var); // 1 : κ° λ³νκ° μμ
// λ°°μ΄ μ체λ₯Ό 보λ (call by reference)
add_reference(arr);
System.out.println(arr[0]); // 101 : κ°μ΄ λ³νν¨
}
static void add_value(int var_arg) {
var_arg += 100;
}
static void add_reference(int[] arr_arg) {
arr_arg[0] += 100;
}
}
int λ³μ varμ add_value λ©μλμ μ
λ ₯κ°μΌλ‘ λ³΄λ΄ 100μ λνμ§λ§, μΆλ ₯ν΄λ³΄λ λ³μμ κ°μ λ³νκ° μλ€.
νμ§λ§ int[] λ°°μ΄ λ³μ arrμ add_reference λ©μλμ μ
λ ₯κ°μΌλ‘ λ³΄λ΄ μ²«λ²μ§Έ μΈλ±μ€μ 100μ λνλλ 101μ΄ μΆλ ₯ λ¨μ λ³Όμκ° μλ€.
λκ°μ΄ λ λ³μλ₯Ό λ©μλμ μ λ ₯κ°μΌλ‘ 보λμ§λ§, μ΄λ κ² κ²°κ³Όμ μ°¨μ΄κ° μΌμ΄λλ μ΄κ° λ°λ‘ μ체 κ°μ 볡μ¬(call by value)μ κ°μ μ£Όμ μ°Έμ‘°(call by reference)κ° μΌμ΄λ¬κΈ° λλ¬Έμ΄λ€.
κ·Έλ¦ΌμΌλ‘ 보λ Call by Value / Reference κ³Όμ
1. main μ€ν νλ μμ λ λ³μκ° λ΄κΈ°κ² λλ€.
primitive νμ
μΈ λ³μ varμ κ·Έλλ‘ μμκ° 1μ μ§λκ²λλ©°, reference νμ
μΈ λ°°μ΄ λ³μ arrμ μ€μ λ°μ΄ν°λ heap μμμ μ μ₯λκ² λκ³ μ΄λ₯Ό μ°Έμ‘°ν μ£Όμκ°μ μ μ₯νκ² λλ€.

[ μ€ν νλ μ(stack frame) ]
νλμ λ©μλμ νμν λ©λͺ¨λ¦¬ λ©μ΄λ¦¬λ₯Ό λ¬Άμ΄μ μ€ν νλ μ(Stack Frame)μ΄λΌκ³ νλ€.
νλμ λ©μλλΉ νλμ μ€ν νλ μμ΄ νμνλ©°, λ©μλλ₯Ό νΈμΆνκΈ° μ§μ μ€ννλ μμ μλ° Stackμ μμ±ν ν λ©μλλ₯Ό νΈμΆνκ² λλ€.
μ€ν νλ μμ μμ΄λ λ°μ΄ν°λ λ©μλμ 맀κ°λ³μ, μ§μλ³μ, 리ν΄κ° λ±μ΄ μλ€.
λ§μΌ λ©μλ νΈμΆ λ²μκ° μ’ λ£λλ©΄ μ€νμμ μ κ±°λλ€.
2. add_value() λ©μλμ μ λ ₯κ°μΌλ‘ λ³μ varμ λ£μ΄ νΈμΆνλ€.
add_value() λ©μλκ° νΈμΆλλ©΄μ, add_value μ€ν νλ μμ΄ μμ±λκ³ κ·Έ μμ μ§μλ³μ(맀κ°λ³μ) var_argκ° κ°μ 1μ λ°μ μ± μμ±λκ² λλ€.
κ·Έλ¦¬κ³ μ체 λ©μλ λ‘μ§μΌλ‘ 100μ λν΄ κ°μ 101μ΄ λλ€.

3. var λ³μκ°μ λ³νμ§ μλλ€.
add_value μ€ν νλ μ μμ μλ λ³μ var_argκ° λ°λ κ²μ΄μ§, main μ€ν νλ μ μμ μλ λ³μ var κ° λ°λ κ²μ΄ μλλ€.
맀κ°λ³μ var_argsλ κ·Έμ λ³μ varλ‘λΆν° μμκ°μ 볡μ¬νμ¬ λ°μ κ² λΏμ΄κΈ° λλ¬Έμ΄λ€. (call by value)
μ¦, λ©μΈμ μ μλμ΄ μλ var λ³μμ add_value λ©μλμ μ μλμ΄ μλ var_arg λ³μλ μλ‘ μμ ν λ¨λ¨μ΄λ€.

4. add_reference() λ©μλμ μ λ ₯κ°μΌλ‘ λ³μ arrλ₯Ό λ£μ΄ νΈμΆνλ€.
add_reference() λ©μλκ° νΈμΆλλ©΄μ, add_reference μ€ν νλ μμ΄ μμ±λκ³ κ·Έ μμ μ§μλ³μ(맀κ°λ³μ) arr_argκ° μμ±λλ€.
μ΄λλ μ μ add_value() λ©μλ νΈμΆ λ μ²λΌ λ³μμ κ°μ΄ 볡μ¬λμ΄ νλΌλ―Έν°μ λ겨μ§λλ°, μμΈν μ΄ν΄λ³΄λ μ€ν νλ μμ μλ arr λ³μκ° λ€κ³ μλ κ°μ μ£Όμκ° μ΄λ€.
κ·Έλμ λ©μλμ μ λ ₯κ°μΌλ‘ μ£Όμκ°μ΄ 볡μ¬λμ΄ λ겨μ§κ² λλ€.
λ°λΌμ κ²°κ³Όμ μΌλ‘ λ λ³μ arr μ arr_argλ κ°μ μ£Όμκ°μ λ€κ³ μκ² λλ κ²μ΄κ³ , μ΄ μ£Όμκ° κ°λ¦¬ν€λ λ©λͺ¨λ¦¬λ κ°κΈ° λλ¬Έμ λ λ³μλ νλμ λ°μ΄ν°λ₯Ό λμμ μ°Έμ‘°νκ³ μλ€κ³ λ§ ν μ μλ€.
λ§μ§λ§μΌλ‘ arr_arg λ³μκ° κ°λ¦¬ν€λ κ° 1μ λΆλ¬μ 100μ λνλ heap μμμ μλ λ°μ΄ν°λ 101λ‘ λ³κ²½λκ² λλ€.
μ°Έμ‘°κ°(μ£Όμκ°) 볡μ¬λ λ°°μ΄ λΏλ§ μλλΌ ν΄λμ€, 리μ€νΈ, 맡 λ± primitive νμ μ΄ μλ λͺ¨λ νμ μ λν΄μ μ μ©λλ€.

5. λ§μ§λ§μΌλ‘ λ³μ arrμ μΆλ ₯ν΄λ³΄λ©΄ κ°μ΄ λ³κ²½λ¨μ μ μ μλ€.

μλ°μλ Call by Reference κ°λ μ΄ μλ€
μ¬κΈ° κΉμ§ 보면 call by value / call by reference λ΅κ² κ° λ³΅μ¬λ μ£Όμ μ°Έμ‘°λ λμ μ°¨μ΄κ° μμ£Ό μ λνλ, μ΄ ν¬μ€ν μ μ λͺ©μ λν΄ μꡬμ¬μ νν μ§λ λͺ¨λ₯Έλ€.
μ¬μ€ μλ°(Java) νλ‘κ·Έλλ° μΈμ΄μμλ call by reference λΌλ κ²μ μ‘΄μ¬νμ§ μλλ€.
μλνλ©΄ C μ λ¬λ¦¬ μλ°μμλ ν¬μΈν°λ₯Ό μ² μ νκ² μ¨κ²¨ κ°λ°μκ° μ§μ λ©λͺ¨λ¦¬ μ£Όμμ μ κ·Ό νμ§ λͺ»νκ² μ‘°μΉνκΈ° λλ¬Έμ΄λ€.
CμΈμ΄λ ν¬μΈν°λ₯Ό ν΅ν΄ κ·Έλλ‘ μ£Όμλ₯Ό ν΅ν΄ λ©λͺ¨λ¦¬λ₯Ό μ°Έμ‘°ν μ μλ€
κ²°λ‘ μ μΌλ‘ λ§νλ©΄, μλ°μμμ νλΌλ―Έν°λ call by valueλ‘μλ§ λμλλ©°, μμκ°μ΄ λ³΅μ¬ λλλ μ£Όμκ°μ΄ 볡μ¬λλλ μ°¨μ΄κ° μμλΏμ΄λ€.
κ·Έλ¦¬κ³ λ§€κ°λ³μμ 볡μ¬λ κ°μ λ°λΌ, μμκ°μ΄λ©΄ λ°λ‘ μ°μ°μνκ³ μ£Όμκ°μ΄λ©΄ ν΄λΉ λ©λͺ¨λ¦¬ μ£Όμλ₯Ό μ°Έμ‘°ν΄ κ°μ κ°μ Έμ μ°μ°ν λΏμ΄λ€.
CμΈμ΄μ Call by Reference
μλ°μ call by reference κ° μλ€λ©΄ λ체 call by referenceκ° λ¬΄μΌ λ»νλ κ²μΌκΉ?
CμΈμ΄μμλ ν¬μΈν°(*) λ³μλ₯Ό νλΌλ―Έν° λ°κ² νκ³ ν¨μλ₯Ό νΈμΆν λ μ£Όμμ°μ°μ(&) λ₯Ό μ΄μ©ν΄ μ£Όμκ°μ μ§μ λ겨 μ§μ μ μΈ λ©λͺ¨λ¦¬ μ°Έμ‘°κ° κ°λ₯νλ€.
#include <stido.h>
void swap(int *, int *);
int main() {
int a = 10;
int b = 20;
swap(&a, &b);
}
void swap(int *a, int *b) {
int temp;
temp = *a;
*a = *b;
*b = temp;
}
1. μ΅μ΄ μ€ν μ λ€μκ³Ό κ°μ΄ λ©λͺ¨λ¦¬κ° ν λΉλλ€.

2. swap() ν¨μλ₯Ό νΈμΆνλ€.
μ΄λ μ
λ ₯κ°μΌλ‘ λ³μ a, bλ₯Ό μ£Όμμ°μ°μλ₯Ό μ΄μ©ν΄ &a, &bλ‘ μ£Όμλ₯Ό μΈμκ°μΌλ‘ λκΈ°κΈ° λλ¬Έμ swap() ν¨μκ° νΈμΆλλ©΄, λ€μκ³Ό κ°μ΄ swap() ν¨μμ ν¬μΈν° 맀κ°λ³μ *a, *bμ μ£Όμκ°λ€μ΄ λμ
λλ€.

3. swap ν¨μ λ‘μ§μ μ€ννλ€
λ³μ a μ λ³μ bμ κ°μ μλ‘ μΉννλ λ‘μ§μΈλ°, μ΄λ swap() ν¨μ λ΄μ λ³μλ€μ ν¬μΈν° λ³μμ΄κΈ° λλ¬Έμ μ§μ λ©λͺ¨λ¦¬ μ£Όμλ₯Ό μ°Έμ‘°ν΄ μ ν λ€λ₯Έ κ³³μ μλ main() ν¨μμμ μλ λ³μ a, b κ°μ λ³κ²½νκ² λλ€.
call by reference λ‘ λ³μμ κ°μ λ€λ£¨κ² λλ©΄, λ©λͺ¨λ¦¬λ₯Ό μ μ½ν μ μμΌλ©° μλλ λΉ¨λΌμ§λ€λ μ₯μ μ΄ μκΈ° λλ¬Έμ λλΆλΆμ μλ² λλ νκ²½μμλ C ν¬μΈν°λ₯Ό μ΄μ©ν΄ μ½λ©νλ€.

μμ§λ CμΈμ΄μ ν¬μΈν° λ³μμ μλ°μ μ°Έμ‘° λ³μμ μ°¨μ΄κ° μ 맀νλ©΄ μ΄λ κ² μ΄ν΄νλ©΄ λλ€.
CμΈμ΄λ ν¬μΈν°λ₯Ό μ΄μ©ν΄ μ£Όμκ°μ μ§μ κ°μ Έμ μ λ¬ν μ μλ€.
μ΄ λ§μ μ£Όμκ°μ λͺ°λ λ³μ‘°νμ¬ λ€λ₯Έ μμ€ νμΌμμ μ΄μ©λλ μ£Όμκ°μ κ°μ Έμ¬ μ μλ€λ λ§μ΄λ©°, μ΄λ₯Ό μ μ©νλ©΄ ν΅(hack)κ³Ό κ°μ λΆλ² λ³μ§ νλ‘κ·Έλ¨μ΄ λ μ μλ€.
λ°λ©΄ Javaμμλ μ΄λ¬ν λΆλΆμ μ² μ νκ² λ΄μνμλ€.
μ¬μ€ μλ°λ ν¬μΈν°λ‘ λ©λͺ¨λ¦¬κ° μ°Έμ‘°λμ§λ§ μλ°λ ν¬μΈν°λ₯Ό μ² μ νκ² μ¨κ²¨ κ°λ°μκ° ν¬μΈν°λ₯Ό μ΄μ©νμ§ λͺ»νλλ‘ λ§μ λ²λ¦° κ²μ΄λ€.
κ·Έλμ μ£Όμκ°μ 볡μ¬λ₯Ό ν΅ν΄ μ΄μ©μ΄ κ°λ₯ν λΏ μ§μ μμΈμ€ν΄μ λ§μ§μ 거릴μλ μλ κ²μ΄λ€.
μλ°λ Call by Value / Call by Address
μ΄μ²λΌ μλ°λ μ€λ‘μ§ call by value λ‘μ λμνλ€.
κ·Έλλ μμκ°μ 볡μ¬νλλ, μ£Όμκ°μ 볡μ¬νλλμ λ°λΌ λ°ν κ²°κ³Όκ° λ¬λΌμ§κΈ° λλ¬Έμ μΈκ°μμλ μ΄ λμ ꡬλΆνκΈ° μν΄ call by value / call by address λ‘ λͺ λͺ μ§μ΄ ꡬλΆνκΈ°λ νλ€. (μ΄μ°¨νΌ λκ°μ value 볡μ¬μ§λ§ κ΅³μ΄ κ΅¬λΆνμλ©΄ π€)
μλ°μ€ν¬λ¦½νΈ(JavaScript) μ§μμμλ λκ°μ΄ call by value / call by address λ‘ κ΅¬λΆνλ€.
λ€λ§ μΈλΆμ μΈ κ΄μ μμ 보면 μ£Όμκ°μ΄ 볡μ¬λλ , ν¬μΈν°λ₯Ό μ΄μ©ν΄ μ°Έμ‘°νλ , λ©λͺ¨λ¦¬ μμ μλ λ°μ΄ν°λ₯Ό μ°Έμ‘°ν΄ μ°μ°νλ λμ μ체λ κ°κΈ° λλ¬Έμ,
μμ§νκ² λ§νλ©΄ μλ°κ° call by referenceκ° μλκ³ call by address λΌ κ·Έλ¬μ§λ§ μ¬μ©νλ μ μ₯μμλ λμ μ°¨μ΄κ° μλ€κ³ 보면 λλ€.
# μ°Έκ³ μλ£
https://stackoverflow.com/questions/40480/is-java-pass-by-reference-or-pass-by-value
https://programist.tistory.com/35
μ΄ κΈμ΄ μ’μΌμ ¨λ€λ©΄ ꡬλ & μ’μμ
μ¬λ¬λΆμ ꡬλ
κ³Ό μ’μμλ
μ μμκ² ν° νμ΄ λ©λλ€.