オブジェクト向けの4つのプロパティ(4):パッケージ(2)


3.参照変数のコピー


基本データ型変数をコピーすると、Call By Value(값에 의한 호출)によって値がコピーされ、2つの変数は互いに影響しません.
package reference;

public class CallByValue {
    public static void main(String[] args) {
        int a = 10;
        int b = a;
        
        b = 20;
        
        System.out.println(a);  // 10;
        System.out.println(b);  // 20;
    }
}

上記の例では、変数aに10を追加した後、変数aの値を変数bにコピーし、20を変数bに割り当てることができます.このとき,aが持つ値は単純にbにコピーされるだけで,aとb変数には何の関係もないことがわかる.
では、基本データ型を格納するオブジェクトではなく、객체 참조 변수をコピーする場合はどうなりますか?このことをCall By Reference(참조에 의한 호출)またはCall By Address(주소에 의한 호출)と呼ぶ.
次のサンプルコードです.
package reference;

public class CallByReference {
    public class void main(String[] args) {
        Animal ref_a = new Animal();
        Animal ref_b = a;
        
        ref_a.age = 10;
        ref_b.age = 20;
        
        System.out.println(ref_a.age) // 20
        System.out.println(ref_b.age) // 20       
    }
}

Class Animal{
    public int age;
}
大きな違いがあるかもしれませんが、実際にはCallByValueとCallByReferenceには本質的に違いはありません.ただし、差異がある場合、基本データ型変数は格納された値をそれ自体として解釈し、オブジェクト参照変数は格納された値を주소 또는 포인터と解釈します.

Animalオブジェクトのアドレスを100番とし、上図を下図に示す.

以下のコードを実行して参照オブジェクトの一意の値(アドレスは表示されないが)を表示すると、refaとref bは最終的に同じ値を有することを示す.
package reference;

public class CallByReference2 {
    public static void main(String[] args) {
        Animal ref_a = new Animal();
        Animal ref_b = a;
        
        System.out.println(ref_a); // reference.Aminal@15db9742 - 실행할 때마다 다르다.
        System.out.println(ref_b); // 바로 위와 같은 값이 출력된다.
    }
}
ref aとref bは全く異なる変数である.同じ値を持つだけで、コンピュータはアドレスとして使用します.結果は、同じオブジェクトを参照する変数が2つしかありません.参照されるオブジェクトは同じで、参照されるオブジェクトの変化の影響のみを受けます.
最終的には、「Call By Reference」と「Call By Value」を異なると理解するよりも、「基本データ」変数を格納中の値そのものと理解し、「参照」変数を格納中の値がアドレスであると理解する.
リファレンス
  • Javaオブジェクト向けSpringの入門原理と
  • を理解する