[cs] call-by-value, call-by-reference

do_large·2020년 10월 23일
0

cs

목록 보기
5/9
post-thumbnail

함수에 인자를 전달하는 방식에는 크게 두가지가 있다.

call-by-value (값에 의한 호출)

  • Call by value의 가장 큰 특징은 원본에 영향을 미치지 않는다는 것
  • call-by-value 값에 의한 호출방식은 함수 호출시 전달되는 변수의 값을 복사하여 함수의 인자로 전달한다.
  • 복사된 인자는 함수 안에서 지역적으로 사용되는 local value의 특성을 가진다.
  • 함수 안에서 인자의 값이 변경되어도, 원래의 변수 값은 변경되지 않는다.
  • 원본 값을 바꿀 필요가 없는 경우에는 call by value 방식을 사용하면 된다.
#include <stdio.h>

void swap(int a, int b){
	// 매개변수는 전달받은 값을 바탕으로 원본과는 전혀 다른 메모리 공간에 새로운 지역변수를 만듭니다.
        // 따라서 매개변수가 원본의 value를 가진다면 원본과는 전혀 다른 변수라고 볼 수 있습니다.
	int temp;
	
	temp = a;
	a = b;
	b = temp;
}

int main(){
	int a, b;
	
	a = 10;
	b = 20;
	
	printf("swap 전 : %d %d\n", a, b);
	
	swap(a, b);
	
	printf("swap 후 : %d %d\n", a, b);
	
	return 0;
}

하지만 원본의 주소값(reference)을 가진다면 원본에 접근이 가능하게 됩니다.
이는 call by reference라고 합니다.

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

  • 원본의 값을 전달하는 대신 주소값을 복사하여 전달하며, 원본에 영향을 미칠 수 있습니다.
  • call-by-reference 참조에 의한 호출방식은 함수 호출시 인자로 전달되는 변수의 주소를 전달한다. (주소는 해당 변수를 가르킨다.)
  • 주소값을 저장할 수 있는 자료형을 제공해야 call by reference를 사용할 수 있습니다.
#include <stdio.h>

void swap(int *a, int *b){ //포인터 변수를 선언할 때
    int temp;
	
    temp = *a; // 포인터 변수가 가리키는 값을 추출할 때
    *a = *b;
    *b = temp;
}

int main(){
    int a, b;
    
    a = 10;
    b = 20;
    
    printf("swap 전 : %d %d\n", a, b);
    
    swap(&a, &b);
    
    printf("swap 후 : %d %d\n", a, b);
    
    return 0;
}

Java의 경우 함수에 전달되는 인자의 데이터 타입에 따라서 (원시자료형 / 참조자료형) 함수 호출 방식이 달라진다.

  • 원시 자료형 (primitive type) : call-by-value 로 동작 (int, short, long, float, double, char, boolean )
  • 참조 자료형 (reference type): call-by-reference 로 동작 (Array, Class Instance)

정리

  • Call By Value - 원본 값을 그대로 복사하여 전달하며, 원본에 영향을 미칠 수 없습니다.
  • Call By Reference - 원본의 주소값을 복사하여 전달하며, 원본에 영향을 미칠 수 있습니다.
    변수의 주소값을 추출 및 저장하는 기능을 언어 차원에서 제공해주어야 call by reference가 가능합니다.
  • 참고사이트

https://edu.goorm.io/learn/lecture/201/바로-실행해보면서-배우는-c언어/lesson/412515/call-by-value-and-call-by-reference

https://velog.io/@codemcd/Call-By-Value-VS-Call-By-Reference

https://wayhome25.github.io/cs/2017/04/11/cs-13/

0개의 댓글