본문 바로가기

개발/프로그래머스 데브코스

프로그래머스 데브코스 49일차 with. TS 웹 풀스택

📚요약

지난 시간부터 C언어를 통해 프로그래밍의 기본 원리를 배우고 있습니다. 이어서 계속 배워보도록 하겠습니다. 이번 시간에는 46,47일 차에 배웠던 내용과 겹치는 부분은 따로 정리하지 않겠습니다.

 

📖프로그래밍 기본 원리

📄포인터

C언어에는 포인터라는 개념이 있습니다. 포인터 변수라는 이름을 줄여 부르는 말이기도 한 이 변수는 주소를 가리키는 변수입니다. *과 함께 사용되는데 선언될 때와 호출할 때의 의미가 달라집니다. 선언할 때 사용되는 *은 해당 변수가 포인터 변수라는 것을 의미하고, 호출될 때 *은 해당 포인터 변수의 값을 의미합니다. 또한 주소를 가리키는 변수이므로 주소를 나타내는 &와 함께 사용됩니다.

int a = 10;
int* pA = &a;

printf("%d", a); // 10
printf("%d", *pA); // 10

int arr[] = {1,2,3}
int * p = &arr;

printf("%d", &arr); // arr[0]의 주소
printf("%d", p); // arr[0]의 주소
printf("%d", *(p+1)); // 2

 

📄Call by Value, Reference

Call by Reference는 값이 아닌 주소값이 복사가 된다는 것을 의미합니다. JS에서는 원시 타입은 Call by Value로 그 이외의 객체 타입은 Call by Reference를 사용합니다.

🍯tip! 함수에서 사용되는 인수에는 실제로 값을 가지는 실인수와 실인수를 받아 값을 복사하는 형식인수가 있습니다.

 

함수를 사용하면 인수로 값을 넘기게 되는 경우가 있습니다. 이때 넘겨진 인수가 함수 내부에서 처리된다고 생각될 수 있지만 그렇지 않습니다. 넘겨진 인수를 값이나 주소를 복사해 사용하게 됩니다. 이로 인해 생기는 변화를 보겠습니다.

function test(b) { // b는 형식인수
  b += 3;
  console.log(b); // 13
}

let a = 10;
test(a); // a는 실인수
console.log(a); // 10

위와 같은 경우는 내부에서 복사된 값에는 변경이 일어났지만 실제 넘겨줬던 인수의 값에는 변화가 없는 것을 확인할 수 있습니다. 그렇기에 변화된 값을 사용하기 위해서는 return을 통해 반환해주어야 합니다.

function test2(array) {
  array = 10;
  console.log(array); // 10
}

let arr = [1,2,3];
test2(arr);
console.log(arr); // [ 1, 2, 3 ]

위 코드의 경우도 마찬가지입니다. array가 arr의 주소를 복사해 갔습니다. 내부에서는 값이 변경되었지만 마찬가지로 외부의 arr의 실제 값은 그대로 유지되고 있습니다.

function test3(array) {
  array[0] += 2;
}

let arr = [1, 3];
test3(arr);
console.log(arr); // [ 3, 3 ]

마지막 코드는 위 예시들과 좀 다르게 받아온 array의 요소를 변경했는데 실제 외부 arr의 요소에도 적용된 것을 볼 수 있습니다. 바로 arr와 array가 같은 주소 값을 참조하고 있기 때문입니다.

  스택
arr 0x01 0x001 0x001 [1,3]
array 0x10 0x001 0x010  

위 표를 참고하면 arr와 array가 같은 주소를 가리키고 있기 때문에 array로 요소의 값을 변경하면 arr의 값도 같이 변경이 됩니다. 하지만 두 번째 예시의 경우 array의 값만 변경된 것을 아래 표에서 확인할 수 있습니다.

  스택
arr 0x01 0x001 0x001 [1,3]
array 0x10 10 0x010  

 

다음 시간에 계속...

 

출처 & 참고

이창현 강사님의 강의

'call by value'와 'call by reference' feat.js, younoah, 2024.06.13