[C] 상수 선언

JOOYEUN SEO·2023년 9월 4일

C 언어

목록 보기
11/13
post-thumbnail

상수는 값이 한 번 정해지면 바꿀 수 없는 수로, 변수와 반대되는 개념이다. 상수를 선언하는 방법에는 3가지가 있다.

1. const 한정어

한 번 초기화를 통해서 값을 정한 후에는 변수의 값을 수정할 수 없도록 제한(변수를 상수화시킴)

⌨️ 예제

#include <stdio.h>

int main() {
    const float PI = 3.14159;   // pi를 '변수 상수'로 선언
    printf("π = %.2f\n", PI);
    printf("&PI = %p\n", &PI);  // 실제로 기억공간에 저장된다는 것을 확인
}

🖥️ 실행 결과

π = 3.14
&PI = 0x7ff7bfbb82fc

PI는 변수이지만, const 키워드 때문에 상수의 성격을 갖게 됐으므로 변수 상수가 됐다.
메모리 상에 직접 저장되는 방법이므로 주소값을 불러올 수 있다.


2. 매크로 상수

'3.14'처럼 자주 사용되는 특정 상수가 있을 경우 매번 숫자를 쓰는 대신 "PI"처럼 알아보기 쉬운 이름으로 치환할 수 있다.

⌨️ 예제

#include <stdio.h>

#define PI 3.14159  // 매크로 상수 정의

int main() {
    float a = PI;
    printf("π = %.2f\n", PI);
}

🖥️ 실행 결과

π = 3.14

메모리 상에 저장된 것이 아니라 특정 상수를 대표하는 별칭을 붙인 것이기 때문에 주소값은 불러올 수 없다.


3. enum(열거형)

switch문과 열거형을 같이 사용하면 case 값으로 단순히 숫자를 나열하는 것보다 가독성이 좋다.

⌨️ 예제

// 게임의 기본적인 틀의 일부분(열거형 없이 작성)
#include <stdio.h>
#include <stdbool.h>

// 게임의 여러 장면들마다 번호를 매겨서 int형 상수 선언
const int GAMESTATE_MAINMENU = 0;
const int GAMESTATE_PLAYING = 1;
const int GAMESTATE_PAUSED = 2;
const int GAMESTATE_GAMEOVER = 3;

int main() {
    int currState = GAMESTATE_MAINMENU;     // 0에서부터 시작
    while(true) {                           // 무한루프
        switch(currState) {
            case GAMESTATE_MAINMENU :       // 0
                /* 중략 */
                break;
            case GAMESTATE_PLAYING :		// 1
                /* 중략 */
                break;
            case GAMESTATE_PAUSED :			// 2
                /* 중략 */
                break;
            case GAMESTATE_GAMEOVER :		// 3
                /* 중략 */
                break;
        }
        /* 중략 */
    }
    /* 중략 */
}

열거형을 사용하지 않을 경우, int형 상수에 번호를 대입해서 해당 상수명으로 case 값을 넣을 수 있다. 하지만, 만약 순서대로 매겨진 번호 사이에 다른 것을 추가해야 할 경우 그 뒤의 모든 숫자를 하나씩 밀리게 변경해야 해서 불편하다.

🛠️ 코드 수정

// 게임의 기본적인 틀의 일부분(열거형 사용)
#include <stdio.h>
#include <stdbool.h>

enum EGameState {           // 열거형 선언(enum의 태그명은 주로 'E'로 시작함)
    GAMESTATE_MAINMENU,     // 열거자 나열
    GAMESTATE_PLAYING,
    GAMESTATE_PAUSED,
    GAMESTATE_GAMEOVER
};

int main() {
    int currState = GAMESTATE_MAINMENU;
    while(true) {
        switch(currState) {
            case GAMESTATE_MAINMENU :
                /* 중략 */
                break;
            case GAMESTATE_PLAYING :
                /* 중략 */
                break;
            case GAMESTATE_PAUSED :
                /* 중략 */
                break;
            case GAMESTATE_GAMEOVER :
                /* 중략 */
                break;
        }
        /* 중략 */
    }
    /* 중략 */
}

열거형 안에 열거자들을 나열할 때, 자료형은 자동으로 int형 상수가 되기 때문에 생략된다. 번호 또한 자동으로 앞에서부터 0, 1, 2, 3, ... 순서로 매겨지기 때문에 숫자를 대입할 필요가 없다. 중간에 열거자를 추가하는 것 또한 다른 부분을 수정할 필요가 없어서 간단하다.




▷ 김형근·곽덕훈·정재화, 『C프로그래밍』, 한국방송통신대학교출판문화원, 2020
▷ 서현우, 『뇌를 자극하는 C 프로그래밍』, 한빛미디어, 2005
▷ 두들낙서, “두들낙서의 C/C++ 강좌”, https://youtube.com/playlist?list=PLlJhQXcLQBJqywc5dweQ75GBRubzPxhAk&si=s8RNpRcpJTi_Lz8M

0개의 댓글