Computer >> 컴퓨터 >  >> 프로그래밍 >> C++

C++ 포인터(Pointer)와 참조(Reference)의 차이점 완벽 정리

C++에서 포인터(pointer)참조(reference)는 모두 변수에 간접적으로 접근하는 방법을 제공하지만, 선언 방식과 동작 원리에서 중요한 차이가 있습니다. 이 글에서는 두 개념의 기본 문법과 핵심 차이점을 살펴보겠습니다.


포인터(Pointer)란?

포인터는 변수의 메모리 주소를 저장하는 변수입니다. 포인터를 사용하면 해당 주소에 있는 값을 간접적으로 읽거나 수정할 수 있으며, NULL 값을 가질 수 있고, 실행 중에 가리키는 대상을 변경할 수도 있습니다.

선언 문법

Type *pointer;

초기화

Type *pointer;
pointer = &변수명;  // 변수의 주소를 대입

포인터는 선언만 하고 나중에 초기화해도 되지만, 초기화되지 않은 포인터(들러리 포인터)를 역참조하면 정의되지 않은 동작(undefined behavior)이 발생할 수 있으므로 주의가 필요합니다.

참조(Reference)란?

변수가 참조로 선언되면, 그것은 기존 변수의 또 다른 이름(alias)이 됩니다. 참조는 독립적인 객체가 아니라 원본 변수 자체를 가리키며, 선언과 동시에 반드시 초기화해야 합니다.

선언 문법

Type &새이름 = 기존이름;

초기화

int num = 10;
int &ref = num;  // ref는 num의 별칭

참조는 한 번 초기화되면 다른 변수를 가리키도록 변경할 수 없습니다.

포인터와 참조의 주요 차이점

  • 역할의 차이: 참조는 기존 변수에 다른 이름을 붙여 접근하는 반면, 포인터는 변수의 메모리 주소를 저장합니다.

  • NULL 허용 여부: 참조에는 NULL 값을 할당할 수 없지만, 포인터는 NULL 값을 가질 수 있습니다.

  • 값 접근 방식: 참조는 값 자체처럼 자연스럽게 사용할 수 있어 코드가 간결하고 안전한 반면, 포인터는 주소 연산자(*)와 역참조를 통해 값에 접근해야 합니다.

  • 초기화 필수 여부: 참조는 선언 시 반드시 초기화해야 하지만, 포인터는 선언만 하고 나중에 초기화하는 것이 가능합니다.

  • 메모리 구조: 참조는 원본 변수와 같은 메모리 주소를 공유하며 컴파일러에 따라 스택에 일정 공간을 차지하기도 하는 반면, 포인터는 자신만의 고유한 메모리 주소와 크기를 스택에 가집니다.

정리

대상이 항상 존재하고 변경되지 않는다면 참조를 사용하는 것이 더 안전하고 직관적입니다. 반면, 대상이 없을 수 있거나(NUL 가능성), 프로그램 실행 중에 가리키는 대상을 바꿔야 한다면 포인터가 적합합니다. 두 개념의 특성을 이해하고 상황에 맞게 선택하는 것이 좋은 C++ 코드 작성의 핵심입니다.