C언어의 포인터와 비슷하지만 다른 레퍼런스에 대해 공부해봤습니다.
#include <iostream>
int change(int *p)
{
*p=3;
return 0;
}
int main()
{
int number = 5;
std::cout << number << std::endl;
change(&number);
std::cout << number << std::endl;
}
위 코드에 대해 컴파일을 돌리면 아래와 같은 결과가 나옵니다.
change 함수의 인자 p에 number의 주소값을 전달하여, *p를 통해 number를 참조하여 number의 값을 3으로 바꿨습니다. C 에서는 어떤 변수를 가리키고 싶을 때, 반드시 포인터를 사용했지만, C++에서는 다른 변수나 상수를 가리키는 방법으로 참조자(레퍼런스)를 제공합니다.
#include <iostream>
int main()
{
int a = 3;
int& another_a = a;
another_a = 5;
std::cout << "a : " << a << std::endl;
std::cout << "another_a : " << another_a << std::endl;
return 0;
}
컴파일 해보면
이렇게 나옵니다.
코드를 보면, 정수형 a 변수에 3을 초기화해주었고, a의 참조자 another_a를 정의하였습니다. 이렇게 하면 컴파일러에게 a의 또다른 이름은 another_a 라고 알려주는 것입니다. 따라서 another_a에 어떤 작업을 하든 이는 a에 그 작업을 하는것과 동일합니다.
그러므로 a와 another_a 모두 5를 출력하는 것입니다.
참조자와 포인터는 상당히 유사한 개념입니다. 포인터 역시 다른 어떤 변수의 주소값을 보관함으로써 해당 변수에 간접적으로 연산을 수행할 수 있기 때문입니다. 하지만 레퍼런스와 포인터는 몇가지 중요한 차이점이 있습니다.
1. 레퍼런스는 반드시 초기화해주어야한다.
int& another_a;
위는 불가능한 코드입니다.
int* p;
는 전혀 문제 없습니다.
2. 한번 어떤 변수의 참조자가 되어버리면, 더 이상 다른 변수를 참조할 수 없습니다.
int a = 10;
int &another_a = a;
int b = 3;
another_a = b;
맨 마지막 줄의 의미는 another_a가 b를 가리키라는 것이 아닌 b의 값을 a에 대입하라는 의미입니다.
사실상 a = b; 와 동일합니다.
int a = 10;
int* p = &a; // p 는 a 를 가리킨다.
int b = 3;
p = &b // 이제 p 는 b 를 가리킨다
포인터는 자유롭게 바뀔 수 있습니다.
3. 레퍼런스는 메모리 상에 존재하지 않을 수 있습니다.
another_a가 쓰이는 자리는 모두 a로 바꾸면 되기때문에 이 경우 레퍼런스는 메모리 상에 존재하지 않습니다. 항상 존재하지 않는 것은 아닙니다.
다음에는 C++ 객체지향 프로그래밍에 대해 공부해보겠습니다.
'C++' 카테고리의 다른 글
상속 (Inheritance) (0) | 2020.10.27 |
---|---|
C++ 에서의 캐스팅(형변환) (0) | 2020.10.27 |
연산자 오버로딩(전위/후위 증감 연산자) (0) | 2020.10.27 |
malloc과 new의 차이 (0) | 2020.10.24 |
스택, 힙, 코드, 데이터 영역 (0) | 2020.10.23 |