아래는 **“이번 주의 팁 #234: 값, 포인터, 참조로 전달하기”**에 대한 한글 번역입니다.


제목: “이번 주의 팁 #234: 값, 포인터, 참조로 전달하기”

원문 게시일: 2024년 8월 29일
업데이트: 2024년 9월 30일

작성자: Steve Wang

빠른 링크: abseil.io/tips/234


개요

C++는 함수의 입력 인자를 전달하는 다양한 방식을 제공합니다:

이 팁에서는 입력 전용 함수 인자를 전달하는 방법과 각각의 장단점을 살펴보며, 적절한 사용 지침을 제공합니다.


1. 값으로 전달

값으로 전달하면 함수는 인자의 복사본을 받으며, 호출자의 원본 객체에는 영향을 주지 않습니다. 그러나 함수 내에서 복사본의 메서드를 호출하면 객체의 내부 상태를 변경할 수 있습니다.

CPP
void AddOneToValue(int x) {
  ++x;
}

int x = 5;
AddOneToValue(x);
// x는 여전히 5입니다.
클릭하여 더 보기

값으로 전달은 다음과 같은 상황에서 유용합니다:

  1. 작고 간단한 타입: 복사 비용이 낮은 경우.
  2. 독점 소유권 필요: 함수가 복사본의 소유권을 가져야 하는 경우.

값으로 전달은 스택에 저장된 값(레지스터를 사용하는 경우 포함)에 대해 더 효율적일 수 있습니다. 예를 들어, 정수와 같은 작은 타입은 레지스터를 통해 전달됩니다.


2. 참조로 전달

참조로 전달하면 함수가 호출자의 객체를 참조하므로, 함수 내부에서 객체를 수정할 수 있습니다. const 키워드를 사용해 객체를 읽기 전용으로 보호할 수도 있습니다.

CPP
void AddOneToReference(int& x) {
  ++x;
}

int x = 5;
AddOneToReference(x);
// x는 6이 됩니다.
클릭하여 더 보기

참조로 전달은 다음과 같은 상황에서 유용합니다:

  1. 객체를 복사하는 비용이 큰 경우.
  2. 호출자와 동일한 객체를 참조해야 하는 경우.

그러나 참조로 전달은 별칭(aliasing) 문제를 일으킬 수 있습니다. 함수 호출 중 객체 상태가 외부에서 변경될 수 있기 때문입니다.


3. 포인터로 전달

포인터로 전달은 참조로 전달과 유사하지만, null 포인터를 사용해 “값이 없음” 상태를 나타낼 수 있다는 점이 다릅니다.

CPP
void AddOneToPointee(int* x) {
  ++(*x);
}

int x = 5;
AddOneToPointee(&x);
// x는 6이 됩니다.
클릭하여 더 보기

포인터 전달은 선택적 인자(optional parameter)에 적합하며, 값이 없음을 명시적으로 나타내야 할 때 유용합니다.


사용 지침

값으로 전달

값으로 전달은 다음과 같은 경우 권장됩니다:

특히 std::vector, std::string과 같은 타입은 값으로 전달하고, 필요 시 호출부에서 std::move를 사용하세요:

CPP
class Foo {
 public:
  Foo(std::vector<int> bar) : bar_(std::move(bar)) {}
 private:
  std::vector<int> bar_;
};
클릭하여 더 보기

참조 또는 포인터로 전달

참조 또는 포인터로 전달은 다음과 같은 경우 적합합니다:

선택적 인자는 포인터를 사용해 null 상태를 명시적으로 처리하는 것이 좋습니다.


뷰(View) 타입으로 전달

뷰 타입(예: absl::string_view, absl::Span<const T>)은 읽기 전용 데이터에 적합합니다:


요약

기본적으로 const&를 사용하되, 성능 프로파일링을 통해 필요한 경우 지침에서 벗어나는 것도 가능합니다.

라이선스

저작자: Jaehun Ryu

링크: https://jaehun.me/posts/abseil-tip-234-%EA%B0%92-%ED%8F%AC%EC%9D%B8%ED%84%B0-%EC%B0%B8%EC%A1%B0%EB%A1%9C-%EC%A0%84%EB%8B%AC%ED%95%98%EA%B8%B0/

라이선스: CC BY 4.0

이 저작물은 크리에이티브 커먼즈 저작자표시 4.0 국제 라이선스에 따라 이용할 수 있습니다. 출처를 밝히면 상업적 목적을 포함해 자유롭게 이용 가능합니다.

댓글

검색 시작

검색어를 입력하세요

↑↓
ESC
⌘K 단축키