Call by Value와 Call by Reference

song yuheon·2023년 10월 10일
0

CS Study

목록 보기
4/50
post-thumbnail

1. Call by Value (값에 의한 호출)


1.1. 기본 개념

  • 함수나 메서드를 호출할 때 변수의 실제 값을 복사하여 전달하는 방식이다.
  • 복사된 값은 함수 내의 지역 변수로서 동작하므로 원본 변수와는 독립적이다.

1.2. Java에서의 Call by Value

  • Java는 항상 call by value 방식으로 동작한다.
  • 원시 타입 (int, double)은 실제 값이 복사되어 전달된다.
  • 객체를 전달할 때는 해당 객체의 참조값이 복사되어 전달된다.
    그러나 이는 참조값의 복사이므로 함수 내에서 참조값 자체를 변경하더라도 원본 참조에 영향을 주지 않는다.

2. Call by Reference ( 참조에 의한 호출)


2.1. 기본 개념

  • 함수나 메서드를 호출할 때 변수의 참조(주소)를 전달하는 방식이다.
  • 함수 내에서 참조를 통해 원본 변수의 값을 직접 변경할 수 있다.

2.2. C에서의 Call by Reference

  • C 자체는 기본적으로 call by value 방식을 사용한다.
  • 그러나 포인터를 사용하여 변수의 주소를 직접 전달하면 call by reference와 같은 효과를 얻을 수 있다.
  • 함수 내에서 포인터를 통해 원본 변수의 값을 변경하거나 포인터 자체를 다른 주소로 재할당하는 것이 가능하다.

3. 주요 차이점


  • Java
    참조값(주소와 유사한 개념)의 복사를 통해 객체를 전달하므로 함수 내에서 참조값 자체를 다른 객체의 참조값으로 변경해도 원본 참조에는 영향을 주지 않는다.
    단 복사된 참조값을 통해 객체의 내용을 변경하면 원본 객체에도 영향을 미친다.
class SampleClass {
    int value;
    public SampleClass(int value) {
        this.value = value;
    }
}

public static void modifyReference(MyClass obj) {
    obj = new MyClass(30);  // 참조 자체를 변경
}

public static void modifyObjectData(MyClass obj) {
    obj.value = 20;  // 객체의 내용을 변경
}

public static void main(String[] args) {
    SampleClass obj = new SampleClass(10);

    modifyReference(obj);
    System.out.println(obj.value);  // 출력: 10, 원본 참조는 변경되지 않는당!!

    modifyObjectData(obj);
    System.out.println(obj.value);  // 출력: 20, 원본 객체의 내용은 변경되었다.
}
  • C
    포인터를 통해 변수의 주소를 전달하면 함수 내에서 포인터 변수 자체의 값을 변경할 수 있다.
    이는 포인터를 다른 변수의 주소로 재할당하는 것을 의미한다.
void abc(int * p, int * b){
	p = b;
}

#include <stdio.h>

void main() {
    int a = 10;
    int b = 20;
    int *p; 

    p = &a;  // p가 a의 주소를 가리킴
    printf("p points to value: %d\n", *p);  // 출력 = 10
    
	abc(p,&b);
    
    printf("p points to value: %d\n", *p);  // 출력 = 20
    
}

profile
backend_Devloper

0개의 댓글