프로그래머스 데브코스TIL

[week9] 프론트엔드 기초 : React + TypeScript (4)

이규현2026-03-12
[week9] 프론트엔드 기초 : React + TypeScript (4)

포인터

포인터란?

포인터는 메모리의 주소값을 저장하는 특별한 변수입니다. 일반 변수가 '데이터'를 담는다면, 포인터는 그 데이터가 '어디에 있는지'를 가리킵니다.

기호의 중의적 의미

  • 선언 시 *: "이 변수는 주소를 담는 바구니(포인터)다."

  • 사용 시 * (역참조): "이 주소에 저장된 실제 값으로 이동하라."

  • 주소 연산자 &: 변수의 실제 메모리 주소를 찾아내어 포인터에 넘겨줄 때 사용합니다.

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 ValueCall by Reference
전달 방식변수에 저장된 을 복사해서 전달변수의 **주소(Pointer)**를 복사해서 전달
원본 영향원본 값은 절대 변하지 않음함수 내부에서 원본 값을 수정 가능
메모리별도의 메모리 공간에 복사본 생성원본의 주소를 공유함 (효율적)
C언어 구현일반 변수 사용포인터 변수(*)와 주소 연산자(&) 사용
주요 용도단순 계산, 데이터 읽기 전용원본 수정 필요, 대용량 데이터 전달 시