전체 코드

#include <iostream>
using namespace std;

// 전역 변수 (global variable)
int g_hp = 100;    // 초기값 있는 전역 변수 → .data
int g_mp;          // 초기값 없는 전역 변수 → .bss

int main()
{
    // 1️⃣ 변수의 유효범위 (Scope)

    int hp = 123;   // 지역 변수 (main 함수 안에서만 유효)
    cout << "전역 hp: " << g_hp << endl;   // 100
    cout << "지역 hp: " << hp << endl;     // 123

    {
        int hp = 30;   // 블록 안에서만 유효한 새로운 hp
        cout << "블록 안 지역 hp: " << hp << endl;  // 30
    }

    cout << "블록 밖 지역 hp: " << hp << endl;  // 123

    // 2️⃣ 연산 우선순위 (Operator Precedence)

    int a = 10, b = 5, c = 2;
    int result = a + b * c;  // 곱셈이 덧셈보다 우선
    int result2 = (a + b) * c;  // 괄호로 우선순위 변경

    cout << "결과1 (a + b * c): " << result << endl;   // 20
    cout << "결과2 ((a + b) * c): " << result2 << endl; // 30

    // 짝수 여부 확인
    bool isEven = ((hp % 2) == 0);
    cout << "짝수 여부: " << isEven << endl;   // false (123은 홀수)

    // 짝수 또는 3으로 나누어떨어지는지 확인
    bool isEvenOrDivBy3 = (((hp % 2) == 0) || ((hp % 3) == 0));
    cout << "짝수이거나 3으로 나누어지는가: " << isEvenOrDivBy3 << endl;  // true

    // 3️⃣ 타입 변환 (Type Casting)

    // 정수를 short로 변환 (데이터 손실 가능)
    short hp2 = (short)hp;
    cout << "short로 변환한 hp2: " << hp2 << endl;   // 123 (손실 없음)

    // 정수를 실수로 변환
    float hp3 = (float)hp;
    cout << "float로 변환한 hp3: " << hp3 << endl;   // 123.0000

    // signed → unsigned 변환
    unsigned int hp4 = (unsigned int)-100;
    cout << "unsigned int로 변환한 hp4: " << hp4 << endl;   // 큰 양수 (4294967196)

    // 4️⃣ 사칙 연산 관련 유의사항

    int maxHp = 1000;  // 최대 체력
    float ratio = hp / maxHp;  // 정수 나눗셈 (0 나옴)
    float ratio2 = hp / (float)maxHp;  // 실수 나눗셈 (정확한 비율)

    cout << "정수 나눗셈 결과: " << ratio << endl;   // 0
    cout << "실수 나눗셈 결과: " << ratio2 << endl; // 0.123

    return 0;
}

🌐 1️⃣ 변수의 유효 범위 (Scope)

🔗 개념 설명

구분설명위치
전역 변수프로그램 전체에서 사용 가능.data / .bss
지역 변수함수나 블록 내부에서만 사용 가능스택(Stack)
지역 static 변수함수 내에서만 유효, 프로그램 종료 시까지 유지.data
  • 전역 변수는 프로그램 시작부터 종료까지 생존.
  • 지역 변수는 블록({})이 끝나는 순간 메모리 해제.
  • 지역 변수와 전역 변수가 같은 이름이면 지역 변수가 우선함 (Shadowing 현상).

📜 예제 코드 & 설명

#include <iostream>
using namespace std;

// 전역 변수: 프로그램 종료 전까지 유지
int g_hp = 100;    // 초기화 있음 → .data 영역
int g_mp;          // 초기화 없음 → .bss 영역

int main()
{
    // 지역 변수: main 함수 안에서만 유효
    int hp = 50;   // 스택에 저장

    cout << "전역 hp: " << g_hp << endl;   // 100
    cout << "지역 hp: " << hp << endl;     // 50

    {
        int hp = 30;   // 이 블록 안에서만 유효한 hp (Shadowing 발생)
        cout << "블록 안 지역 hp: " << hp << endl;  // 30
    }

    cout << "블록 밖 지역 hp: " << hp << endl;  // 50 (블록 안 hp는 사라짐)

    return 0;
}

⚠️ 2️⃣ 연산 우선순위 (Operator Precedence)

🔗 개념 설명

  • 연산자마다 우선순위가 다름
  • 혼동 방지를 위해 괄호 사용 권장
  • 대표적 우선순위 예시:
우선순위연산자의미
1()괄호
2*, /, %곱셈, 나눗셈, 나머지
3+, -덧셈, 뺄셈
4<, <=, >, >=비교 연산
5==, !=동등/비동등 비교
6&&논리 AND
7

📜 예제 코드 & 설명

int a = 10, b = 5, c = 2;
int result = a + b * c;  // 곱셈 먼저 실행 → 10 + (5 * 2) = 20
int result2 = (a + b) * c; // 괄호로 순서 변경 → (10+5) * 2 = 30

cout << result << endl;  // 20
cout << result2 << endl; // 30

🔄 3️⃣ 타입 변환 (Type Casting)

🔗 개념 설명

변환 방향주의사항
큰 → 작은 타입데이터 손실 (Overflow 위험)
정수 → 실수정밀도 손실 가능
signed → unsigned해석 방식이 달라져서 값 왜곡 가능

📜 예제 코드 & 설명

int hp = 77777;   // 32비트 정수
short hp2 = hp;   // 16비트로 변환 (상위 비트 날아감)

float hp3 = hp;   // 실수로 변환 (정밀도 손실 가능)

unsigned int hp4 = -100;  // 부호 없는 타입으로 변환 (해석 방식 달라짐)

cout << "short 변환: " << hp2 << endl;   // 값 날아감
cout << "float 변환: " << hp3 << endl;   // 소수점 표현됨
cout << "unsigned 변환: " << hp4 << endl; // 엄청 큰 양수로 나옴

➗ 4️⃣ 사칙 연산 (Arithmetic)

🔗 개념 설명

연산주의사항
곱셈오버플로우 위험
나눗셈0으로 나누기 주의
정수 나눗셈소수점 손실 (필요 시 실수 변환)

📜 예제 코드 & 설명

int damage = 123;
int maxHp = 1000;

// 정수끼리 나눔 → 0 나옴 (정수 나눗셈은 소수점 버림)
float ratio = damage / maxHp;
cout << "정수 나눗셈 결과: " << ratio << endl; // 0

// 실수 변환 후 나눔 → 정확한 비율 계산
float ratio2 = damage / (float)maxHp;
cout << "실수 변환 후 나눗셈 결과: " << ratio2 << endl; // 0.123

📊 디버깅 포인트 정리

체크 포인트조사식 예시
전역 변수 주소&g_hp
지역 변수 주소&hp
타입 변환 확인hp2
나눗셈 결과 확인ratio, ratio2

📑 메모리 맵 정리표

변수명초기화 여부위치
전역 g_hp초기화 있음.data
전역 g_mp초기화 없음.bss
지역 hp초기화 있음스택
const 문자열있음.rodata

📌 실습 요약 & 정리표

주제핵심 포인트
유효 범위블록 단위로 소멸, 전역은 프로그램 종료까지 유지
연산 우선순위곱셈 > 덧셈, 논리 AND > OR
타입 변환큰→작은 손실 / 정수→실수 정밀도 문제
사칙 연산0 나누기, 오버플로우, 정수 나눗셈 주의

🧰 실습 흐름 요약 (디버깅 포인트)

  1. 전역 변수 주소 확인
  2. 지역 변수 스택 위치 확인
  3. 타입 변환 후 값 변화 확인
  4. 정수 나눗셈과 실수 나눗셈 결과 비교
  5. 연산 우선순위 영향 확인

🏁 최종 핵심 요약 (한눈에 암기)

주제키워드 요약
유효 범위중괄호 생존, 전역은 프로그램 종료까지
연산 우선순위곱셈 > 덧셈, AND > OR, 괄호 필수
타입 변환손실 주의, 부호 해석 주의
사칙 연산오버플로우, 0 나누기, 정수 나눗셈

📌 매일 복습용 1분 퀴즈

1️⃣ 전역변수 g_hp는 어디에 저장될까?
.data

2️⃣ 곱셈과 덧셈 중 누가 먼저?
→ 곱셈

3️⃣ int → short 변환 시 주의할 점은?
상위 비트 날아감

4️⃣ 정수 나눗셈 주의할 점은?
소수점 손실


🔥 마무리

이 자료는 기초 문법에서 놓치기 쉬운 "유의사항"을 완벽하게 정리한 자료입니다.
디버깅 + 디어셈블리 분석까지 하면 진짜 실력자로 성장할 수 있습니다.
필요하면 이 자료 기반 실습 문제도 추가로 만들어드릴게요!
복습용 요약본 필요하신가요? 🔥

profile
李家네_공부방

0개의 댓글