C++에서 선언(Declaration)과 정의(Definition)는 자주 혼동되는 개념입니다. 두 용어의 차이를 명확히 이해하는 것은 C++ 프로그래밍의 기초를 다지는 데 매우 중요합니다.
선언(Declaration)이란?
선언이란 컴파일러에게 프로그램 내의 변수, 사용자 정의 타입 또는 함수에 대한 정보를 알려주는 것을 의미합니다. 구체적으로는 해당 항목의 타입과 크기를 전달하며, 함수 선언의 경우에는 매개변수의 타입과 개수까지 포함됩니다.
핵심 특징은 다음과 같습니다.
- 컴파일러에게 타입, 크기 등의 정보를 제공
- 함수 선언 시 매개변수의 타입과 개수도 함께 전달
- 메모리 공간은 할당되지 않음
정의(Definition)란?
정의는 선언이 수행하는 모든 작업에 더해, 실제로 메모리 공간까지 할당하는 것을 의미합니다. 쉽게 표현하면 다음과 같습니다.
정의(Definition) = 선언(Declaration) + 메모리 공간 할당
선언의 예시
다음은 선언의 대표적인 예시입니다.
extern int a; // 변수 a를 정의 없이 선언
struct _tagExample { int a; int b; }; // 구조체 선언
int myFunc(int a, int b); // 함수 선언extern 키워드를 사용한 첫 번째 예시처럼, 변수를 선언만 하고 정의하지 않으면 컴파일러는 해당 변수가 다른 곳에 정의되어 있다고 인식합니다.
정의의 예시
반면, 다음은 정의의 예시입니다.
int a;
int b = 0;
int myFunc(int a, int b) { return a + b; }
struct _tagExample example;위 코드들은 각각 실제 메모리 공간을 차지합니다. 변수 a와 b는 메모리가 할당되었고, 함수 myFunc는 함수 본문(구현)을 포함하고 있으며, 구조체 변수 example 역시 실제 객체로 메모리에 생성됩니다.
정리
| 구분 | 선언(Declaration) | 정의(Definition) |
|---|---|---|
| 타입·크기 정보 제공 | O | O |
| 메모리 공간 할당 | X | O |
선언은 컴파일러에게 "이런 것이 존재한다"고 알려주는 단계이고, 정의는 실제로 메모리를 확보하여 구현하는 단계입니다. 헤더 파일에는 주로 선언을, 소스 파일에는 정의를 작성하는 것이 C++의 일반적인 관례이며, 이를 통해 여러 파일 간의 중복 정의 문제를 피할 수 있습니다.