C vs CPP
- 우리는 c언어에서 포인터라는 것을 배웠다.
- 포인터를 인자로 넘겨주면, 역시 원래 변수를 변하게 할 수 있다.
- 그렇다면 c언어에도 call-by-reference가 존재하는가?
답은 아니다. C언어는 call-by-value만 존재한다.
참조값 vs 주소값
물론 둘 다 직접 변수의 값이 아닌 무언가를 전달하는 것은 같다.
c
// c언어의 포인터
void swap(int *a, int *b) {
int tmp = *a; *a = *b; *b = tmp;
}
int main() {
int x = 10, y = 20;
swap(&x, &y);
}
cpp
// cpp의 레퍼런스
void addString(std::string &text) {
text += "world";
}
int main() {
std::string text = "Hello";
addString(text);
}
그러나 다음과 같은 결정적인 차이가 있다.
- C언어의 포인터 : 주소값을 복사 → 역참조자(*)로 복사한 주소값이 가리키는 값에 접근
- Cpp의 레퍼런스 : 참조값 자체를 전달.
c
// c언어의 포인터 ( call-by-reference를 흉내 )
void swap(int *a, int *b) // 주소값 x, y를 복사한 a, b가 있다.
{
// 복사주소값 a와 원래 주소값 x 모두 10을 가리킨다.
// 복사주소값 a는 역참조자(*)를 이용해 값을 바꾼다.
int tmp = *a; *a = *b; *b = tmp;
}
int main() {
int x = 10, y = 20;
swap(&x, &y);
}
cpp
// cpp의 레퍼런스
void addString(std::string &str) { // str은 text의 또 다른 이름
str += "world";
}
int main() {
std::string text = "Hello";
addString(text);
}
java vs Cpp
둘 다 레퍼런스라는 개념이 들어가 있기는 하다.
그러나 세부적인 차이에 있어서 둘은 완전히 다르다.
- java의 레퍼런스 = 고급 포인터
- Cpp의 레퍼런스 ≠ 포인터