포인터와 참조
Coddy C++ 여정의 객체 지향 프로그래밍 섹션에 포함된 레슨. 104개 중 13번째.
이제 스택 및 힙 메모리를 이해했으니, 메모리 위치를 직접 다룰 수 있게 해 주는 도구인 pointers와 references를 살펴보겠습니다.
pointer는 다른 변수의 memory address를 저장합니다. *로 선언하고 &를 사용하여 address를 가져옵니다.
int value = 42;
int* ptr = &value; // ptr은 value의 주소를 보유합니다
std::cout << ptr; // 메모리 주소를 출력합니다
std::cout << *ptr; // 역참조: 42를 출력합니다reference는 기존 변수의 alias입니다. 한 번 연결되면 항상 해당 변수를 참조합니다. &를 사용하여 선언합니다.
int value = 42;
int& ref = value; // ref는 value의 별칭입니다
ref = 100; // value를 100으로 변경합니다
std::cout << value; // 100을 출력합니다주요 차이점:
| Pointers | 참조 |
|---|---|
| null일 수 있음 | 초기화해야 함 |
| 재할당할 수 있음 | 다시 바인딩할 수 없음 |
*를 사용하여 값에 접근 | 값에 directly 접근 |
| 아무것도 point하지 않을 수 있음 | 항상 유효함 |
둘 다 객체를 복사하지 않고 함수에 효율적으로 전달하고, 힙에 할당된 메모리로 작업하는 데 필수적입니다. 참조는 더 안전하고 간단한 반면, 포인터는 재할당하거나 null인지 확인해야 할 때 더 유연합니다.
챌린지
쉬움데이터를 수정할 때 pointers와 references가 어떻게 다르게 작동하는지 보여 주는 간단한 value manipulation system을 만들어 보겠습니다.
코드를 정리하기 위해 두 개의 파일을 만듭니다:
ValueOps.h: 정수 값을 서로 다른 방식으로 수정하는 세 개의 함수를 Define합니다:doubleByPointer(int* ptr): pointer를 takes하고 pointer가 가리키는 값을 두 배로 만듭니다tripleByReference(int& ref): reference를 takes하고 값을 세 배로 만듭니다swapValues(int* a, int* b): 두 개의 pointer를 takes하고 pointer가 가리키는 값들을 서로 교환합니다
main.cpp: input에서 두 개의 정수를 Read한 다음, pointers와 references를 모두 사용해 봅니다:- Original 값을 Print합니다:
"Original: <first> <second>" - 첫 번째 값에
doubleByPointer를 사용한 다음 Print합니다:"After double: <first>" - 두 번째 값에
tripleByReference를 사용한 다음 Print합니다:"After triple: <second>" swapValues를 사용해 두 값을 교환한 다음 Print합니다:"After swap: <first> <second>"
- Original 값을 Print합니다:
pointers를 사용해 함수를 호출할 때는 address-of 연산자(&)를 사용해 변수의 address를 pass해야 한다는 점을 기억하세요. References는 더 자연스럽게 작동하므로 변수를 directly pass하면 됩니다.
#include "ValueOps.h"를 using하여 main.cpp에 header file을 Include하세요.
직접 해보기
#include <iostream>
#include "ValueOps.h"
using namespace std;
int main() {
// 입력에서 두 정수를 읽기
int first, second;
cin >> first;
cin >> second;
// 원래 값 출력
cout << "Original: " << first << " " << second << endl;
// TODO: 첫 번째 값에 doubleByPointer 사용 (&를 사용하여 주소 전달)
// TODO: 두 배 후 출력
// TODO: 두 번째 값에 tripleByReference 사용 (변수를 직접 전달)
// TODO: 세 배 후 출력
// TODO: swapValues를 사용하여 두 값 교환 (&를 사용하여 주소 전달)
// TODO: 교환 후 출력
return 0;
}
이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.
객체 지향 프로그래밍의 모든 레슨
직접 연습해 보세요: 온라인 C++ 컴파일러