reference와 pointer는 각각 어떤 때 쓰나요?


referencepointer를 어떻게 쓰는 건지는 알고 있습니다. 제가 알고 싶은 건 referencepointer를 쓰는 것 중 어느 것이 더 적절한지입니다.

어떤 경우에는 이게 정해져 있는데(++ 연산자는 reference만 쓰는 등) 안 정해져 있는 경우 보통은 변수가 중간에 바뀌는 경우는 보통 다들 포인터를 쓰더라구요.

소스코드

void add_one(int& n) { n += 1; }
void add_one(int* const n) { *n += 1; }
int main() {
  int a = 0;
  add_one(a); // a가 바뀌는지 안 바뀌는지 모름. a = a+1일 수도 있지만 a+1이 return될 수도?
  add_one(&a); // a가 바뀔 것이라 예상 됨
}

레퍼런스를 쓰는 것 보다 포인터를 쓰는 게 지금 뭘 하고 있는 건지 확실하게 알 수 있으니까 뭘 하는지 분명하게 전달하려면 레퍼런스보다 포인터를 쓰는 게 더 나은 방법인가요? 그러면 레퍼런스는 정말 필요할 때만(++연산자) 써야 하나요?

  • 2016년 01월 13일에 작성됨

조회수 315


1 답변


좋아요
0
싫어요
채택취소하기

포인터는 가급적이면 안 쓰는 것이 좋습니다.

포인터를 쓰면 코드를 읽는 것도 따라가기도 힘들어집니다. 이런 코드는 안전하지 않습니다. 나중에 예기치 못한 상황이 발생할 수 있으니까요.

그러니 제일 좋은 방법은 다른 방법이 없겠다 싶을 때에만 포인터를 쓰는 겁니다. 예를 들어, 함수가 nullptr을 return할 수 있는 경우에는 포인터를 return해야만 합니다.

질문하신 코드에서는 다음과 같은 이유로 pointer를 쓸 필요가 없습니다. pointer를 인자 값으로 받는다는 뜻은 nullptr을 인자로 받을 수 있고, nullptr에서도 함수가 잘 작동한다는 뜻으로 받아들여집니다.

그런데 질문하신 코드에서는

  1. null pointer을 인자로 넘기면 undefined-behaviour인 반면
  2. reference는 1의 상황을 허용하지 않음
  3. reference를 쓰는 경우가 유저에게 더 이해하기 쉬움 - 유저에게 null이 아닌 object만을 써야 한다는 걸 알려줌

이므로 reference를 쓰는 게 좋습니다.

  • 2016년 01월 13일에 작성됨

로그인이 필요한 기능입니다.

Hashcode는 개발자들을 위한 무료 QnA사이트 입니다. 작성한 답변에 다른 개발자들이 댓글을 작성하거나 좋아요/싫어요를 할 수 있기 때문에 계정을 필요로 합니다.
► 로그인
► 계정만들기
Close