C++ Reference (참조)
초창기 C에서 C++로 넘어올 때, 추가된 개념인데 C, C++ 개발자 사이에서는 호불호가 많이 갈리는 기능인 것 같다.
어떠한 사람들은 포인터로 다 대체가 되기 때문에 포인터만 쓰는 것이 좋다고 하고 어떠한 사람들은 포인터보다 편하기 때문에 사용하기 좋아하는 것 같다.
우선 Reference 문법은
- 자바와 비슷하지만 성능저하가 없다. (자바는 안정성을 위해 포인터를 없앰 - 매니지드)
- 똑같이 C++에서 안정성을 보장해야 될 때 Reference를 쓰면 된다.
하지만, 주소연산(포인터연산)이나 주소값 변경 등을 할 때에는 꼭 포인터를 써야 된다.
Call by Reference < - > Call by Value
- Java에서는 원시타입을 제외한 타입 (Object)은 모두 Reference.
- C, C++은 모든 타입에 똑같이 동작한다. object도 참조에 의한 연산을 하려면 포인터로 받아야 한다.
C++에서 사용
C++에서 사용할 때 &(엠퍼센드) 기호를 붙여서 표현한다.
- C++에서 참조는 별칭
int number = 100;
int& reference = number;
다음과 같이 number를 참조로 reference변수명을 통해 접근가능하다.
- NULL이 될 수 없다
int& reference = NULL; // ERROR
- 초기화 중에 반드시 선언되어야 한다
int& reference; // ERROR
- 참조하는 대상을 바꿀 수 없다.
int number1 = 100;
int number2 = 200;
int& reference = number1;
reference = number2;
이렇게 하면 reference가 참조하는 변수 number1의 값이 바뀐다.
그래서 number1, number2 모두 200의 값이 된다.
Swap 함수를 통한 포인터과 Refence비교
- Pointer
void swap(int *number1, int *number2)
{
int temp = *number1;
*number1 = *number2;
*number2 = temp;
}
- Reference
void swap(int& number1, int& number2)
{
int temp = number1;
number1 = number2;
number1 = temp;
}
참조의 장점
- null 값이 들어갈 수 없어서 안전하다.
- 우리가 소유하지 않은 메모리에 접근 할 수 없어 안전.
컴퓨터는 참조가 뭔지 알까?
컴퓨터는 참조가 무엇인지 모르는데, 포인터와 참조를 빌드시켜서 어셈블리어를 살펴보면 똑같은 어셈블리어로 만들어져 있는걸 확인 할 수 있다.
이를 통해 실제로 빌드가 되면 포인터와 참조는 같은것이라고 볼 수 있고 단지, 인간이 코드를 이해하기 쉽게, 포인터 대신에 사용할 수 있게 하는 것이라고 볼 수 있다. (실수도 막아준다)
컴파일러가 참조를 포인터로 바꿔주는 것.(기계가 이해 할 수 있도록)
추천하는 코딩표준
- 읽기전용 매개변수는 상수참조로
const int& a
- 출력결과용 매개변수는 포인터로
int* result
어쨋든, 둘 다 함수내에서 assert 함수를 통해 null 체크를 해야한다.
C#에서는 out키워드를 이용하면된다.
정리
- 참조
- 포인터와 참조에 대한 코딩표준