Computer >> 컴퓨터 >  >> 프로그래밍 >> C++

C/C++ 상수 정의 방식 비교: 열거형(enum) vs const vs #define

C나 C++ 프로그램에서 상수를 정의하는 방법은 크게 세 가지입니다. 바로 #define 매크로, const 키워드, 그리고 열거형(enum)입니다. 이 세 가지는 모두 상수 값을 다루지만 내부 동작 방식과 특성이 서로 다르기 때문에, 어떤 것을 선택해야 할지 혼란스러울 때가 많습니다. 지금부터 각각의 개념과 차이점을 예제와 함께 자세히 살펴보겠습니다.

const와 static const

const는 변경할 수 없는 상수 타입 데이터를 선언할 때 사용합니다. 컴파일러가 타입 검사를 수행하므로 타입 안정성이 보장되며, 한 번 초기화된 값은 프로그램 실행 중에 절대 변경할 수 없습니다.

static const는 여기에 static 저장소 클래스 지정자가 추가된 형태입니다. static이 붙으면 해당 변수의 수명이 프로그램 종료 시점까지 유지되며, 동시에 const이므로 값 역시 갱신할 수 없습니다.

예제 코드

#include <iostream>
using namespace std;

int main() {
    const int MAX_VALUE = 100;
    cout << "MAX_VALUE: " << MAX_VALUE << endl;

    // MAX_VALUE = 200; // 컴파일 오류! const 변수는 수정 불가
    return 0;
}

출력 결과

MAX_VALUE: 100

#define (매크로 상수)

#define은 전처리기(preprocessor) 단계에서 단순 텍스트 치환을 수행합니다. 컴파일이 시작되기 전에 해당 이름이 정의된 값으로 그대로 대체되기 때문에 타입 검사가 이루어지지 않고, 디버거에서도 심볼로 확인하기 어렵습니다.

예제 코드

#include <iostream>
#define PI 3.14159
using namespace std;

int main() {
    float radius = 5.0f;
    cout << "원의 넓이: " << PI * radius * radius << endl;
    return 0;
}

출력 결과

원의 넓이: 78.5397

열거형(enum)

enum은 서로 관련된 정수 상수들을 하나의 이름 아래 묶어 관리할 수 있는 사용자 정의 타입입니다. 주로 상태(state)나 옵션처럼 의미 있는 이름을 가진 정수 집합을 표현할 때 매우 유용합니다.

예제 코드

#include <iostream>
using namespace std;

enum Color { RED, GREEN, BLUE };

int main() {
    Color c = GREEN;
    cout << "GREEN의 값: " << c << endl; // 1 출력
    return 0;
}

출력 결과

GREEN의 값: 1

세 가지 방식의 비교

구분#defineconstenum
타입 검사없음있음있음
디버깅불가(치환됨)가능가능
스코프(scope)정의 위치부터 파일 끝까지선언된 스코프를 따름선언된 스코프를 따름
메모리 할당일반적으로 없음있음컴파일러에 따라 다름
주요 용도단순 매크로 치환타입이 있는 상수연관 정수 상수 그룹화

결론

C++에서는 타입 안정성과 디버깅 편의성 때문에 #define보다 const(또는 C++11의 constexpr)를 사용하는 것이 권장됩니다. 연관된 정수 상수들을 표현할 때는 enum, 특히 C++11에서 도입된 enum class가 가장 적합합니다. #define은 조건부 컴파일 등 전처리 기능이 반드시 필요한 경우에만 제한적으로 사용하는 것이 좋습니다.