다음을 통해 공유


선언 및 정의(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에서 pi(으)로 이름이 지정된 const 변수가 선언되고 초기화되었습니다. 줄 8에서 정수 i이(가) f 함수에서 생성된 값으로 선언되고 초기화됩니다. f 이름은 줄 3의 전달 선언으로 인해 컴파일러에 표시됩니다.

줄 9에서는 C 형식의 obj 변수가 선언됩니다. 그러나 이 선언은 C이(가) 프로그램의 뒷부분까지 선언되지 않고 전달 선언되지 않으므로 오류가 발생합니다. 오류를 해결하려면 main 전에 C의 전체 정의를 이동하거나 전달 선언을 추가할 수 있습니다. 이 동작은 C#과 같은 다른 언어와는 다릅니다. 이러한 언어에서는 원본 파일의 선언 지점 이전에 함수 및 클래스를 사용할 수 있습니다.

줄 10에서는 std::string 형식의 str 변수가 선언됩니다. std::string 이름은 줄 1의 원본 파일에 병합되는 string 헤더 파일에 도입되었기 때문에 표시됩니다. std은(는) string 클래스가 선언되는 네임스페이스입니다.

줄 11에서 j(이)라는 이름이 선언되지 않았기 때문에 오류가 발생합니다. 선언은 JavaScript와 같은 다른 언어와 달리 유형을 제공해야 합니다. 줄 12에서는 auto 키워드가 사용되며, 이 키워드는 초기화된 값에 따라 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 키워드는 다른 이름의 별칭인 새 이름을 선언하는 데 사용됩니다. 예를 들어 std::string 형식은 std::basic_string<char>의 다른 이름입니다. 프로그래머가 실제 이름이 아닌 typedef 이름을 사용하는 이유는 분명합니다. 최신 C++에서는 typedef 키워드보다 using 키워드가 선호되지만, 이미 선언되고 정의된 엔티티에 대해 새 이름을 선언한다는 개념은 동일합니다.

정적 클래스 멤버

정적 클래스 데이터 멤버는 클래스의 모든 개체에서 공유하는 불연속 변수입니다. 공유되므로 클래스 정의 외부에서 정의하고 초기화해야 합니다. 자세한 내용은 클래스를 참조하세요.

extern 선언

C++ 프로그램은 둘 이상의 컴파일 단위를 포함할 수 있습니다. 별도의 컴파일 단위에 정의된 엔터티를 선언하려면 extern 키워드를 사용하세요. 선언의 정보는 컴파일러에 충분합니다. 그러나 연결 단계에서 엔티티의 정의를 찾을 수 없는 경우 링커는 오류를 발생시킵니다.

이 섹션의 내용

스토리지 클래스
const
constexpr
extern
Initializers
별칭 및 typedef
using 선언
volatile
decltype
C++의 특성

참고 항목

기본 개념