728x90

함수 호출방식에는 call by value와 call by reference가 있다. 이 두 가지가 어떤 의미를 갖고 있는지 알아보자.


call by value(값에 의한 호출)

 - call by value는 우리가 메서드를 만들 때 보통 파라미터(parameter)를 지정하고 인자(argument)를 전달하는 코드를 작성한다. 이때 전달한 인자값이 메서드에서 파라미터를 통해 받으면서 값을 변경한 경우 메서드 내에서만 변경된 것은 call by value 방식으로 동작하고 있기 때문이다.

 

아래는 예시 코드이다.

#include <stdio.h>

void solution(int a, int b) {
    a = 10;
    b = 20;
}

int main() {
    int a = 0;
    int b = 0;
    
    solution(a, b);
    
    printf("a = %d, b= %d\n", a, b);
}

//result
//a = 0;
//b = 0;

 - solution 함수에서 변수 a와 b를 각각 10과 20으로 할당하였지만 main메서드에서 조회하면 값은 모두 초기값인 0으로 출력된다.

 

이것과 다른 방식인 call by reference에 대해 알아보자.

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

 - call by reference는 전달한 인자가 주소값이기 때문에 메서드에서 파라미터를 통해 받은 후 값을 변경한 경우 해당 변수값이 모두 변경된다.

 

이것도 코드로 이해해보자

#include <stdio.h>

void solution(int *a, int *b) {
    *a = 10;
    *b = 20;
}

int main() {
    int a = 0;
    int b = 0;
    
    solution(&a, &b);
    
    printf("a = %d, b= %d\n", a, b);
}

//result
//a = 10;
//b = 20;

 - solution 함수에서 변수 a와 b를 각각 10과 20으로 할당하였고 이는 주소값을 할당한 것이기 때문에 main 메서드에서도 a와 b는 가각 할당된 값인 10, 20으로 출력된다.

 

그렇다면 java에서 call by reference가 가능할까?

 

java에서는 객체를 넘기면 메서드에서도 값이 변경이 가능하지만 이것은 독자적으로 각각의 주소값을 지닌 것이기 때문에 call by value라고 한다. 

 

결론은 '불가능'이다. java version이 업데이트되고 있으니 언제가는 C언어에 존재는 포인터 개념의 기능이 추가되지 않을까? 

 

다음은 java call by reference에 대해 아주 잘 설명되어 있는 글을 발견하여 공유하고자 한다.

 

https://deveric.tistory.com/92

 

[Java] Java는 Call by reference가 없다

Call by Value와 Call By Reference가 뭘까? 프로그래밍을 하다 보면 꼭 알고 넘어가야 하는 개념이 있습니다. 바로 Call By Value, Reference입니다. 어떤 언어를 공부하든 나오는 개념이기도 합니다. Call by va..

deveric.tistory.com

 

728x90
TOP