Back-End/백엔드 관련 정리

[백엔드 과정][자바 기초] - call - by - value

얄루몬 2022. 8. 31. 19:57


https://kizoo.gitlab.io/docs/archive/java/001/

 

1

Java에서는 call-by-value로 인자 값을 주고 받습니다. class 물체 { private int n = 0; public 물체( int m ) { n = m; } public void modify( int m ) { n = m; } public String toString() { return "" + n; } } class ParameterPassing { public stati

kizoo.gitlab.io


 

1. 자바의 경우

함수에 전달되는(매개변수로) 인자의 데이터 타입에 따라서 함수 호출 방식이 달라진다.

  • 기본 자료형의 경우
    • call - by - value로 int, short, long, float, double, char, boolean 등 원시타입이 이에 해당한다.
  • 참조 자료형의 경우
    • call - by - reference로 Array와 Class Instance가 이에 해당한다. 

2. call by value (값에 의한 호출)

  • 함수 호출 시 메모리 공간에 임시 공간이 생성된다. 이 임시 공간은 함수가 종료되면 사라진다.
  • 함수 호출 시 전달되는 변수의 값은 복사되어 함수의 인자로 전달한다.(원본 자체가 넘어가는 것이 아닌 복사된 값이 넘어가는 개념 즉, 결과적으로 어떤 짓을 해도 원본 값은 변화하지 않는다.)  
  • 이때 복사된 인자의 경우 매개변수로 넘어가면 함수 안에서 지역변수로 사용된다.

3. call by reference (참조에 의한 호출)

  • 함수 호출 시 메모리 공간에 함수를 위한 별도 임시 공간이 생성되고 이 공간 역시 함수 종료시에 사라진다.
  • call by reference는 참조에 의한 호출 방식으로 함수 호출 시 변수의 주소값(레퍼런스)를 매개변수로 넘겨준다. (원본 자체가 넘어가는 것은 아니지만 주소값이 넘어가기 때문에 해당 값을 변경하려면 변경할 수 있게 된다.)
  • 이때 함수의 매개변수로 넘겨준 인자는 주소값을 주며 그 객체를 변경할 수 있게 된다.(변수들의 값이 변경)

4. Wrapper Class (래퍼 클래스)

  • 래퍼 클래스 자체는 call by reference 이지만 이는 매개변수로 넘길 때는 새로운 레퍼런스를 만들어 호출하게 만든다.
  • 이는 래퍼 클래스 자체의 값 변경이 불가하게 하는 방식 때문인데 이런 이유로 래퍼 클래스 자체는 참조형이지만 함수의 매개변수로 넘길 땐 call by value와 비슷한 방식으로 데이터가 넘어가게 된다.

5. 간단한 예시

public class Swap {

    int value;

    public Swap(int value) {
        this.value = value;
    }
    private static void swap(Swap a, Swap b) {
        int temp = a.value;
        a.value = b.value;
        b.value = temp;
    }
    public static void main(String[] args) {
        Swap a = new Swap(1);
        Swap b = new Swap(2);
        System.out.println(a.value + " " +b.value);

        swap(a,b);
        System.out.println(a.value + " " +b.value);
    }


}
출력
1 2
2 1
  • 해당 swap 함수에 매개변수로 넘겨줄 때 기본 자료형이 아닌 참조형으로 넘겨주어야 제대로 값이 변하는 것을 알 수 있다.