콘텐츠로 이동

비멤버, 정적 멤버, 전역 함수 (Nonmember, Static Member, and Global Functions)

비멤버 함수는 네임스페이스 안에 두는 것을 선호하세요. 완전한 전역 함수는 되도록 쓰지 마세요. 단지 정적 멤버를 묶기 위해 클래스를 만들지 마세요. 클래스의 정적 메서드는 일반적으로 클래스의 인스턴스나 클래스의 정적 데이터와 밀접하게 관련되어야 합니다.

비멤버 함수와 정적 멤버 함수는 상황에 따라 유용할 수 있습니다. 비멤버 함수를 네임스페이스에 두면 전역 네임스페이스를 오염시키지 않을 수 있습니다.

비멤버 함수와 정적 멤버 함수는, 특히 외부 리소스에 접근하거나 상당한 의존성을 가질 경우, 새 클래스의 멤버로 두는 편이 더 적절할 수 있습니다.

때로는 클래스 인스턴스에 묶이지 않은 함수를 정의하는 것이 유용합니다. 이런 함수는 정적 멤버일 수도, 비멤버 함수일 수도 있습니다. 비멤버 함수는 외부 변수에 의존해서는 안 되며 거의 항상 네임스페이스 안에 있어야 합니다. 정적 멤버를 묶기 위한 목적만으로 클래스를 만들지 마세요. 그것은 이름에 공통 접두사를 붙이는 것과 다를 바 없고, 그런 묶음은 대개 불필요합니다.

비멤버 함수를 정의하는데 그 함수가 .cc 파일에서만 필요하다면, 내부 연결을 사용해 범위를 제한하세요.


이해하기 쉽게 설명하기

핵심: "정적 멤버 묶음 클래스"를 만들지 말 것

여러 유틸리티 함수를 한곳에 모으고 싶을 때, 모든 함수를 static으로 가진 클래스를 만들고 싶은 유혹이 있습니다. 하지만 이는 이름에 접두사를 붙이는 것과 다를 바 없으며, 인스턴스를 만들 수도 없는 "껍데기 클래스"만 늘립니다. 대신 네임스페이스 + 비멤버 함수를 쓰세요.

// 나쁜 예: 정적 멤버만 모은 클래스
class StringUtil {
 public:
  static std::string Trim(const std::string& s);
  static std::string ToUpper(const std::string& s);
};

// 좋은 예: 네임스페이스 안의 비멤버 함수
namespace string_util {
std::string Trim(const std::string& s);
std::string ToUpper(const std::string& s);
}  // namespace string_util

언제 정적 멤버가 맞는가?

정적 메서드가 그 클래스의 인스턴스나 정적 데이터와 밀접하게 관련될 때만 정적 멤버로 두세요. 무관한 함수라면 비멤버가 맞습니다.

언제 새 클래스의 멤버가 더 나은가?

함수가 외부 리소스에 접근하거나 의존성이 많다면, 자유 함수보다 그 의존성을 담는 새 클래스의 멤버로 만드는 편이 테스트와 관리에 유리할 수 있습니다.

범위 제한

비멤버 함수가 한 .cc 파일에서만 쓰인다면 이름 없는 네임스페이스(내부 연결)에 넣어 외부에 노출하지 마세요.