선언 및 정의(C++)
C++ 프로그램은 변수, 함수, 형식 및 네임스페이스와 같은 다양한 엔터티로 구성됩니다. 이러한 각 엔터티를 사용하려면 먼저 선언해야 합니다. 선언은 엔터티의 형식 및 기타 특성에 대한 정보와 함께 엔터티의 고유한 이름을 지정합니다. C++에서 이름이 선언되는 지점은 컴파일러에 표시되는 지점입니다. 컴파일 단위의 일부 이후 지점에서 선언된 함수 또는 클래스를 참조할 수 없습니다. 변수는 사용되는 지점 이전에 가능한 한 가깝게 선언해야 합니다.
다음 예제에서는 몇 가지 선언을 보여 줍니다.
#include <string>
int f(int i); // forward declaration
int main()
{
const double pi = 3.14; //OK
int i = f(2); //OK. f is forward-declared
C obj; // error! C not yet declared.
std::string str; // OK std::string is declared in <string> header
j = 0; // error! No type specified.
auto k = 0; // OK. type inferred as int by compiler.
}
int f(int i)
{
return i + 42;
}
namespace N {
class C{/*...*/};
}
줄 5에서 함수가 main
선언됩니다. 줄 7에서 const
이름이 지정된 pi
변수가 선언되고 초기화됩니다. 8줄에서 정 i
수가 선언되고 함수 f
에서 생성된 값으로 초기화됩니다. f
이름은 줄 3의 전달 선언으로 인해 컴파일러에 표시됩니다.
줄 9에서는 형식 C
의 이름이 지정된 obj
변수가 선언됩니다. 그러나 이 선언은 프로그램의 뒷부분까지 선언되지 않고 앞으로 선언되지 않으므로 오류가 C
발생합니다. 오류를 해결하려면 이전 main
의 C
전체 정의를 이동하거나 정방향 선언을 추가할 수 있습니다. 이 동작은 C#과 같은 다른 언어와 다릅니다. 이러한 언어에서는 소스 파일의 선언 지점 이전에 함수 및 클래스를 사용할 수 있습니다.
줄 10에서는 형식 std::string
이라는 변수 str
가 선언됩니다. 이 이름은 std::string
헤더 파일에 도입되어 string
1줄의 원본 파일에 병합되므로 표시됩니다. std
는 클래스가 string
선언되는 네임스페이스입니다.
11줄에서 이름이 j
선언되지 않았기 때문에 오류가 발생합니다. 선언은 JavaScript와 같은 다른 언어와 달리 형식을 제공해야 합니다. 12 auto
줄에서 키워드(keyword) 사용되며, 컴파일러가 초기화된 값에 따라 형식 k
을 유추하도록 지시합니다. 이 경우 컴파일러는 형식을 int
선택합니다.
선언 범위
선언에 의해 도입된 이름은 선언이 발생하는 범위 내에서 유효합니다. 이전 예제에서 함수 내에 main
선언된 변수는 지역 변수입니다. 전역 범위에서 기본 외부에서 명명된 i
다른 변수를 선언할 수 있으며 별도의 엔터티가 됩니다. 그러나 이러한 이름이 중복되면 프로그래머의 혼란과 오류가 발생할 수 있으므로 피해야 합니다. 줄 21에서 클래스 C
는 네임스페 N
이스의 범위에서 선언됩니다. 네임스페이스를 사용하면 이름 충돌을 방지 할 수 있습니다. 대부분의 C++ 표준 라이브러리 이름은 네임스페이 std
스 내에서 선언됩니다. 범위 규칙이 선언과 상호 작용하는 방법에 대한 자세한 내용은 범위를 참조하세요.
정의
함수, 클래스, 열거형 및 상수 변수를 포함한 일부 엔터티는 정의되고 선언되어야 합니다. 정의는 엔터티가 프로그램의 뒷부분에서 사용될 때 컴퓨터 코드를 생성하는 데 필요한 모든 정보를 컴파일러에 제공합니다. 이전 예제에서 줄 3에는 함수에 대한 선언이 포함되어 있지만 함수 f
에 대한 정의는 15~18줄에 제공됩니다. 21줄에서 클래스 C
는 선언되고 정의됩니다(정의된 대로 클래스는 아무 작업도 수행하지 않음). 상수 변수를 정의해야 합니다. 즉, 값이 선언된 것과 동일한 문에 값을 할당해야 합니다. 컴파일러가 할당할 공간을 알고 있으므로 기본 제공 형식의 선언(예: int
자동으로 정의)입니다.
다음 예제에서는 정의인 선언도 보여 줍니다.
// Declare and define int variables i and j.
int i;
int j = 10;
// Declare enumeration suits.
enum suits { Spades = 1, Clubs, Hearts, Diamonds };
// Declare class CheckBox.
class CheckBox : public Control
{
public:
Boolean IsChecked();
virtual int ChangeState() = 0;
};
정의가 아닌 몇 가지 선언은 다음과 같습니다.
extern int i;
char *strchr( const char *Str, const char Target );
Typedefs 및 using 문
이전 버전의 C++typedef
에서는 키워드(keyword) 다른 이름의 별칭인 새 이름을 선언하는 데 사용됩니다. 예를 들어 형식 std::string
은 .의 다른 이름 std::basic_string<char>
입니다. 프로그래머가 실제 이름이 아닌 typedef 이름을 사용하는 이유는 분명합니다. 최신 C++using
에서는 키워드(keyword) 선호typedef
되지만 아이디어는 동일합니다. 이미 선언되고 정의된 엔터티에 대해 새 이름이 선언됩니다.
정적 클래스 멤버
정적 클래스 데이터 멤버는 클래스의 모든 개체에서 공유하는 불연속 변수입니다. 공유되므로 클래스 정의 외부에서 정의하고 초기화해야 합니다. 자세한 내용은 클래스를 참조 하세요.
extern 선언
C++ 프로그램에는 둘 이상의 컴파일 단위가 포함될 수 있습니다. 별도의 컴파일 단위에 정의된 엔터티를 선언하려면 키워드(keyword) 사용합니다 extern
. 선언의 정보는 컴파일러에 충분합니다. 그러나 연결 단계에서 엔터티의 정의를 찾을 수 없는 경우 링커에서 오류가 발생합니다.
이 섹션의 내용
스토리지 클래스
const
constexpr
extern
Initializers
별칭 및 typedef
using
선언
volatile
decltype
C++의 특성
참고 항목
피드백
https://aka.ms/ContentUserFeedback
출시 예정: 2024년 내내 콘텐츠에 대한 피드백 메커니즘으로 GitHub 문제를 단계적으로 폐지하고 이를 새로운 피드백 시스템으로 바꿀 예정입니다. 자세한 내용은 다음을 참조하세요.다음에 대한 사용자 의견 제출 및 보기