Qaupot Blog
Software Engineering, Trip

405. 상수

🕐 Fri, 07 Feb 2014 09:00:00 GMT 🕓 Tue, 24 Aug 2021 01:31:00 GMT

상수 정의

#include <stdio.h>

int main(int argc,char** argv)
{
    int IntValue = 123;
    char CharValue[4] = "123";
    const char CharValues[5] = "123";

    return 0;
}

위의 코드에서는 IntValue 를 선언하고 123을 대입하며, CharValue 배열을 선언하고 문자열 "123"을 대입했습니다.

코드에 바로 작성된 숫자 123이나 문자열123같은 바뀌지 않는 값을 상수 라고 합니다.

상수는 메모리의 어디에?

**IntValue 나 CharValue 같은 변수들은 메모리상에 위치합니다.
그럼 숫자 123과 문자열 123은 어디에 있는 것일까요?

Microsoft Visual Studio 를 이용해서 찾아보도록 하겠습니다.

위의 그림처럼 브레이크 포인트를 설정하고 디버그모드를 실행시켜 보겠습니다.

  • 회색 공간에서 왼쪽 클릭을 하면 설정할 수 있습니다.

그리고 바로 저 라인에서 오른쪽 클릭을 하고 "디스 어셈블리로 이동"이라는 메뉴를 눌러봅시다. 그럼 다음과 같은 굉장히 생소한 코드가 등장할 것입니다.

어셈블리에서의 상수

어셈블리어는 대부분 기계어와 1:1로 매칭되므로 사람이 이해할 수 있도록 만든 기계어 정도로 생각하시면 되겠습니다.

  • 여기서는 설명을 위해서 잠시 사용했을 뿐, 어셈블리어를 심도있게 다루지는 않을 것입니다.

00D513BE mov dword ptr [IntValue],7Bh 가 보이시나요?
이것은 Intvalue 에 7Bh(123)을 대입하라는 의미입니다.
숫자 상수의 경우 별다른 과정없이 기계어에서 바로 사용될 수 있습니다. 따라서 별다른 메모리 할당등은 하지 않습니다.

00D513C5 mov eax,dword ptr [string "123" (0D5573Ch)]  
00D513CA mov dword ptr [CharValue],eax  

char CharValue[4] = "123";에 대응하는 부분입니다.

숫자 상수와는 다르게 문자열 상수는 조금 더 과정을 거칩니다.
위의 의미는 프로그램 주소상 0D5573C에 있는 string(123)을 eax 레지스터를 거쳐 CharValue 에 옮기라는 의미입니다.

숫자 상수와는 다르게 문자열 상수는 그 크기가 얼마든지 늘어날 수 있기 때문에, 위의 코드 같은 경우 0D5573C에 "123"이라는 문자열을 미리 가져다 놓고, 가져다가 대입합니다.

이러한 상수 값은 데이터 영역 세그먼트에 포함되고, 필요시에 참조하게 됩니다.

매크로 상수

#define MAXIMUM 20  
int Top = MAXIMUM;  

int Top = 20에 대응하는 방식으로, 위의 숫자 상수의 처리 방식과 동일합니다.

  • 문자열 역시 마찬가지입니다.

과거 성능이 좋지 않았던 컴파일러들은 이러한 문자열이 여러번 사용되면, 같은 문자열이라고 할 지라도 데이터 영역에 그 공간을 새로 만들었지만, 최근의 컴파일러들은 최적화 과정을 거쳐 그러한 일이 나타나지 않도록 합니다.

변수 상수

변수의 선언 앞에는 const 라는 키워드를 붙일 수 있습니다.
const int MAXIMUM = 20; 과 같은 형태로 사용됩니다.

값은 변수지만, 처음 값을 대입한 순간부터 상수처럼 값을 고칠수가 없습니다. 이는 상수와는 다릅니다. 엄연히 변수이며, 그에 따른 메모리 공간이 할당됩니다.

만약 성능이 나쁜 컴파일러가 같은 문자열 상수를 복사해 넣어 데이터 영역을 차지한다면,
명시적으로 const 를 붙인 char 배열을 대신 사용하는 방법을 사용할 수 있습니다.
const 를 붙인 char 배열과 상수 문자열 두개가 존재하므로 공간이 2배가 되지만, 3배 이상으로 사용되는 것 보다는 나은 선택일 수 있습니다.

또한 상수 변수는 명시적으로 이름과 메모리 공간을 지니기 때문에
프로그래밍 중의 실수를 줄이는 방법 중에 하나로 사용할 수 있고, 코드의 가독성을 높일 수 있습니다.

이 블로그는 개인 블로그입니다. 게시글은 오류를 포함하고 있을 수 있지만, 저자는 오류를 해결하기 위해 노력하고 있습니다.
게시글에 별도의 고지가 없는 경우, 크리에이티브 커먼즈 저작자표시-비영리-변경금지 4.0 라이선스를 따릅니다.

This blog is personal blog. published posts may contain some errors, but author doing efforts to clear errors.
If post have not notice of license, it under creative commons Attribution-NonCommercial-NoDerivatives 4.0.