🧠 주제

이 문서는 C++ 프로그래밍의 기초인 변수(variable)의 개념, 그리고 컴퓨터가 데이터를 어떻게 문자, 실수, 불리언 등의 형태로 메모리에 저장하고 처리하는지에 대해 설명한다.
특히 ASCII 코드, 실수의 근사치 표현, 불리언 타입의 명확성, 변수의 메모리 저장 위치, 오버플로우/언더플로우 현상, 그리고 좋은 변수 선언 습관까지 포함된 내용을 코드 예시와 함께 통합적으로 다룬다.

이 강의는 단순한 문법 암기를 넘어, 컴퓨터 내부 동작 원리를 정확히 이해하고 변수와 타입을 올바르게 사용하는 데 초점을 맞춘다.


💡 개념

1. 변수란?

  • 변수는 데이터를 저장할 수 있는 메모리 공간에 부여된 이름이다.
  • 변수는 선언과 동시에 데이터 타입에 따라 공간이 할당되며, 해당 공간을 통해 값을 저장하거나 읽어올 수 있다.
  • 변수는 프로그램 흐름에 따라 값을 변경하거나 유지할 수 있으며, 사용되는 위치에 따라 유효 범위(scope)저장 영역이 달라진다.

2. 변수의 메모리 저장 영역

변수 종류저장 위치특징
전역 변수Data 영역프로그램 전체에서 접근 가능. 종료 시까지 유지
지역 변수Stack 영역함수/블록 내에서만 유효. 블록 종료 시 소멸
동적 변수Heap 영역런타임에 생성. new로 할당, delete로 해제
  • 전역 변수는 프로그램 시작과 함께 생성되고 종료 시까지 유지된다.
  • 지역 변수는 함수 호출 시 생성되고 함수 종료 시 소멸된다.
  • 동적 변수는 명시적으로 메모리를 할당 및 해제해야 하며, 메모리 누수 주의가 필요하다.

3. 데이터 타입과 저장 범위

타입바이트 수값의 범위 또는 특징
char1-128 ~ 127 (ASCII 문자 저장)
unsigned char10 ~ 255
int4-2,147,483,648 ~ 2,147,483,647
unsigned int40 ~ 4,294,967,295
float4±3.4E+38 (정밀도 약 7자리, 단정도)
double8±1.7E+308 (정밀도 약 15자리, 배정도)
bool1true(1) 또는 false(0)

4. 특수 타입의 표현 원리

char와 ASCII 코드

  • char 타입은 실제로는 숫자(정수)를 저장한다.
  • 아스키 코드(ASCII)는 문자와 숫자를 1:1로 매핑한 국제 표준이다.
    • 예: 'A' = 65, '0' = 48
  • (int) 캐스팅을 통해 문자 → 아스키 코드 값을 출력할 수 있다.
char ch = 'A';
cout << (int)ch; // 출력: 65

float, double의 실수 표현 – 근사값

  • 실수는 정확한 값을 저장하는 것이 아니라, 근사값을 저장한다.
  • 대부분의 연산에서 float(4바이트)도 충분하지만, 더 높은 정밀도가 필요할 경우 double을 사용.
  • C++에서 실수 리터럴은 기본적으로 double로 처리되므로, float로 명시하려면 f를 붙여야 한다.
float f = 3.14f; // float
double d = 3.14; // double

bool의 참/거짓 표현

  • bool참/거짓을 명확하게 표현하는 타입으로, true = 1, false = 0으로 저장된다.
  • int로도 0/1을 표현할 수 있지만, 불분명하거나 오류가 발생하기 쉬워 bool 사용이 권장된다.
bool isRunning = true;
if (isRunning) {
    cout << "Running!";
}

💻 코드 분석

1. 변수 선언과 초기화

int hp = 100;         // 정수형 변수 선언 및 초기화
float speed = 3.5f;   // 단정도 실수형. f를 붙여 float 타입 명시
char grade = 'A';     // 문자형 변수 초기화
bool isAlive = true;  // 논리형 변수. true(1) 저장됨
  • int, float, char, bool 모두 기본 데이터 타입.
  • 실수형은 기본이 double이기 때문에, float로 쓰려면 반드시 f 접미사를 사용해야 한다.
  • char는 ASCII 값을 기반으로 정수 저장.
  • bool은 내부적으로 1(true), 0(false)으로 처리된다.

2. 변수의 메모리 저장 영역

int maxHp = 200;  // 전역 변수 → Data 영역

void func() {
    int localHp = 100; // 지역 변수 → Stack 영역
}
  • new 연산자는 런타임 시 메모리를 Heap에서 할당하고, 사용이 끝났을 때 delete로 수동 해제해야 한다.

3. 초기화되지 않은 변수

int hp;
cout << hp; // 결과는 예측 불가 (쓰레기 값 출력)
  • 변수는 반드시 초기화해야 안전하다. 초기화하지 않으면 무작위 쓰레기 값이 들어갈 수 있다.

4. 오버플로우와 언더플로우

short maxValue = 32767; // short 최대값
maxValue += 1;
cout << maxValue; // 출력: -32768 (오버플로우 발생)
  • 2의 보수 표현 방식에 의해 최대값을 넘으면 음수로 반전된다.

5. 실수 정밀도 차이

float pi_f = 3.14159f;
double pi_d = 3.14159265359;

cout << pi_f << endl; // 출력: 약 3.14159
cout << pi_d << endl; // 출력: 3.14159265359 (더 정확)
  • float는 정밀도가 약 7자리, double은 약 15자리까지 정확하게 표현 가능.

6. 문자와 ASCII 코드 출력

char letter = 'A';
cout << "Char: " << letter << endl;         // 출력: A
cout << "ASCII: " << (int)letter << endl;   // 출력: 65
  • (int) 캐스팅으로 문자 → 정수(ASCII 값) 변환 가능.

🔑 핵심

  • 변수는 데이터를 저장할 수 있는 메모리 공간에 이름을 붙인 것으로, 선언 시 데이터 타입에 따라 메모리 크기와 범위가 결정된다.
  • 메모리 저장 영역은 변수의 스코프에 따라 Stack, Heap, Data 영역으로 나뉘며, 각각의 사용 방식과 수명, 해제 방법이 다르다.
  • 데이터 타입은 다음과 같은 특징을 가진다:
    • char: 문자 표현. 내부적으로는 정수 저장 (ASCII 코드 기반)
    • int: 정수 표현. 4바이트 범위 내 값 저장
    • float, double: 실수 표현. 근사값 저장. floatf 접미사 필요
    • bool: 논리값 표현. true/false, 내부적으로 1/0 저장
  • 주의사항:
    • 초기화되지 않은 변수는 예측할 수 없는 값을 가진다.
    • 변수 타입보다 큰 값을 저장하면 오버플로우, 작은 값을 저장하면 언더플로우 발생.
    • 동적 메모리는 반드시 delete로 해제해야 메모리 누수가 없다.
  • 좋은 변수 선언 습관:
    • 의미 있는 이름 사용 (int x ❌ → int playerScore ✅)
    • 필요한 범위에서만 선언
    • 변경되지 않는 값은 const로 선언하여 의도를 명확히 표현

profile
李家네_공부방

0개의 댓글