Computer >> 컴퓨터 >  >> 프로그래밍 >> C++

C++에서 선언(Declaration)과 정의(Definition)의 차이점은 무엇일까?

C++에서 선언과 정의의 차이점

C++을 배우다 보면 선언(declaration)정의(definition)를 혼동하는 경우가 매우 많습니다. 두 개념은 비슷해 보이지만, 메모리 할당 여부라는 결정적인 차이가 있습니다. 이 글에서는 두 개념의 차이를 명확하게 정리하고, 예제 코드를 통해 쉽게 이해할 수 있도록 설명합니다.

선언(Declaration)이란?

선언이란 컴파일러에게 프로그램 내에서 사용되는 변수, 사용자 정의 타입 또는 함수의 존재와 타입, 크기를 알려주는 것입니다. 함수 선언의 경우에는 매개변수의 타입과 개수 정보도 함께 포함됩니다.

핵심은 선언만으로는 메모리 공간이 예약되지 않는다는 점입니다. 즉, 컴파일러에게 "이런 이름의 변수나 함수가 있다"고 알려주기만 할 뿐, 실제 저장 공간은 만들어지지 않습니다.

정의(Definition)란?

정의는 선언이 수행하는 모든 작업에 더해, 실제로 메모리 공간을 예약(할당)하는 것까지 포함합니다. 따라서 다음과 같이 표현할 수 있습니다.

정의 = 선언 + 메모리 공간 예약

선언의 예시

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;

위 코드들은 모두 실제 메모리 공간을 확보하거나 함수의 본체(구현부)를 제공하기 때문에 정의에 해당합니다.

알아두면 좋은 점

같은 변수나 함수는 프로그램 전체에서 여러 번 선언될 수 있지만, 정의는 반드시 한 번만 존재해야 합니다. 이 규칙을 ODR(One Definition Rule, 단일 정의 규칙)이라고 부르며, 이를 위반하면 링크 오류가 발생합니다.