열렬히.뛰기

레퍼런스 (2)

Language > 프로그래밍 언어 > C++ > Cpp : 기초 > 레퍼런스 (2)

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의 레퍼런스 ≠ 포인터