라이프로그


선언(Declaration)과 정의(Definition) C++(VC++)

대부분의 개발자들이 선언과 정의를 혼용해서 사용한다. 그리고 이 둘의 차이를 분명히 이해하지 못하고 사용하는 경우가 많다.
어쩌면 대부분의 개발자가 아니라 나만 그렇게 했을지모르지만....

선언과 정의의 차이점은 메모리의 할당 유무이다.

선언(Declaration)
  • 컴파일러에게 대상에 대한 정보를 알린다.
  • 실제 내용을 할당하지 않으므로 메모리를 사용하지 않는다.

정의(Definition)
  • 컴파일러에게 대상의 실제 내용을 생성하게한다.
  • 실제 내용을 생성하고 할당하므로 메모리를 사용한다.

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

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

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

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

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

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

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

- #define SUM(a, b) (a + b);
매크로의 경우도 실제 메모리를 할당하는 것은 아니므로 선언이다. 
  



덧글

댓글 입력 영역