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


関数にパラメータを渡す方法は大きく2つあります.

call-by-value(値呼び出し)

  • Call by Valueの最大の特徴は、元の値
  • に影響しないことです.
  • call-by-value値の呼び出し方式に従って、関数呼び出し時に渡される変数の値を関数のパラメータにコピーします.
  • コピーされたファクタは、関数内の領域で使用されるローカル値の特性を有する.
  • 関数では、パラメータの値が変更されても元の変数の値は変更されません.
  • の元の値を変更する必要がない場合は、callby 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)があれば、ソースにアクセスできます.
    これをcallbyreferenceと呼びます.

    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の場合、関数の呼び出し方法は、関数に渡されるパラメータのデータ型(元のデータ型/参照データ型)に依存します.
  • 元データ型(元のタイプ):値別呼び出し(int、short、long、float、double、char、boolean)
  • 参考資料(参考タイプ):オンデマンド操作(Array,Class Instance)
  • 整理する
  • Call By Value-元の値をコピーして渡しますが、元の値には影響しません.
  • Call By Reference-ソースアドレス値をコピーして転送し、ソースアドレス値に影響を与える可能性があります.
    by referenceを呼び出すには、言語レベルで変数アドレス値を抽出および格納する機能を提供する必要があります.
  • リファレンスサイト
  • https://edu.goorm.io/learn/lecture/201/今すぐ-実行-学習-c言語/コース/41525/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/