# 선언과 정의

선언과 정의는 프로그래밍을 하는데 있어서 가장 중요한 개념중에 하나 입니다. 이 둘의 가장 큰 차이점은 컴파일러 단계에서 메모리 할당이 이뤄지느냐의 차이 입니다. 일상생활에서의 예를 들어 보겠습니다.

손님이 음식을 먹기 위해 식당에 들어 왔습니다. 메뉴판에는 여러가지 메뉴들이 있지만 이 메뉴들은 실제로 만들어 진것은 아닙니다. 이걸 선언이라고 합시다.

자 이제 손님이 메뉴판을 보고 실제 음식을 주문을 위해 주문서를 작성했습니다. 이 주문서를 전달받은 요리사는 주문대로 음식을 만들 것입니다.

여기서 “요리사 = 컴파일러 , 주문 = 정의 , 요리 = 메모리 바인딩”으로 이해 하시면 조금 더 쉽게 이해가 될 것입니다.

선언과 정의의 개념 비교

# 선언

선언은 컴파일러에게 말그대로 변수나 함수, 클래스 등의 존재나 형태를 알리는 것을 의미합니다. 선언은 각 요소의 이름과 타입을 컴파일러에게 알려주기만 할 뿐 실제로 메모리를 할당하거나, 실제 구현을 제공하지는 않습니다. 위의 예에서 음식점의 메뉴판을 떠올리면 이해하기 쉽습니다.

선언의 예를 들어 보겠습니다.

아래의 코드를 보면 컴파일 에러를 발생 시킬것처럼 보이는 기본 자료형 선언의 예를 볼 수 있습니다. 실제로 컴파일 에러를 발생시키지 않습니다.

구조체의 선언도 마찬가지로 기본 자료형의 선언처럼 이해하면 쉽습니다. 구조체 내부가 정의되어 있어 컴파일러에서 메모리를 할당 할 수 있을 것처럼 보이지만 실제로 메모리를 할당하지 하지 않습니다. 구조체의 정의가 없기 때문입니다.

//기본 자료형 선언 예
int;
double;
char;

//변수 선언
extern int a;  // 외부 변수

//구조체 선언
struct Fruit{  // 구조체 선언만 되었기에 메모리를 할당할 수 없음. 
int id;
int price; 
int stock;
}  

//함수 선언
int add(int a, int b); 

# 정의

선언된 변수, 함수, 클래스등의 각 요소를 실제로 구현 하는 것을 의미 합니다. 컴파일러는 이 때 메모리를 할당하고 값을 할당하거나 함수의 실제 동작을 구현합니다.

정의의 예를 들어 보겠습니다.

아래의 코드에서 컴파일러는 실제로 메모리를 할당합니다. 메모리를 할당하려면 해당 자료형의 메모리의 크기를 알아야 합니다. 만약 메모리의 크기를 알 수 없다면 컴파일러는 오류를 발생 시킬 것입니다.

기본 자료형은 각각의 메모리 크기 만큼 그리고 구조체는 구조체 내부의 자료형 크기의 합만큼 컴파일러는 메모리를 할당합니다. 그리고 함수의 정의에서 사용되는 변수도 마찬가지입니다.

//변수 정의
int a; //값을 할당하지 않아도 변수 정의에 해당
int a = 10;  

//구조체 정의
struct Fruit fruit; 

//함수 정의
int add(int a, int b) 
{
  int c = a+b;
  return c;
}

Leave a comment