C++

참조자(레퍼런스)

종황이 2020. 10. 23. 02:26

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