프로그래머스 데브코스TIL
[week9] 프론트엔드 기초 : React + TypeScript (4)
이규현2026-03-12
![[week9] 프론트엔드 기초 : React + TypeScript (4)](/images/useBlog/TIL.png)
포인터
포인터란?
포인터는 메모리의 주소값을 저장하는 특별한 변수입니다. 일반 변수가 '데이터'를 담는다면, 포인터는 그 데이터가 '어디에 있는지'를 가리킵니다.
기호의 중의적 의미
-
선언 시
*: "이 변수는 주소를 담는 바구니(포인터)다." -
사용 시
*(역참조): "이 주소에 저장된 실제 값으로 이동하라." -
주소 연산자
&: 변수의 실제 메모리 주소를 찾아내어 포인터에 넘겨줄 때 사용합니다.
int a = 10;
int *pA = &a; // a의 주소를 pA에 대입
printf("%d\n", a); // 10
printf("%d\n", *pA); // pA가 가리키는 주소의 값 -> 10
포인터와 배열의 관계
C언어에서 배열의 이름은 **배열의 시작 주소(첫 번째 요소의 주소)**와 동일하게 취급됩니다.
int arr[] = {1, 2, 3};
int *p = arr; // &arr[0]과 동일하므로 & 생략 가능
printf("%p\n", arr); // 첫 번째 요소의 주소
printf("%d\n", *(p + 1)); // 주소에서 한 칸(int 크기만큼) 이동한 곳의 값 -> 2
Call by Value (값에 의한 호출)
함수를 호출할 때 전달되는 변수의 값을 복사하여 함수의 매개변수에 전달하는 방식입니다.
-
특징: 함수 내부에서 매개변수의 값을 변경해도 호출한 곳의 원본 변수에는 영향을 주지 않습니다.
-
장점: 원본 데이터를 안전하게 보호할 수 있습니다.
#include <stdio.h>
void swap(int x, int y) {
int temp = x;
x = y;
y = temp;
// 함수 내부에서는 x, y가 바뀌지만 함수가 끝나면 사라집니다.
}
int main() {
int a = 10, b = 20;
swap(a, b);
printf("a: %d, b: %d\n", a, b); // 출력: a: 10, b: 20 (원본 유지)
return 0;
}
Call by Reference (참조에 의한 호출)
함수를 호출할 때 변수의 메모리 주소값을 복사해서 전달하는 방식입니다. C언어에서는 포인터를 사용하여 구현합니다.
-
특징: 함수 내부에서 포인터를 통해 해당 주소로 직접 접근하므로, 원본 변수의 값을 직접 수정할 수 있습니다.
-
장점: 복사본을 만들지 않고 원본에 접근하므로 메모리 효율이 좋고, 여러 개의 값을 수정하여 반환하는 효과를 낼 수 있습니다.
#include <stdio.h>
void swap(int *x, int *y) {
int temp = *x;
*x = *y;
*y = temp;
// 주소를 타고 들어가서 실제 메모리에 있는 값을 바꿉니다.
}
int main() {
int a = 10, b = 20;
swap(&a, &b); // a와 b의 주소를 넘겨줌
printf("a: %d, b: %d\n", a, b); // 출력: a: 20, b: 10 (원본 변경)
return 0;
}
차이점 비교 분석
| 구분 | Call by Value | Call by Reference |
|---|---|---|
| 전달 방식 | 변수에 저장된 값을 복사해서 전달 | 변수의 **주소(Pointer)**를 복사해서 전달 |
| 원본 영향 | 원본 값은 절대 변하지 않음 | 함수 내부에서 원본 값을 수정 가능 |
| 메모리 | 별도의 메모리 공간에 복사본 생성 | 원본의 주소를 공유함 (효율적) |
| C언어 구현 | 일반 변수 사용 | 포인터 변수(*)와 주소 연산자(&) 사용 |
| 주요 용도 | 단순 계산, 데이터 읽기 전용 | 원본 수정 필요, 대용량 데이터 전달 시 |