참조의 기본 개념
C++에서는 참조(reference)를 통해 변수에 별칭(alias)을 부여할 수 있습니다. 다음 예시를 살펴보겠습니다.
int main() {
int x;
int &y = x;
int number;
int &alias = number;
}
위 코드에서
y는
x의 별칭이며,
alias는
number의 별칭입니다. 따라서
y와
alias를 통해 해당 변수들의 값을 읽거나 수정할 수 있습니다.
참조의 주요 사용 목적
1. 함수 호출 시 인자의 값을 변경하여 원본 값도 동시에 업데이트되도록 합니다.
2. 프로그래밍을 더 직관적으로 만듭니다.
예제 1: 값 전달 방식
#include <iostream>
using namespace std;
void exchange(int a, int b) {
int temp = a;
a = b;
b = temp;
}
int main() {
int first = 1, second = 2;
exchange(first, second);
// first와 second의 값은 바뀌지 않음
}
위 코드에서는 값이 복사되어 전달되기 때문에 원본 데이터는 변경되지 않습니다.
예제 2: 포인터를 이용한 값 교환
#include <iostream>
using namespace std;
void exchange(int* a, int* b) {
int temp = *a;
*a = *b;
*b = temp;
}
int main() {
int first = 1, second = 2;
exchange(&first, &second);
// first와 second의 값이 바뀜
}
포인터를 사용하면 값이 성공적으로 교환되지만, 코드가 덜 직관적이고 안전하지 않을 수 있습니다.
예제 3: 참조를 통한 값 교환
#include <iostream>
using namespace std;
void exchange(int& a, int& b) {
int temp = a;
a = b;
b = temp;
}
int main() {
int first = 1, second = 2;
exchange(first, second);
// first와 second의 값이 바뀜
}
위 코드는 참조를 사용해 원본 값을 변경하면서도 코드를 직관적으로 유지합니다.
참조의 구현 메커니즘
실질적으로 참조는 "상수 포인터(constant pointer)"로 구현됩니다. 컴파일러는 참조 변수를 포인터처럼 처리하며, 초기화 시 원본 변수의 주소를 저장합니다. 따라서 참조는 포인터와 유사하게 동작하지만, 프로그래머가 별도의 주소 연산자를 사용하지 않아도 됩니다.
참조는 포인터보다 안전하고 직관적인 대안으로 작용합니다. 그러나 실제로는 여전히 주소가 전달되고 있으며, 효율이나 메모리 사용 측면에서 차이는 없습니다. 참조는 단순히 컴파일러가 제공하는 보다 안전하고 편리한 도구일 뿐입니다.