출처 : https://www.reddit.com/r/ProgrammerHumor/comments/10cfekq/i_honestly_dont_know_the_difference/
참조 전달 방식으로 주소값을 이용해 원본 데이터에 접근 하는 것.
1. 값 전달 방식
2. 주소 전달 방식
3. 참조 전달 방식
값 전달 방식은 기존의 복사 방식을 의미하는 것으로 복사를 통해 값을 전달 받기에 복사하는 대상의 크기가 크면 클수록 부담이 엄청 커진다.
주소 전달 방식은 Pointer를 이용한 방식이다. 값을 복사하지 않고 원본 데이터의 주소를 전달하는 방식이기때문에 복사하는 대상의 크기가 영향을 끼치지 않는다.
참조 전달 방식은 값 전달 방식과 주소 전달 방식의 혼합이라고 생각하면 된다. 로우 레벨 관점에서는 포인터와 상당히 유사하지만 사용 방식은 일반 적인 복사 방식과 유사하다.
//&을 통해 주소를 넘겨주지 않는것이 값전달과 유사하다.
Statinfo info;
PrintInfoByRef(info);
// 하지만 매개변수에서는 info의 주소값을 받아온다.
void PrintInfoByRef(Statinfo& info) {
cout << "----------------" << endl;
cout << info.hp << endl;
cout << info.attack << endl;
cout << info.defence << endl;
cout << "------------------" << endl;
}
참조 전달 방식(Reference)이 주소 전달 방식(Pointer)과 같은 방식을 사용하는 것이라면 Pointer 와 Reference의 차이는 무엇이고 무엇을 사용하는게 더 나을까?
성능)
Pointer와 Reference의 성능은 동일하다. 같은 주소 전달 방식을 사용하기 때문
편의성)
Reference가 우세하다. ->을 사용하지 않고 .으로 사용한다는 점이 Reference의 편의성인데 이는 꼭 장점으로 받아드려 지지는 않는다.
Pointer로 넘길때는 &를 사용해서 주소값을 넘겨주니 Pointer 인것을 알 수 있지만
참조는 &없이 넘겨주기에 이게 Reference인지 아니면 복사해서 넘기는 것인지 구별이 안된다.
그래서 const를 사용해서 reference를 사용하더라도 값 수정이 되지 않게 사용해야한다.
void PrintInfoByRef(const Statinfo& info) {
cout << "----------------" << endl;
cout << info.hp << endl;
cout << info.attack << endl;
cout << info.defence << endl;
cout << "------------------" << endl;
}
포인터도 const사용 가능하다.!
void PrintInfoByPtr(const Statinfo* info) {
cout << "----------------" << endl;
cout << info.hp << endl;
cout << info.attack << endl;
cout << info.defence << endl;
cout << "------------------" << endl;
}
const 를 *뒤에 붙인다면?
info라는 바구니의 내용물(주소)를 바꿀 수 없는 상태
info = 주소값을 갖는 바구니 -> 이 주소값이 고정이다.
const를 *이전에 붙인다면?
info가 가르키고 있는 바구니의 내용물을 바꿀 수 없다.
info->hp;
경우에 따라 사용하면 되고 필요하면 const를 양쪽에 사용해도 된다.
초기화 여부)
참조 타입은 바구니의 2번째 이름을 뜻한다.
이는 참조하는 대상이 없으면 안된다는 의미이다.
유효한 대상을 무조건 가르키고 있어야 한다.
만약 Pointer에 nullptr값을 넣는다면? -> 오류난다.
그래서 포인터를 이용할때마다 info == nullptr인지 확인해줘야 한다.
Reference, Pointer중 편하거나 기존 업무에서 사용하던걸 사용하면 된다.