📚요약
지난 시간부터 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
'개발 > 프로그래머스 데브코스' 카테고리의 다른 글
| 프로그래머스 데브코스 50일차 with. TS 웹 풀스택 (3) | 2024.06.14 |
|---|---|
| 데브코스 스터디(알고리즘, 코테) 14회차 (0) | 2024.06.13 |
| 프로그래머스 데브코스 48일차 with. TS 웹 풀스택 (0) | 2024.06.12 |
| 프로그래머스 데브코스 47일차 with. TS 웹 풀스택 (0) | 2024.06.11 |
| 프로그래머스 데브코스 10주차 회고 with. TS 웹 풀스택 (0) | 2024.06.10 |