Declaration vs Definition

justyoon·2023년 3월 23일
0

Common Attr

목록 보기
1/1

이 글에서는 declaration(선언)definition(정의)의 차이점에 대해 정리했습니다.

Declaration(선언)

  • 선언은 변수, 네임스페이스, 함수 및 클래스를 포함하여 프로그램 이름을 지정하는 데 사용됩니다.
  • 이름은 선언될 때까지 프로그램에서 사용할 수 없습니다.
  • 정의와 달리 프로그램 항목은 여러 번 선언할 수 있습니다.
  • 다중 선언은 서로 다른 선언이 동일한 형식으로 이루어진 경우에만 가능합니다.
  • 컴파일러의 관점에서 선언은 프로그램 요소를 가시적으로 만드는 수단입니다.

선언의 조건이 추론되지 않는 상황

  • ❌정적 데이터 멤버(static data member)가 클래스 선언 내에서 선언되면 클래스의 각 개체에 대해 하나의 복사본만 생성하므로 정적 데이터 멤버는 지정된 클래스 유형의 개체 요소이다.
  • ❌선언에 typedef 문이 포함된 경우.
  • ❌변수는 초기화 또는 함수 본문 없이 선언되지만 외부 지정을 포함해 다른 기능에 대한 정의를 지정하고 레이블 외부 연결을 제공한다.
  • ❌정의를 포함하지 않고 클래스 선언이 발생하는 경우 (예: class T).

일반적으로 선언은 범위(scope) 내에서 발생하며, 범위는 네이밍된 이름의 가시성(얼마나 눈에 띄는지)과 정의된 개체의 존속을 결정한다.

예를 들면

변수 선언

int a;

변수 이름 a데이터 유형 int 를 포함하는 정보는 컴파일러에 제공되고 기호 테이블이라는 데이터 구조에 저장됩니다. 또한 크기가 2바이트 인 메모리 블록 (컴파일러 유형에 따라 다름)이 할당됩니다.

함수 선언

int add(int a, int b);

여기에서 함수 add는 두 개의 int형 인수 a, bint형 return값 으로 선언된다. 이 시점에서 메모리는 할당되지 않는다.


Definition (정의)

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

profile
with gratitude, optimism is sustainable

0개의 댓글