CallByValue & CallByReference의 차이

조영민·2023년 7월 5일

CS

목록 보기
6/14

Call by value(값에 의한 호출)는 인자로 받은 값을 복사하여 처리를 한다. Call by reference(참조에 의한 호출)는 인자로 받은 값의 주소를 참조하여 직접 값에 영향을 준다. 간단히 말해 값을 복사를 하여 처리를 하느냐, 아니면 직접 참조를 하느냐 차이인 것이다.

프로그래밍 구조상 Call by value(값에 의한 호출)를 하면 복사가 되기 때문에 메모리량이 늘어난다. 요즘에는 기기의 성능이 좋아져서 상관이 없다지만 많은 계산이 들어간다면 과부하의 원인이 된다. 하지만 복사처리가 되기 때문에 원래의 값은 영향을 받지 않아서 안전하다.

CallByValue

-함수가 호출될 때 메모리 공간 안에서는 임시의 공간이 생성된다. 그리고 함수가 종료되면 해당공간은 사라진다.
-함수 호출시 전달되는 변수의 값을 복사하여 함수의 인자로 전달한다.
-복사된 인자는 함수 안에서 지역적으로 사용하는 변수이다.
-JAVA의 경우 함수에 전달되는 인자의 데이터 타입에 따라서 (기본자료형 / 참조자료형 ) 함수 호출 방식이 달라짐

  • 장점 : 복사하여 처리하기 때문에 안전하다. 원래의 값이 보존된다.
  • 단점 : 복사를 하기 때문에 메모리 사용량이 늘어난다.

CallByReference

-함수가 호출될 때, 메모리 공간 안에서는 함수를 위한 별도의 임시 공간이 생성된다. (함수 종료시 사라짐)
-call by reference 참조에 의한 호출방식은 함수 호출시 인자로 전달되는 변수의 레퍼런스를 전달한다. (해당 변수를 가르킨다.)
-함수 안에서 인자의 값이 변경되면, 함수 호출시에 있던 변수들도 값이 바뀐다.

  • 장점 : 복사하지 않고 직접 참조를 하기에 빠르다.
  • 단점 : 직접 참조를 하기에 원래 값이 영향을 받는다.

예제

CallByValue

public class CallByValueTest {
	
	static void increase(int n) {
		n = n + 1;
		System.out.println(n);
	}

	public static void main(String[] args) {
		int a = 5;
		increase(a);
		System.out.println(a);
	}
}

출려값 : 6 5

increase 메소드 실행시 6이 출력되고 메소드 실행 후 변수 a를 출력하면 5가 나온다.

CallByReference

public class CallByReferenceTest {
	
	static void increase(int arr[]) {
		for (int i = 0; i < arr.length; i++)
			arr[i]++;
	}

	public static void main(String[] args) {
		int arr[] = {1,2,3,4,5};
		increase(arr);
		for (int i = 0; i <arr.length; i++)
			System.out.print(arr[i] + " ");
	}
}

출려값: 2,3,4,5,6

배열의 값이 메소드 호출시 메소드에서 수행한 명령되로 변경되게 된다.

profile
노젓는 개발자

0개의 댓글