C++ 변수 선언 vs 정의
1. 개요
1.1 문서 개요
이 문서는 C++에서 변수의 **선언(declaration)**과 **정의(definition)**의 차이에 대해 설명합니다. 선언과 정의는 C++ 언어의 컴파일 및 링킹 단계에서 중요한 개념이며, 특히 다중 파일 구조나 헤더 파일을 사용하는 프로젝트에서 혼동되기 쉽습니다. 본 문서에서는 두 개념의 차이, 동작 방식, 예제 및 키워드와의 연관성을 정리합니다.
2. 내용
2.1 선언(Declaration)과 정의(Definition)의 기본 개념
2.1.1 선언이란?
선언은 변수나 함수의 이름과 타입 정보만을 컴파일러에 알리는 작업을 의미합니다. 선언은 컴파일러에게 해당 식별자가 존재한다는 것을 알려주지만, 메모리를 할당하지는 않습니다.
예시:
extern int count;
이 문장은 count
라는 이름의 정수형 변수가 다른 곳에 정의되어 있음을 나타내며, 컴파일 시 해당 이름이 존재함을 인식시킵니다.
2.1.2 정의란?
정의는 선언의 의미를 포함하면서, 변수나 함수에 대한 실제 메모리 공간을 할당하는 작업입니다. 따라서 정의는 선언의 상위 개념입니다.
예시:
int count = 10;
이 문장은 count
라는 정수형 변수에 실제 메모리를 할당하고 초기화까지 수행합니다.
2.2 선언과 정의의 구분 기준
2.2.1 컴파일러와 링커 관점에서의 차이
- 컴파일러는 선언만으로도 코드를 분석할 수 있으나, 정의가 없으면 링커 단계에서 undefined symbol 에러가 발생합니다.
- 변수나 함수가 한 번만 정의되고 여러 번 선언될 수 있습니다.
2.2.2 extern
키워드를 통한 구분
extern
키워드는 선언을 명시적으로 나타내기 위해 사용됩니다. 초기화가 없는 extern
문은 선언이며, 초기화가 포함된 경우에는 정의로 간주됩니다.
예시:
extern int x; // 선언
extern int y = 5; // 정의
2.2.3 헤더 파일과 소스 파일에서의 위치
- 선언은 보통 **헤더 파일(.h)**에 작성하여 여러 소스 파일에서 참조되도록 합니다.
- 정의는 **단 하나의 소스 파일(.cpp)**에 위치해야 하며, 중복 정의를 방지해야 합니다.
2.3 전역 변수 및 정적 변수에서의 선언과 정의
2.3.1 전역 변수
전역 변수는 여러 파일에서 접근 가능하므로, 선언과 정의를 분리하여 사용해야 합니다.
// file1.cpp
int global_value = 42; // 정의
// file2.cpp
extern int global_value; // 선언
2.3.2 정적 변수
정적 변수(static)는 선언과 정의를 분리하지 않습니다. 정의된 소스 파일 내부에서만 접근 가능하므로 외부 선언이 불필요합니다.
static int internal_value = 100; // 내부 정적 변수 정의
2.4 예제: 다중 파일 구조에서의 적용
2.4.1 구조
main.cpp
counter.h
counter.cpp
counter.h
#ifndef COUNTER_H
#define COUNTER_H
extern int counter;
void increment();
#endif
counter.cpp
#include "counter.h"
int counter = 0; // 정의
void increment() {
counter++;
}
main.cpp
#include "counter.h"
#include <iostream>
int main() {
increment();
std::cout << counter << std::endl;
return 0;
}
이 구조에서 counter
는 counter.cpp
에서 정의되고, 다른 파일에서는 extern
선언을 통해 참조됩니다.
3. 마무리
C++에서 변수의 선언과 정의는 컴파일러와 링커의 동작 방식에 밀접한 영향을 미칩니다. 선언은 식별자의 존재만 알리는 역할을 하며, 정의는 메모리를 할당하는 구체적인 구현을 의미합니다. extern
키워드는 선언과 정의를 구분하는 데 주요한 역할을 하며, 다중 파일 프로젝트에서는 헤더 파일과 소스 파일 간의 구분이 필수적입니다. 이러한 구조적 구분을 통해 컴파일 타임 오류를 방지하고, 명확한 프로그램 구성이 가능해집니다.