본 내용은 POCU COMP3200: C++ 언매니지드 프로그래밍 강의를 토대로 작성하였습니다.
- 참조(Reference)
- C++에서 포인터 연산이 없어도 될 때, 주소 변경이 없어도 될 때 안전하게 쓰기 위해 참조 씀
- 포인터를 사용하는 좀 더 안전한 방법
- 하지만 Java만큼 제한적이지는 않음
- 먼저 이것부터 살펴 보자
- 값에 의한 호출(call by value)
- 참조에 의한 호출(call by reference)
- 포인터(pointer)
- 값에 의한 호출
- 원본은 안바뀜 swap에서 나가면 arg1, arg2 값 그냥 날라가고 바뀐 거 없음. 원본 안바뀜
- 참조에 의한 호출
- 포인터를 받음. 즉 어떤 값의 주소를 받아오는 것 주소를 받아서 주소에 있는 값을 직접 바꾸니까 원본이 바뀜
- 참조란?
- 별칭이다
- 값을 복사하는 게 아니라 number을 다른 이름으로 부르는 것 뿐
int number=100;
int& reference=number; // & : 참조형임을 나타내는 표시. *가 int*로 포인터형인것 나타내는 처럼
- NULL이 될 수 없음
int& reference=NULL; //ERROR
- 초기화 중에 반드시 선언되어야 함
- 별칭임을 나타내는것이기 때문. 뭐의 별칭인데?
int& reference; //ERROR
- 참조하는 대상을 바꿀 수 없음
int number1=100;
int number2=200;
int& reference=number1; //reference는 number1과 똑같은 것을 가리킨다
reference=number2; //세 변수 값이 모두 200이 됨
- 함수 매개변수로서의 참조
- 참조의 장점 : 참조가 포인터보다는 안전함
- number1과 number2 변수는 NULL이 될 수 없음
- 포인터 같은 경우 호출자가 NULL을 넣을 수 있는데 NULL을 넣는 순간 읽어오려 하면 에러. 위험한 현상이 나타날 수 있음
- 참조는 NULL이 될 수 없으니까 들어오는 값이 일단 유효해서 쓸 수는 있음. NULL 체크 안해도 됨
- 우리가 소유하지 않은 메모리 장소를 가리킬 수 없음
- 포인터의 경우 맘대로 int temp=*(number1+1) 같은 짓을 할 수 있음. 그러나 이건 내가 소유하지 않은 메모리이기 때문에 올바른 방법이 아님
- number1과 number2 변수는 NULL이 될 수 없음
- 참조의 장점 : 참조가 포인터보다는 안전함
복사해오는 것이 아니라 number1, number2를 참조하는, 즉 가리키는 것들
이 값들을 읽어오면 대입이니까 number1의 값을 temp에 넣고 temp값을 number2에 넣으면 두개가 동일하게 작동
즉, 참조를 이용한 swap 함수는 좀더 깔끔하게 짤 수 있다.
- 컴퓨터는 참조가 뭔지 알까?
- 모름
- 포인터와 참조는 같은 어셈블리 명령어를 생성함
- 참조는 오직 인간을 위한 것임
- 컴파일러는 참조를 포인터로 바꿔 줌. 기계가 이해할 수 있도록
코드 샘플: 참조를 이용한 swap
#include <iostream>
#include "Swap.h"
using namespace std;
namespace samples
{
void SwapExample()
{
cout << "+------------------------------+" << endl;
cout << "| Swap Example |" << endl;
cout << "+------------------------------+" << endl;
int number1 = 1;
int number2 = 2;
cout << "Before swap: " << number1 << ", " << number2 << endl;
Swap(number1, number2);
cout << "After swap: " << number1 << ", " << number2 << endl;
}
void Swap(int& number1, int& number2)
{
int temp = number1;
number1 = number2;
number2 = temp;
}
}
'C++' 카테고리의 다른 글
#2. 복사 생성자의 호출 시점 (0) | 2022.02.04 |
---|---|
#1. 왜 C++인가? / 생성자와 소멸자 (0) | 2022.01.25 |
[C++] Bool 데이터형 (0) | 2022.01.21 |
[C++] 입력(Input) (0) | 2022.01.21 |
[C++] C 스타일 배열과 std::array (0) | 2022.01.20 |
댓글