※ C / C++을 이미 알고 있으나 개인적인 공부를 위해 포스팅 하는 글이므로
C++에 대한 구체적인 정보를 담고 있지 않습니다.
▶ 포인터vs참조
ㆍ 성능은 똑같다. 편의성은 참조가 더 좋다.
1) 편의성 관련
ㆍ 편의성이 좋다는게 꼭 장점만은 아니다.
ㆍ 포인터는 주소를 넘기니 확실하게 원본을 넘긴다는 힌트를 줄 수 있다 (가독성, 사람이 확인하기 눈에 확들어옴)
ㆍ 참조는 자연스럽게 모르고 지나칠 수 있음! (협업하기 힘들수도)
ㆍ 나같은 신입이 마음대로 고쳐버릴 수도 있음 (const로 막아줄 수 있긴 함)
ㆍ 따라서 편리하게 넘겨주기 전용이며 데이터 수정이 없는 &에는 const를 붙히자.
★ 포인터도 const를 사용 가능하다.
▷ * 앞에 붙히느냐 * 뒤에 붙히느냐에 따라 의미가 달라진다 (*을 기준으로 잡는다)
StatInfo globalInfo;
void PrintInfo(StatInfo* info)
{
info = &globalInfo;
info->hp = 10000;
}
★ -1) 별 뒤에 붙힌다면?
StatInfo globalInfo;
void PrintInfo(StatInfo* const info)
{
info = &globalInfo; //오류 발생
info->hp; //이건 가능
}
ㆍ 해당 코드는 오류다. Why?
= 주소를 담는 바구니 (=포인터)인 "info"라는 바구니를 바꿀 수 없다는 뜻이다.
= info는 주소를 담는 바구니인데 이 주소값이 const로 상수라는 뜻! 따라서 위 코드는 오류
= 즉 별 뒤에 const가 붙는다면 info의 내용물은 변경할 수 있지만, info가 가리키는 주소는 변경할 수 없다.
= info를 상수화 하겠다(바구니 수정 ㄴㄴ)
★ -2) 별 이전에 붙힌다면?
StatInfo globalInfo;
void PrintInfo(const StatInfo* info) // = StatInfo const* info
{
info = &globalInfo; //이건 가능
info->hp; //오류 발생
}
ㆍ 별을 기준으로 왼쪽 오른쪽으로 구분하기에 const StatInfo* info = StatInfo const* info 같은 말이다.
= info가 가리키고 있는 그 내용물을 바꿀 수 없다.
= 바구니는 바꿀 수 있음
= 즉 별 앞에 const가 붙는다면 info의 내용물을 바꿀 수 없게된다. = StatInfo를 상수화 하겠다 (내용물 수정ㄴㄴ)
※ 양쪽 다 const를 붙혀서 다 상수화 시키는 거도 가능함.
2) 초기화 여부
ㆍ 참조 타입은 바구니의 2번째 이름(별명?) 을 지어주는 느낌이라 헀다
ㆍ 즉 참조하는 대상이 없으면 안댐
StatInfo& reference; //무조건 어떠한 값이라도 참조를 하고 있어야댐!! 해당 코드는 오류
reference = info;
ㆍ 반면 포인터는 어떠한 주소 라는 의미기 때문에 대상이 실존하지 않을 수도 있다.(초기화 안해도댐)
ㆍ 포인터에서 "없다" 는 의미는 뭘 전달해야 할까? → nullptr
ㆍ 참조타입은 nullptr 이라는 개념이 없다. 애초에 비어있는 상태로 둘 수 없다.
ㆍ 만약 몬스터를 찾는 Info* findMonster() 함수가 있다면 못찾았다면 nullptr을 반환해주는걸 해줄 수 있지만
참조타입에선 이러한것이 불가능하다
ㆍ 또한 참조타입은 nullptr체크도 불가능하다
StatInfo* pointer;
pointer = nullptr;
// ↓ 만약 이거 할당안해줬으면 PrintInfo함수에서 유효하지 않는 주소에 접근하기 때문에 프로그램이 죽는다.
pointer = &info;
SettingInfo(&info); //&info할당 안해줬으면 유효하지 않은 값 접근 프로그램 사망
※ 그래서 결론이 뭐야?
사실 Team By Team... 정해진 답은 없다
ex) 구글에서 만든 오픈소스를 보면 거의 무조건 포인터를 사용하네
ex) 언리얼 엔진에선 reference도 사용하고...
ㆍ 내부 성능에선 차이가 없기 때문에 선호하는 스타일, 팀에 맞게 사용하자
▶ 번외
1. 포인터로 사용하던 것을 참조로 넘겨주기
void PrintInfoPtr(StatInfo* info)
void PrintInfoRef(StatInfo& info)
StatInfo& test = *pointer; //이 과정을 스킵한것이 아래에 바로 넣어준거라고 생각하자
PrintInfoByRef(*pointer);
2. 참조로 사용하던 것을 포인터로 넘겨주기
void PrintInfoPtr(StatInfo* info)
void PrintInfoRef(StatInfo& info)
StatInfo* pointer = &ref //이 과정을 스킵한것이 아래에 바로 넣어준거라고 생각하자
PrintInfoByptr(&ref);
'C++프로그래밍 > C 와 C++ 기초실습' 카테고리의 다른 글
다중 포인터 (const char**) 문자열 (1) | 2024.09.18 |
---|---|
배열과 포인터 (문자열) (0) | 2024.09.18 |
참조타입 (0) | 2024.09.18 |
포인터 실습 해보기 (일반return과 포인터를 이용한 원본객체 조정) (0) | 2024.09.17 |
포인터 연산 (0) | 2024.09.17 |