본문 바로가기

🌈 Java/Back to Basic 101

자바 기초 정리: Call by value & Call by reference

✔️ Call by value : 기본 자료형 전달 

  • 메모리에 저장되어 있는 값 (value) 을 복사하여 보냄 
  •  method 안에 값을 조작해도 원래 값에 영향이 가지 않음. 

    👉🏻 객체를 메소드로 넘길때 참조하는 지역변수의 실제 주소를 넘기는 것이 아닌 가리키고있는 힙 메모리 영역의 객체를 가르켜서 새로운 지역변수를 생성하는 방식. 그러므로 조작해도 값이 변하지 않는다. 

 

public class CallByValue {
	private static int a;
	private static int b;
    
    public static void swap(int x, int y) {
        int temp = x;
        x = y;
        y = temp;
    }


    public static void main(String[] args) {
        a = 10;
        b = 20;

        System.out.println("swap() 호출 전 : a = " + a + ", b = " + b);
        swap(a, b);
        System.out.println("swap() 호출 후 : a = " + a + ", b = " + b);
    }
}

swap() 호출 전 : a = 10, b = 20

swap() 호출 후 : a = 10, b = 20

 

🌟 자바는 기본형 참조형 타입 변수 상관없이 call by value 방식으로 인자값을 받는다.

      - 대신 기본형 타입은 값을 복사해주고 참조형 값은 주소(래퍼런스)가 복사된다.

 

 

✔️ Call by reference : 참조형 데이터 값이 아닌 참조가 전달 

  • 사용하는 인자 값의 메모리에 저장되어있는 주소(address) 를 복사하여 보냄
  • 호출한 메소드의 데이터에 영향 
  • 매개 변수로 참조 자료형을 넘길 경우, 메소드 안에서 객체의 상태를 변경한 결과에 영향 받음. 
public class CallByReference {

    int value;
    
    CallByReference(int value) {
        this.value = value;
    }


    public static void swap(CallByReference x, CallByReference y) {
        int temp = x.value;
        x.value = y.value;
        y.value = temp;
    }


    public static void main(String[] args) {
        CallByReference a = new CallByReference(10);
        CallByReference b = new CallByReference(20);

        System.out.println("swap() 호출 전 : a = " + a.value + ", b = " + b.value);
        swap(a, b);
        System.out.println("swap() 호출 전 : a = " + a.value + ", b = " + b.value);

    }

}

swap() 호출 전 : a = 10, b = 20

swap() 호출 후 : a = 20, b = 10

  ** CallByReference 는 객체의 주소값을 저장하기 때문에 swap() 메서드 호출시 a 와 b 는 메모리가 저장된 주소값을 저장한다. swap() 메서드에서 주소값이 변경되으로 메인메소드로 돌아왔을때 변경된 값을 볼수 있다.