참조자는 포인터와 유사하지만, 기존 변수에 대한 별칭(Alias)을 제공하는 개념으로, 포인터와는 몇 가지 중요한 차이가 있다.
int val = 7;
int& ref = val;
ref = 20;
cout << val << endl; // 20 출력
ref는 val이 저장된 메모리 공간을 참조한다.ref에 값을 대입하면 원본 변수 val도 변경된다.*p_valrefvoid increase(int& ref) {
ref += 10;
}
void increase2(int val) {
val += 10;
}
int main() {
int num = 5;
increase(num);
cout << num << endl; // 15 출력
increase2(num);
cout << num << endl; // 15 출력 (num은 변하지 않음)
}
void increase3(int* p_val) {
*p_val += 10;
}
void print(const int& ref) {
cout << ref << endl;
}
const를 사용하여 참조자가 읽기 전용으로 동작하도록 설정할 수 있다.소멸된 객체를 참조하지 않기
int& get_ref() {
int x = 42; // 지역 변수
return x;
}
int main() {
int& ref = get_ref();
cout << ref; // 비정상 동작 가능
}
| 특징 | 참조자 | 포인터 |
|---|---|---|
| 초기화 | 반드시 초기화 필요 | 초기화 없이 선언 가능 |
| NULL 가능 여부 | 불가능 | 가능 (nullptr 사용) |
| 참조 대상 변경 가능 여부 | 불가능 | 가능 |
| 메모리 관리 | 자동 (대상 객체 생명 주기와 동일) | 개발자가 직접 관리 |
| 문법의 단순성 | 간단함 | 복잡함 (*, & 연산 필요) |
int* ptr = new int(10); // 동적 메모리 할당
*ptr = 20;
delete ptr; // 메모리 해제
참조자는 코드의 안정성을 높이고 가독성을 향상시키는 데 유용하지만, 특정 상황에서는 포인터의 유연함이 더 필요할 수 있다. 상황에 맞게 적절한 방식을 선택하는 것이 중요하다.