참조 전달
C언어에는 존재하지 않는 C++에 추가된 키워드이다.
포인터랑 느낌이 매우 비슷하다.
선언 방식은 다음과 같다.
int& ref = number;
초기 값이 반드시 필요하다.
C++ 관점에서는 number라는 바구니에 또 다른 이름을 부여한 것.
number 라는 바구니에 ref 라는 다른 이름을 지어주는 것이다
앞으로 ref 바구니에다가 뭘 꺼내거나 넣으면, 실제 number 바구니(진퉁) 그 값을 꺼내거나 넣으면 됨.
포인터랑 참조랑 100% 기능적으로 동일하다.
그렇다면 왜 참조를 사용하는 것인가?
값 전달처럼 편리하게 사용하고 주소 전달 처럼 주소 값을 이용해 진짜 데이터를 건드릴 수 있는 두개의 장점을 다 합쳐놓은 키워드 인것이다. 물론 장점만 있는 것은 아니다.
#include <iostream>
using namespace std;
struct StatInfo
{
int hp; // +0
int attack; // +4
int defence; // +8
};
void EnterLobby();
StatInfo CreatePlayer();
void CreateMonster(StatInfo* info);
int main()
{
EnterLobby();
return 0;
}
void EnterLobby()
{
cout << "로비에 입장했습니다" << endl;
StatInfo player;
player = CreatePlayer();
StatInfo Monster;
CreateMonster(&Monster);
CreateMonsterRef(Monster);
}
StatInfo CreatePlayer()
{
cout << "플레이어 생성" << endl;
StatInfo temp;
temp.hp = 100;
temp.attack = 10;
temp.defence = 5;
return temp;
}
void CreateMonster(StatInfo* info)
{
cout << "몬스터 생성" << endl;
info->hp = 80;
info->attack = 8;
info->defence = 4;
}
void CreateMonsterRef(StatInfo& info)
{
cout << "몬스터 생성" << endl;
info.hp = 80;
info.attack = 8;
info.defence = 4;
}
포인터 vs 참조
성능적으로는 둘이 완전히 똑같다. 편의성 부분에서 참조가 포인터에 비해 ->가 아닌 . 를 사용해 참조가 더 높다고 볼 수 있다.
하지만 편의성이 좋다는게 꼭 장점만은 아니다.
포인터는 주소를 넘기니 확실하게 원본을 넘긴다는 힌트를 줄 수 있다. 하지만 참조는 알게모르게 사용하기 때문에 이 매개변수 또는 변수가 원본을 사용하는지 안하는지 확인하기 어려울 수 있다.
이는 const를 사용해 참조한 객체가 수정하지 않을거라는 확신이 있다면 원본을 수정하는 현상을 막을 수 있다.
포인터 역시 const를 사용할 수 있는데
별 뒤에 붙인경우와 별 이전에 붙인 경우가 서로 다르다.
별 뒤에 붙이면 더 이상 주소값을 수정하지 말라는 것이다.
별 이전에 붙이면 포인터가 가리키고 있는 바구니의 내용을 바꾸지 말라는 의미다.
#include <iostream>
using namespace std;
int main()
{
int number = 1;
int* const ptr1 = &number;
const int* ptr2 = &number;
//에러
ptr1 = 0x12312541;
*ptr2 = 2;
return 0;
}
포인터와 참조의 차이점은 초기화 여부이다.
참조 타입은 바구니의 2번째 이름이나 마찬가지 이다. 즉, 참조하는 대상이 없으면 안된다.
반면 포인터는 그냥 어떤 ~ 주소라는 의미이기에 대상이 실존하지 않을 수도 있다.
포인터가 아무것도 가리키는 않는다는 의미는 nullptr을 사용해 처리한다.
그래서 포인터가 좋은지 참조가 좋은지 결론을 내리면
정해진 답은 없다. 나중에 회사의 취직하면 정말 team by team...
구글 오픈소스 같은 경우는 대부분 pointer를 사용한다.
언리얼 엔진에서는 참조를 나름 애용한다.
'C++ > 기초' 카테고리의 다른 글
[C++] 포인터 - 4 (다중 포인터, 다차원 배열) (0) | 2023.11.26 |
---|---|
[C++] 포인터 - 3 (배열) (1) | 2023.11.25 |
[C++] 포인터 - 1 (0) | 2023.11.24 |
[C++] 함수 (1) | 2023.11.24 |
[C++] 코드의 흐름 제어 - 2 (가위-바위-보, 열거형) (1) | 2023.11.23 |