다음 예시 에서 30으로 변경된 값은?
int a = 10;
int& ref = a;
ref = 30;
ref 일까?
아니다. 답은 a 이다.
여기서 차이점 1. reference는 초기화 후 가리키는 대상을 변경 할 수 없다
위는 포인터라면 변경 가능하다
int b = 10;
int* b_ptr = &b;
*b_ptr = 30;
Reference는 초기화 후 대상을 변경 할 수 없다.
여기서 차이점 2. 초기화 시 무조건 가리키는 대상이 정해져야 한다 가 발생한다.
또한, NULL 값을 넣어 초기화 하는 것도 불가능하다.
그대신 Referece는 안전성을 갖게 된다. Nullpointer exception 이라던지, delete의 강제성이 없다.
단, 가리키던 객체가 사라지면, reference는 엄한 곳을 가리키게 되니 다음과 같이 로컬 변수의 reference를 반환하는 함수 코드는 작성하지 말자.
#include <iostream>
using namespace std;
int& bar() // local 변수의 reference를 반환하지 않도록 주의
{
int n = 10;
return n; // n은 stack에 있다가 bar() 끝나는 시점 사라짐
}
int main() {
int& i = bar(); // bar()의 반환값은 이미 사라진 stack 변수를 가리키는 reference 다
cout<<i<<endl; // segfault
return 0;
}
반면, Pointer는 유연성의 장점이 있다.
pointer는 null 값으로 초기화가 가능하다
int* ptr = nullptr;
단, 다음과 같은 단점도 있다.
*ptr = 5; // 단, null 초기화 이후 사용 시 할당은 필수다
delete ptr; // 그리고, 꼭 메모리 해제를 잊지 않아야 한다
다음 글에서 좀 더 언제 pointer를 쓰고, 언제 reference를 쓸지 알아보자
'C++' 카테고리의 다른 글
C++ 면접 질문) "어떤 때 reference 쓰고 어떤 때 value를 써야 할까요?" (0) | 2025.01.07 |
---|---|
C++ 면접 질문) "언제 Reference를 쓰고 언제 Pointer를 써야 할까요?" (0) | 2025.01.06 |
C++ 면접 질문) delete[] 를 통해 얼마나 해제 할지 알 수 있는 이유는? (0) | 2025.01.06 |
C++) 함수를 static으로 선언 declare 한다는 것 (0) | 2020.10.15 |
C++) check whether file exists 파일 존재 여부 확인 [access(2)] (0) | 2020.10.14 |