티스토리 뷰
참조(refefence)는 C++의 새로운 기능 중 일부이다. C 에서는 포인터를 사용했지만 포인터는 여러가지 문제점을 발생시킬 수 있는 기능이여서 C++에서는 굳이 포인터가 필요없을 때 더 안전하게 사용하기 위해서 참조(reference)를 사용한다. |
참조(reference)
- 포인터를 사용하는 좀 더 안전한 방법
- 하지만 Java만큼 제한적이지는 않음
- 먼저 이것부터 살펴 보자
- 값에 의한 호출(call by value)
- 참조에 의한 호출(call by reference)
- 포인터(pointer)
값에 의한 호출(call by value)
void swap(int arg1, int arg2)
{
int temp = arg1;
arg1 = arg2;
arg2 = temp;
}
void main()
{
int num1 = 10;
int num2 = 20;
swap(num1, num2);
}
위 함수를 보면 main()에서 생성한 num1, num2의 값을 swap 함수를 호출함으로서 swap의 매개변수로 가져온다.
swap 함수는 두 값을 바꾸는 함수인데 swap 함수 안에서는 두 값이 바뀌지만 원본을 바꾸지는 않는다.
참조에 의한 호출(call by reference)
void swap(int& number1, int& number2)
{
int temp = number1;
number1 = number2;
number2 = temp;
}
void main()
{
int num1 = 10;
int num2 = 20;
swap(num1, num2);
}
아까와는 다르게 swap 의 매개변수를 인트 포인터로 받아온다. 즉, 변수의 주소를 뽑아서 함수에 전달하겠다는 뜻.
값에 의한 호출과는 다르게 참조에 의한 호출은 원본의 주소를 가져오기 때문에 주소의 값을 바꾸면 원본의 값또한 바꾼다.
- 별칭이다
int number = 100;
int& reference = number;
원본의 이름이 아닌 별칭으로 부르는 것. number는 100이라는 값을 가지고 있는 변수인데, 이것을 다른 이름으로 부르는 것이 참조이다. 즉, reference는 number의 별칭이된다.
중요한 것은 참조형을 표현할 때는 `&`을 붙여야한다.
- NULL이 될 수 없다
int& reference = NULL; // error
이렇게 되면 바로 컴파일러 에러난다.
- 초기화 중에 반드시 선언되어야 한다
int& reference; // error
누군가의 별칭인지 반드시 선언해줘야 한다.
- 참조하는 대상을 바꿀 수 없다
int num1 = 100;
int num2 = 200;
int& reference = number1;
reference = number2; // 세 변수 값이 모두 200이 됨
reference의 값이 바뀌는 것이 아니다. reference는 number1을 참조하고 있기 때문에 number1의 값이 바뀌게 되고 세 변수 값이 모두 200이 된다.
- 포인터보다 참조가 안전한 이유
포인터 |
void Swap(int* number1, int* number2)
{
int temp = *number1;
*number1 = *number2;
*number2 = temp;
}
Swap 함수는 두 변수를 바꾸는 함수이다. 포인터는 호출자가 NULL을 가져올 수 있는데, *number1을 읽을려고할 때 에러난다.
그리고 포인터는 *(number1 + 1)을 가리킬 수 있는데 우리가 소유한 메모리 장소가 아니기 때문에 올바른 방법은 아니다. 무슨 말이냐면, number1의 메모리 장소가 4096이라면 number1 + 1은 4104를 가르킨다.
참조 |
void Swap(int& number1, int& number2)
{
int temp = number1;
number1 = number2;
number2 = temp;
}
참조는 애초에 NULL인 변수를 참조할 수 없다. 그렇기 때문에 호출자가 NULL을 가져올 것에 대해 걱정할 필요가 없다.
참조는 우리가 소유하지 않은 메모리 장소를 가리킬 수 없기 때문에 포인터에 비해 안전하다.
컴퓨터는 참조가 뭔지 알까?
- 모름
- 포인터와 참조는 같은 어셈블리 명령어를 생성함
- 참조는 오직 인간을 위한 것임
- 컴파일러는 기계가 이해할 수 있도록 참조를 "포인터"로 바꿔 줌.
'컴퓨터 언어 공부 > C & C++' 카테고리의 다른 글
(용어 정리) 인터럽트 / 호출자 / 수신자 / 반환 값 (0) | 2019.09.03 |
---|---|
(용어 정리) cin / cout / L-Value, R-Value (0) | 2019.09.03 |
(C++) 일부 새로운 C++ 기능 (0) | 2019.08.23 |
(C++) 입력 버리기: get(), getline() (0) | 2019.08.15 |
(C++) 입력 버리기: clear(), ignore() (0) | 2019.08.15 |