본문 바로가기

JAVA

Call By Value와 Call By Reference

Call By Value와 Call By Reference 의 차이

 

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

- 함수가 호출될 때 메모리 공간 안에서 임시의 공간이 생성된다. (함수 종료시 사라짐)
- 함수 호출시 전달되는 변수의 값을 복사하여 함수의 인자로 전달한다.
- 복사된 인자는 함수 내부의 지역함수에 복사된다.
- 기본 자료형을 인자로 전달할 때 적용된다. (int, short, long, float, double, char, boolean)
- 참조 자료형인 String은 객체 불변성과 문자열 풀로 인해 동일하게 Call by Value로 작동하게 된다.

changeValue로 전달된 num의 값은 changeValue 내부의 지역변수로 사용되기 때문에 main 메소드에 선언된 num의 값은 변하지 않는다.

 

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

- 함수가 호출될 때 메모리 공간 안에서 임시의 공간이 생성된다. (함수 종료시 사라짐)
- Call By Reference 참조에 의한 호출방식은 인자로 전달되는 변수의 레퍼런스를 전달한다.
- Java에서는 직접적으로 Call By Reference를 지원하지 않으며 객체 참조를 통해 유사한 동작을 구현한다.
   ↳ 변수 저장구조가 기본 타입은 stack,  참조 타입은 heap에 저장되기 때문이다.
- C 언어에서는 포인트를 사용하여 구현할 수 있다.

2 - 1 : Java의 경우

MyObject의 객체 참조를 changeValue 메소드에게 인자로 전달하고 MyObject 내부에 setNum 메서드를 호출하여 num의 값을 변경한다. 후에 변경된 값을 getNum 메소드를 통해 변경된 값을 출력한다.

2 - 2 : C언어의 경우

#include <stdio.h>

void changeValue(int* ptr) {
    *ptr = 10;
}

int main() {
    int num = 5;
    changeValue(&num);
    printf("%d\n", num);  // 출력 결과: 10

    return 0;
}

C언어의 경우 '&' 메모리 포인터 연산자를 사용해 변수의 메모리 주소값을 참조할 수 있고, 메모리에 직접 접근하여 값을 변경할 수 있다.

changeValue로 변수 num의 메모리값을 직접 전달하여 값을 변경하여 main 메서드에 선언된 num의 값을 변경할 수 있다.


Call By Value와 Call By Reference의 장단점

1. Call By Value

- 장점 :

1. 함수 호출시 값이 복사 되고, 원본에 영향을 주지 않기 때문에 코드의 예측과 안정성을 높여준다.

2. 원본의 값이 보존되므로 데이터의 불변성을 유지하는데 도움을 준다.

 

- 단점 :

1. 값이 복사되므로 크기가 큰 객체나 배열의 경우 복사 비용이 발생하여 성능 저하를 가져올 수 있다.

2. 원본의 값을 변경해야 할 경우 추가적인 방법이 필요하다.

 

2. Call By Reference

- 장점 : 

1. 원본의 객체나 배열을 직접 수정할 수 있기 때문에 효율적인 데이터 수정을 가능하게 한다.

2. 값의 복사가 발생하지 않으므로 메모리 절약에 도움이 된다.

- 단점 : 

1. 여러곳에서 사용중인 참조 변수가 예기치 못하게 변경될 경우 코드의 복잡성이 증가할 수 있다.

'JAVA' 카테고리의 다른 글

예외 처리(Exception Handling)에 대해 알아보자  (0) 2023.06.14