선언/정의 이의제기
(2003-08-11 15:30 작성)

선언은.. 컴파일러에게 어떤 대상의 이름을 알려주는 행위입니다. 영어로는 declaration 입니다.
정의는.. 컴파일러에게 어떤 대상의 실제 내용을 알려주는 행위입니다. 영어로는 definition입니다.

선언과 정의를 구분하는 한가지 기준은 memory address binding의 유무를 기준으로 구분합니다.
즉, 어떤 대상의 이름에 대해 그에 대응하는 메모리 상의 주소가 정해진다면 그것은 정의이며, 그렇지 않고 이름만 알려준다면 그것은 선언입니다.
다음의 예를 살펴보죠.

1) int x;
x라는 이름의 변수를 선언했습니다. 이는 x라는 변수의 이름과 함께 이 변수가 위치할 메모리 역시 할당할 필요가 있으므로 변수를 선언함과 동시에 변수를 정의한 경우가 되겠습니다. 이 예에서 알 수 있듯이, 대부분의 변수 선언은 정의와 함께 이루어집니다.

2) extern int x;
x라는 이름의 외부 변수를 선언했습니다. 이때, 외부 변수는 다른 모듈에서 정의된 변수를 이름만 임포트해서 사용하는 것으로 이 문장에서 변수를 위한 메모리 할당은 일어나지 않으며, 다른 모듈에서 메모리가 할당된 변수의 이름만 사용할 것을 선언한 것입니다. 이는 변수 선언이지만 정의는 일어나지 않고 선언만 한 경우가 되겠습니다.

3) int x();
함수의 프로토타입 선언입니다. 프로토타입 선언은 함수의 이름만 컴파일러에게 알려주는 행위로 실제로 함수가 수행할 내용이 어디에 들어가 있는지 컴파일러는 알지 못합니다. 나중에 링크 과정에서 실제로 이 함수가 수행할 내용이 들어있는 메모리상의 주소에 바인딩되게 됩니다. 즉, 실제 주소 바인딩이 일어나지 않으므로 이는 선언입니다.

4) int x() { return 0; }
함수의 본체를 정의했습니다. 이는 컴파일러가 실제로 함수가 수행할 내용을 메모리 어딘가에 저장하게 하는 문장입니다. 즉, 함수를 호출했을 때 메모리에 저장된 수행 내용을 찾아 점프해야 하므로 x라는 이름에 대해 그에 대응하는 주소가 정해집니다. 선언과 동시에 정의가 이루어진 예 입니다.

5) struct x;
구조체의 이름만 선언했습니다. 구조체의 내용에 대한 언급없이 이름만 컴파일러에게 알려주는 행위로 선언입니다.

6) struct x { int i; };
구조체의 내용을 정의했습니다. 구조체가 구조체 변수로 인스턴스화 할때 어떻게 메모리가 배치될 지를 알려주는 문장으로 선언과 동시에 정의하는 문장입니다.

7) typedef int INT;
타입 이름만 선언한 것으로 당연히 정의 없는 선언입니다. 타입 이름 자체가 메모리에 바인딩 될 수는 없습니다.


선언/정의의 구분은 메모리 배치의 유무를 보시면 됩니다

+ Recent posts