C++을 배우다 보면 처음으로 마주하게 되는 큰 벽이 바로 포인터(pointer)입니다.
많은 분들이 "도대체 왜 주소를 다뤄야 하지?" 하며 혼란스러워하시죠.
게다가 비슷한 개념처럼 보이는 참조(reference)도 함께 등장하니 헷갈리기 쉽습니다.
이번 글에서는 포인터와 참조의 기본 개념부터 실전 사용법까지, 친절하고 쉽게 설명해 드릴게요.
"포인터가 어려워서 C++를 포기하고 싶다"는 마음이 들지 않도록 하나하나 차근차근 풀어보겠습니다 😊
✅ 포인터란 무엇인가요?
포인터는 어떤 변수의 메모리 주소를 저장하는 변수입니다. 조금 낯설게 느껴질 수 있지만, 간단히 말해 "값이 저장된 장소를 기억하는 것"이에요.
int a = 10; // 변수 a에 10이라는 값 저장
int* p = &a; // 포인터 p는 a의 주소를 저장
- &a는 변수 a의 주소(address)를 가져옵니다.
- int* p는 정수형(int) 변수를 가리키는 포인터입니다.
즉, p는 a가 어디에 있는지를 알고 있는 변수예요.
✅ 포인터를 이용해 변수 값 바꾸기
포인터는 단순히 주소만 저장하는 것이 아니라, 그 주소를 통해 변수에 접근하고 수정도 할 수 있어요.
*p = 20; // a의 값을 20으로 바꾼다
- *p는 p가 가리키는 메모리 위치의 값을 의미해요.
- 즉, *p = 20;은 a = 20;과 같은 효과를 냅니다.
💡 이걸 역참조(dereferencing)라고 해요.
✅ 참조(Reference)란?
참조는 다른 변수의 또 다른 이름(alias)이라고 생각하면 됩니다. 포인터와 달리 별도로 메모리를 가지지 않고,
기존 변수의 별명처럼 작동합니다.
int a = 10;
int& ref = a; // ref는 a를 참조함
ref = 20; // a의 값도 20으로 바뀜
- int& ref는 "a를 참조하는 정수형 변수"라는 의미예요.
- ref를 통해 값을 바꾸면 실제로는 a의 값이 바뀝니다.
➡️ 참조는 주소를 직접 다루지 않으면서도 포인터처럼 변수에 접근할 수 있는 쉬운 방법입니다.
✅ 포인터 vs 참조: 무엇이 다를까?
항목 포인터 참조
선언 방식 | int* p | int& r |
null 가능 여부 | 가능 (nullptr) | 불가능 (항상 유효한 대상이 있어야 함) |
재지정 가능 여부 | 가능 (다른 주소로 변경 가능) | 불가능 (처음 지정한 변수만 참조) |
사용 목적 | 동적 메모리, 배열 처리 등 유연한 조작 | 간편한 함수 인자 전달, 연산자 오버로딩 등 |
🧩 요약: 참조는 더 간단하고 직관적이며, 포인터는 더 유연하고 복잡한 작업에 적합합니다.
✅ 함수 인자로 사용할 때: 포인터와 참조 비교
void byPointer(int* p) {
*p = 100;
}
void byReference(int& r) {
r = 100;
}
int main() {
int a = 10;
byPointer(&a); // 포인터로 전달 (주소 필요)
byReference(a); // 참조로 전달 (그냥 변수명만)
}
- 포인터 방식은 *p를 사용해 값을 바꿔야 합니다.
- 참조 방식은 일반 변수처럼 쓸 수 있어서 코드가 더 깔끔합니다.
📌 현대 C++에서는 가능하면 참조를 더 자주 사용합니다. 가독성이 좋고, 실수 위험도 줄어들거든요.
🧠 초보자가 자주 하는 실수
- ❌ 초기화하지 않은 포인터 사용하기
- int* p; *p = 10; → 위험! 포인터가 아무 주소도 가리키지 않아요.
- ❌ 참조를 null로 만들려 하기
- 참조는 반드시 유효한 대상을 참조해야 합니다. null 개념이 없습니다.
- ❌ 복잡한 포인터 중첩
- int** pp;처럼 여러 단계 포인터는 가능한 한 피하거나 주석으로 설명을 덧붙이세요.
💡 실전에서 유용한 팁
- ✔️ 함수 인자를 수정하려면 참조를 사용하세요. 깔끔하고 안전합니다.
- ✔️ 포인터는 배열 처리, 동적 메모리 할당(new/delete), C 스타일 API에 필수입니다.
- ✔️ nullptr로 초기화하면 포인터 오류 방지에 도움이 됩니다.
🎯 마무리: 포인터와 참조는 친구다!
포인터와 참조는 C++ 프로그래밍에서 매우 중요한 기초 개념입니다.
낯설고 어려울 수 있지만, 차근차근 연습하고 직접 코드를 써보면서 익히다 보면 익숙해집니다.
초보자에게는 참조로 시작해보고,
나중에 포인터의 유연함과 강력함을 체험해보는 것도 좋은 방법이에요.
다음 편에서는 템플릿(template)이라는 마법 같은 기능에 대해 알아보겠습니다.
다양한 타입을 자유롭게 다루는 방법이 궁금하시다면 기대해주세요!
[다음 편 예고]
👉 C++ 문법 속으로 2편: 템플릿 – 타입에 구애받지 않는 유연한 코드 만들기
'IT' 카테고리의 다른 글
DFS vs BFS: 깊이 우선 탐색과 너비 우선 탐색의 모든 것 (1) | 2024.08.17 |
---|---|
자동차 네비로 유튜브를 즐겨보자~!!( 안드로이드 오토 ) (64) | 2024.03.30 |
안드로이드 오토를 무선으로 즐기자~ 메이튼 오토프로 플러스!!( feat. 차량 셋팅 법 )!! (65) | 2024.03.27 |
HBM 적층을 위한 NCF와 MUF 특징 및 장단점 (61) | 2024.03.22 |
모터의 유형과 동작원리, 장단점에 대해 알아봅시다. (37) | 2024.03.17 |