# 선언과 정의
선언과 정의는 프로그래밍을 하는데 있어서 가장 중요한 개념중에 하나 입니다. 이 둘의 가장 큰 차이점은 컴파일러 단계에서 메모리 할당이 이뤄지느냐의 차이 입니다. 일상생활에서의 예를 들어 보겠습니다.
손님이 음식을 먹기 위해 식당에 들어 왔습니다. 메뉴판에는 여러가지 메뉴들이 있지만 이 메뉴들은 실제로 만들어 진것은 아닙니다. 이걸 선언이라고 합시다.
자 이제 손님이 메뉴판을 보고 실제 음식을 주문을 위해 주문서를 작성했습니다. 이 주문서를 전달받은 요리사는 주문대로 음식을 만들 것입니다.
여기서 “요리사 = 컴파일러 , 주문 = 정의 , 요리 = 메모리 바인딩”으로 이해 하시면 조금 더 쉽게 이해가 될 것입니다.
# 선언
선언은 컴파일러에게 말그대로 변수나 함수, 클래스 등의 존재나 형태를 알리는 것을 의미합니다. 선언은 각 요소의 이름과 타입을 컴파일러에게 알려주기만 할 뿐 실제로 메모리를 할당하거나, 실제 구현을 제공하지는 않습니다. 위의 예에서 음식점의 메뉴판을 떠올리면 이해하기 쉽습니다.
선언의 예를 들어 보겠습니다.
아래의 코드를 보면 컴파일 에러를 발생 시킬것처럼 보이는 기본 자료형 선언의 예를 볼 수 있습니다. 실제로 컴파일 에러를 발생시키지 않습니다.
구조체의 선언도 마찬가지로 기본 자료형의 선언처럼 이해하면 쉽습니다. 구조체 내부가 정의되어 있어 컴파일러에서 메모리를 할당 할 수 있을 것처럼 보이지만 실제로 메모리를 할당하지 하지 않습니다. 구조체의 정의가 없기 때문입니다.
//기본 자료형 선언 예
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