[C++] C에서 사용되는 개념 8탄 (const 와 메모리 구조)

Patrick!·2023년 1월 8일
0
post-thumbnail

const(상수화)에 대하여

상수화의 개념
그 대상을 변경하지 않는 "상수"를 의미합니다. 이는 다른 프로그레밍 언어에서도 유의미하게 사용하며 이를 통해 데이터를 보존성을 지킬 수 있습니다.

코드를 작성하다보면 값이 변하지 않으며 이를 재정의 하지 않아야하는 경우가 빈번하게 발생합니다.
게임을 예로 들자면 캐릭터별 초기 스텟에 대한 부분을 예로 들 수 있습니다.

버프(buff) 혹은 장비장착, 레벨업 등을 하게 되면 초기스텟에 연산을 하여 캐릭터의 능력치를 향상시킨다고 할때,

이를 통해 캐릭터는 성장을 거듭하는게 RPG의 기본 요소로 중요하게 자리잡고 있습니다.

하지만 모종의 이유로 변하지 않아야 하는 값(캐릭터의 기본 스텟)을 조작하는 일이 발생하게 되어 버그가 발생하게 된다면 매우 난감해집니다.

그렇기에 이를 방지하기 위해 이번 시간에는 const 의 중요성을 알아보도록 하자!!

constant의 약자인 const를 타입 앞에 선언하면 간단하게 상수화를 진행할 수 있습니다.

const int char_HP = 1000;

위에서 선언한 const int char_HP = 1000; 을 다른 라인 or 함수에서 변경을 하게 될 경우,
위에서 상수화를 진행했기에 이를 바꿀 수 없다는 경고문을 출력합니다.

이로써 중요한 데이터를 보존합니다.

그럼 const를 사용하여 변수를 선언할 때, 초기값이 필요한가 ?

당연하게도 이를 추후 수정할 수 없다. 위에서와 다른 방법으로 경고문이 출력될 것이다.

추후에도 수정할 수 없는 값에 초기값이 없다면 이는 사용하지 않는 변수를 사용하는 것과 다름없는 것이며
컴퓨터에게 있어 말이 안되는 소리이다.

#include <iostream>
using namespace std;

const int AIR = 0;
const int STUN = 1;
const int POLYMORPH = 2;

const int INVINCIBLE; <- 상수화를 진행항 변수의 초기값이 없기에 경고를 한다.

int main() {

	AIR = 3;  <- 여기서는 상수화를 진행한 변수를 수정하기에 경고를 한다.

}

메모리 구조에 대하여

메모리의 구조를 알아야하는 이유가 무엇인가?

C++ 에서는 메모리를 어떻게 사용하느냐가 매우 중요하다.

우리가 코드를 작성하면 이 코드들은 실행되면서 다양한 메모리 영역에 사용되는데 대표적으로
코드 영역 , 데이터 영역, 힙 영역 , 스택 영역 에 해당한다.

  • code 영역: 실행할 코드가 저장되어 있는 영역
  • data 영역: 전역변수, Static 변수 들이 저장되어 있는 영역
  • heap 영역: malloc 함수 등에 의해서 동적으로 할당되어 사용하는 영역
    (런타임에 의해 크기가 결정되기에 매번 변동)
  • stack 영역: 지역변수, 매개변수들이 저장되어 있는 영역
    (컴파일 타임에 의해 크기가 결정되기에 매번 변동)

위에서 선언한 const 변수들을 살펴보면 재밌는 현상을 확인할 수 있다?!

#include <iostream>
using namespace std;

const int AIR = 0;
const int STUN = 1;
const int POLYMORPH = 2;

int main() {
	int a = AIR;
    
    int s = STUN;
    
    int p = POLYMORPH;
}

const로 선언된 변수들을 메모리에서 살펴보면
이는 "식은 XX 또는 함수 지정자여야 합니다." 라는 문구로 표기되고 있다.

사실상 이러한 상수로 선언한 변수들은 컴파일러가 메모리를 할당하지 않고
해당 변수가 사용된 지점에 값을 그대로 넣고 있다는 것을 확인할 수 있다.

그렇다는 것은 컴파일러가 상수를 상수에 선언한 값 그 자체로 받아들이고 있다는 것이다.
(이는 경우에 따라 달라질 수 있다.)

profile
C++와 Unreal Engine / C#과 Unity / Katalon Studio를 통한 자동화 테스트 등을 하루하루 공부한 기록

0개의 댓글