ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 자바 call by value, call by reference
    Java 2023. 4. 17. 21:34

    자바 개발을 하다보면 자료형과 참조형에 대한 변수를 접하게 된다.

    참조형과 자료형 변수를 정확하게 이해하지 않고 이용하게 된다면 call by value, call by reference가 뭔지 이해하기 어려울 것이라 생각한다.

     

    call by value

    - 변수 선언시 값을 복사하여 처리한다.

    - 값을 복사하여 처리하기 때문에 메모리 사용량을 고려해야한다.

    - 기본 자료형(int, boolean, char...)이 call by value로 동작한다.

     

    call by reference

    - 변수 선언 시, 주소를 참조하여 값을 출력

    - call by value처럼 값을 복사하지 않고 참조하기 때문에 빠른 처리 속도가 장점이다.

    - 참조형 변수(Array, List...)가 call by reference로 동작

     

    예시

     위의 예시와 같이 참조형 변수인 배열은 주소 값이 출력되고, 자료형 변수인 int는 값이 출력이 된다.

     

    * 참조형의 변수는 선언을 할 때, 새로운 주소값을 참조하게 된다.

       - 참조형의 값을 변경하려면 그 해당 주소값의 메모리 값을 바꾸어야 한다.

     

    tip)

    JVM의 stack 영역에 변수의 값이 쌓이고, heap 영역에 주소값이 쌓인다.

    그래서 heap영역의 주소값을 바라보고 있는 참조형 변수를 변경해야 call by reference의 값이 변경되는 것이다.

    call by value의 값은 stack영역에 쌓인다.

     

    call by value / call by reference 최종 정리

    package testProject;
    
    class A {
    	public int a;
    	
    	public A(int a) {
    		this.a = a;
    	}
    	
    	public int getData() {
    		return this.a; 
    	}
    }
    
    public class test {
    
    	private static void changeValue(int idx1, int idx2) {
    		idx1 = 0;
    		idx2 = 0;
    		System.out.println(idx1 + " / " + idx2);	// 0 / 0
    	}
    	
    	static void valueEx() {
    		int idx1 = 10;
    		int idx2 = 20;
    		System.out.println(idx1 + " / " + idx2);	// 10 / 20
    		changeValue(idx1, idx2);
    		System.out.println(idx1 + " / " + idx2);	// 10 / 20
    	}
    	
    	private static void changeReference(A a1, A a2) {
    		a1.a = 1;
    		a2 = new A(0);
    		
    		System.out.println(a1 + " / " + a2);		// a1의 주소값 / 새로운 a2의 주소값
    		System.out.println(a1.getData() + " / " + a2.getData());	// 1 / 0
    	}
    	
    	static void referenceEx() {
    		A a1 = new A(10);
    		A a2 = new A(20);
    		
    		System.out.println(a1 + " / " + a2);		// a1의 주소값 / a2의 주소값
    		System.out.println(a1.getData() + " / " + a2.getData());	// 10 / 20
    		
    		changeReference(a1, a2);
    		
    		System.out.println(a1 + " / " + a2);	// a1의 주소값 / a2의 주소값
    		System.out.println(a1.getData() + " / " + a2.getData());	// 1 / 20
    	}
    	
    	public static void main(String[] args) {
    		valueEx();
    		referenceEx();
    	}
    	
    }

    * a2의 새로운 주소 할당 및 값 변경과 기본 자료형의 값이 바뀌지 않는 이유를 call by value / call by reference를 통해 알 수 있다.

     

    출처

    https://bcp0109.tistory.com/360

    https://devlog-wjdrbs96.tistory.com/44

Designed by Tistory.