이 글에서는
declaration(선언)
과definition(정의)
의 차이점에 대해 정리했습니다.
선언
은 변수, 네임스페이스, 함수 및 클래스를 포함하여 프로그램 이름을 지정하는 데 사용됩니다.다중 선언
은 서로 다른 선언이 동일한 형식으로 이루어진 경우에만 가능합니다. 일반적으로 선언은 범위(scope) 내에서 발생
하며, 범위는 네이밍된 이름의 가시성(얼마나 눈에 띄는지)과 정의된 개체의 존속을 결정
한다.
예를 들면
int a;
변수 이름 a
및 데이터 유형 int
를 포함하는 정보는 컴파일러에 제공되고 기호 테이블이라는 데이터 구조에 저장됩니다. 또한 크기가 2바이트 인 메모리 블록 (컴파일러 유형에 따라 다름)이 할당됩니다.
int add(int a, int b);
여기에서 함수 add는 두 개의 int형 인수 a, b
와 int형 return값
으로 선언된다. 이 시점에서 메모리는 할당되지 않는다.
def
또는 definition은 함수, 클래스, 변수 등과 연결된 코드 또는 데이터를 식별
한다. 컴파일러는 정의된 개체에 대한 저장 공간을 할당하기 위해 정의를 필요로 한다. 변수가 정의되면 여러 바이트의 형태로 메모리를 차지한다. 함수 정의는 함수에 대한 코드를 생성한다. 정의는 프로그램 요소의 특정한 specification(명세)이므로 프로그램 안에서 한 번만 프로그램 요소를 정의할 수 있다. 선언과 정의 사이의 연결관계는 1:N(일대다)일 수 있다.
어떤 경우에는 함수가 호출되지 않거나 선언되었음에도 불구하고 해당 주소가 사용되지 않는 경우와 같이 프로그램 요소가 정의되지 않았지만 선언되어야 한다. 또 다른 예는 클래스 정의를 선언해야 하는데도 활용하지 않는 경우이다.
예를들면
int a = 10;
10 의 값을 포함하는 정수 값을 갖는다.
int add (int a, int b) { int z; z = a + b; return z; }
여기서 메모리는 이 함수의 정의에서 add 함수에 할당됩니다. 변수나 함수는 여러번 선언될 수 있지만 한 번만 정의할 수 있다.
선언 프로세스는 프로그램 요소를 컴파일러에 표시할 뿐
메모리 할당을 필요로 하지 않는다.
반대로 정의는 저장을 준비하는 선언
이다. 즉, 컴파일러는 정의된 항목에 대한 메모리 공간을 보존한다.
reference
https://learn.microsoft.com/en-us/cpp/cpp/declarations-and-definitions-cpp?view=msvc-170
https://www.javatpoint.com/difference-between-declaration-and-definition