본문 바로가기

카테고리 없음

Call of Value && Call of reference

call by value

C언어에서 지원하는 방식,

함수에서 값을 복사해서 전달하는 방식, 인자로 전달되는 변수를 함수의 매개변수에 복사 원본 값을 바꿀 필요가 없는 경우 사용

call by reference

C언어에서의 방식은 주소값 자체를 복사해서 넘겨주는 것이므로 call by value

주소값을 복사해서 넘겨주는걸 call by address 방식이라고 함

C언어에선 call by reference를 지원하진 않는데

call by address를 통해서 call by reference와 같이 사용가능 그래서 그냥 일반적으로 call by reference이렇게 부름

#include <stdio.h>

//call by value
void swap1(int a, int b) {
    int temp;
    temp = a;
    a = b;
    b = temp;
}

//call by reference
void swap2(int* a, int* b) {
    int temp;
    temp = *a;
    *a = *b;
    *b = temp;
}

int main() {
    int a = 10, b = 50;

    printf("call by value\\n");
    swap1(a, b);
    printf("결과 a : %d, b : %d\\n\\n", a, b);

    printf("call by refernce\\n");
    swap2(&a, &b);
    printf("결과 a : %d, b : %d\\n\\n", a, b);

    return 0;
}

이거걍 swap1 은 인자를 값으로 받아서 호출되는 a,b가 함수 내부의 a,b로 복사되어서 함수내부에서 a,b의 값이 변해도 호출된 곳의 a,b는 변하지 않는다

swap2 인자를 포인터로 받아서 주소자체를 받는거라 함수내부에서 a,b가 가르키는 값을 변경하면 호출된곳에서 또한 바뀜 심볼릭 링크같은 느낌

결론

  • swap1에서는 값이 복사되어서 함수 내부에서 변해도 호출된 곳에서는 변하지 않고
  • swap2는 변수의 주소를 전달하여 직접 값이 변경되기 떄문에 호출된 곳에도 변경이 반영된다

왜 reference 쓰냐

지역변수 전역변수

  • 변수는 선언하는순간부터 생존시간을 갖는다
  • 변수의 선언 위치
    • 우리가 변수로 선언할 수 있는 공간들이 어디어디인지 살펴보면
    A블록의 외부공간 : 소스코드는 메인함수와 여러함수들로 구성되는데 이러한 함수블록들의 외부공간에 변수를 선언할 수 잇다.

    scope

    스코프란 스코프는 변수가 영향을 미치는 범위,혹은 변수의 유효 범위라고 할 수 있습니다.전역스코프**(Global Scope)**전역 스코프에 변수를 선언하면 어떤위치의 코드에서든 사용할 수 있는 변수가 됩니다.
  • <script> var globalScope = "global"; // 전역스코프 (전역변수) function isGlobal() { return `${globalScope} 입니다.`; } console.log(isGlobal()); // global 입니다. </script>
  • 전역스코프는 블록{} 바깥이나 함수 바깥에 선언된 변수
  • 스코프는 전역스코프,지역스코프가 있다
  • B: 블록의 내부공간 : 어떤 범위이든 블록이 구성된곳에는 변수를 선언할 수 있다 하지만 한가지 조심해야할 점은 변수는 항상 블록의 가장 위에

지역스코프(local scope)

지역 스코프는 코드의 특정 부분에서만 사용할 수 있는 변수입니다.

이것을 지역변수라고 하는데

지역 스코프는 함수스코프블록 스코프 두가지로 나뉜다

  • 함수 스코프

함수 스코프는 말 그대로 함수 내부에서 선언 된 변수

함수내부에서만 접근할 수 있다 (var,let,const 동일)

<script>
      function isLocal() {
         var localScope = "local" //함수스코프 (지역변수)
         return `${localScope} 입니다.`
      }
      console.log(isLocal());   //local 입니다.
      console.log(localScope);  //Uncaught ReferenceError: local is not defined
</script>
  • 블록 스코프

블록 스코프 또한 말 그대로 블록{} ,if문,for문 블록 내부에서 선언된 변수다

블록 내부에서만 접근 가능하다

(단, 블록 내부에서 선언 한 변수는 블록 내부에서만 사용 가능 한게 정상이지만,var은 내부에서도 선언 해도 바깥에서 접근 사용이 가능하다)

<script>
      if(true) {
         let blockScope = "블록 스코프 입니다.";
      }
      console.log(blockScope);	//  Uncaught ReferenceError: blockScope is not define
</script>