[CS-JAVA]Call by Value & Call by Reference

지영·2023년 7월 21일
0

CS

목록 보기
47/77
post-thumbnail

Call by Value(값에 의한 호출)

  • 함수 호출 시, 메모리 공간 안에서는 함수를 위한 별도의 임시 공간이 생성되며 해당 공간은 함수 종료 시 사라짐.
  • 변수의 값을 복사하여 함수의 인자로 전달함. 즉 인자로 전달된 것은 지역적으로 사용되므로 local value속성을 가짐.

📢 Call by Value는 함수 안에서 인자의 값이 변경되어도 외부의 값은 변경되지 않는다.

JAVA의 경우

  1. Call by Value 동작방식 : 원시 자료형 (int, short, long, float, double, char, boolean)
  2. Call by Reference 동작방식 : 참조 자료형(Array, Class, Instance)
  • 예시
void func(int n) {
    n = 20;
}

void main() {
    int n = 10;
    func(n);
    printf("%d", n);
}

> 결과값 : 10

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

  • 함수 호출 시, 인자로 전달되는 변수의 레퍼런스를 전달 (즉, 해당 변수를 가리킴)
  • 함수 안에서 인자 값이 변경되면, 아규먼트로 전달된 객체의 값도 함께 변경됨

📢 Call by Reference는 함수 안에서 인자의 값이 변경되면 외부의 값도 변경된다.

  • 예시
void func(int *n) {
    *n = 20;
}

void main() {
    int n = 10;
    func(&n);
    printf("%d", n);
}

> 결과값 : 20

C/C++과 JAVA의 차이

  • C/C++ : 생성한 변수마다 새로운 메모리 공간을 할당하고 값을 덮어씌우는 형식으로 값을 할당. (*(변수) : 포인터를 사용한다면, 같은 주소값을 가리킬 수도 있다.)

  • JAVA : 생성한 변수마다 새로운 메모리 공간을 할당(여기까지는 C/C++과 공통점), 다만 그 메모리 공간에 을 저장하지 않고 '''주소값'''을 저장한다. (값은 다른 메모리 공간에 할당됨) -> 변수 값을 수정할 때도, 주소값이 덮여쓰이기 때문에 원본 값에는 전형 영향이 가지 않는 것이다.

🔎 총정리

Call by value의 경우, 데이터 값을 복사해서 함수로 전달하기 때문에 원본의 데이터가 변경될 가능성이 없다. 하지만 인자를 넘겨줄 때마다 메모리 공간을 할당해야해서 메모리 공간을 더 잡아먹는다.

Call by reference의 경우, 메모리 공간 할당 문제는 해결했지만, 원본 값이 변경될 수 있다는 위험이 존재한다.

profile
꾸준함의 힘을 아는 개발자가 목표입니다 📍

0개의 댓글