콘텐츠로 이동

입력과 출력 (Inputs and Outputs)

C++ 함수의 출력은 자연스럽게 반환 값을 통해 제공되며 때로는 출력 매개변수(또는 in/out 매개변수)를 통해 제공됩니다.

출력 매개변수보다 반환 값을 사용하는 것이 좋습니다. 가독성이 향상되고 종종 동일하거나 더 나은 성능을 제공합니다. TotW #176을 참조하세요.

값으로 반환하는 것을 선호하고, 그렇지 않은 경우 참조로 반환합니다. null이 될 수 없는 한 원시 포인터를 반환하지 마세요.

매개변수는 함수에 대한 입력이거나 함수의 출력이거나 둘 다입니다. 선택사항이 아닌 입력 매개변수는 일반적으로 값 또는 const 참조여야 하며, 선택사항이 아닌 출력 및 입력/출력 매개변수는 일반적으로 참조(null일 수 없음)여야 합니다. 일반적으로 선택적 값 입력을 나타내려면 std::optional을 사용하고, 선택적이 아닌 형태가 참조를 쓰는 경우 const 포인터를 사용합니다. 선택적 출력과 선택적 입력/출력 매개변수를 나타내려면 const가 아닌 포인터를 사용하십시오.

호출보다 오래 지속되도록 참조 매개변수가 필요한 함수를 정의하지 마세요. 어떤 경우에는 참조 매개변수가 임시 매개변수에 바인딩되어 수명 버그가 발생할 수 있습니다. 대신 수명 요구 사항을 제거하는 방법(예: 매개 변수 복사)을 찾거나 유지된 매개 변수를 포인터로 전달하고 수명 및 null이 아닌 요구 사항을 문서화하세요. 자세한 내용은 TotW 116을 참조하세요.

함수 매개변수를 주문할 때 모든 입력 전용 매개변수를 출력 매개변수 앞에 놓으십시오. 특히 새 매개변수라는 이유만으로 함수 끝에 새 매개변수를 추가하지 마세요. 출력 매개변수 앞에 새 입력 전용 매개변수를 배치합니다. 이것은 엄격하고 빠른 규칙이 아닙니다. 입력이자 출력인 매개변수는 물을 흐리며 항상 그렇듯이 관련 기능과의 일관성을 유지하려면 규칙을 구부려야 할 수도 있습니다. Variadic 함수에는 특이한 매개변수 순서가 필요할 수도 있습니다.


이해하기 쉽게 설명하기

핵심: 출력은 반환값으로, 입력은 값/const 참조로

함수의 출력은 가능하면 반환값으로 내보내세요. 출력 매개변수(out-parameter)보다 가독성이 좋고 성능도 같거나 낫습니다.

매개변수 규칙

종류 권장 형태
필수 입력 값 또는 const T&
필수 출력 / 입출력 참조 T& (null 불가)
선택적 값 입력 std::optional<T>
선택적 입력(참조형) const T*
선택적 출력 / 입출력 T* (non-const 포인터)

반환

  • 기본은 값 반환. 그게 안 되면 참조 반환.
  • null이 될 수 있는 게 아니라면 raw 포인터를 반환하지 마세요.

수명(lifetime) 주의

호출보다 오래 살아야 하는 참조 매개변수를 받지 마세요. 참조가 임시 객체에 묶이면 수명 버그가 납니다. 대신 값을 복사하거나, 보관할 인자는 포인터로 받고 수명·non-null 요구사항을 문서화하세요.

매개변수 순서

입력 전용 매개변수를 출력 매개변수 앞에 두세요. 새 매개변수라고 해서 함수 끝에 붙이지 말고, 출력 앞에 입력으로 넣으세요. (단, 엄격한 규칙은 아니며 관련 함수와의 일관성이 우선할 수 있습니다.)