전체 코드
#include <iostream>
using namespace std;
int g_hp = 100;
int g_mp;
int main()
{
int hp = 123;
cout << "전역 hp: " << g_hp << endl;
cout << "지역 hp: " << hp << endl;
{
int hp = 30;
cout << "블록 안 지역 hp: " << hp << endl;
}
cout << "블록 밖 지역 hp: " << hp << endl;
int a = 10, b = 5, c = 2;
int result = a + b * c;
int result2 = (a + b) * c;
cout << "결과1 (a + b * c): " << result << endl;
cout << "결과2 ((a + b) * c): " << result2 << endl;
bool isEven = ((hp % 2) == 0);
cout << "짝수 여부: " << isEven << endl;
bool isEvenOrDivBy3 = (((hp % 2) == 0) || ((hp % 3) == 0));
cout << "짝수이거나 3으로 나누어지는가: " << isEvenOrDivBy3 << endl;
short hp2 = (short)hp;
cout << "short로 변환한 hp2: " << hp2 << endl;
float hp3 = (float)hp;
cout << "float로 변환한 hp3: " << hp3 << endl;
unsigned int hp4 = (unsigned int)-100;
cout << "unsigned int로 변환한 hp4: " << hp4 << endl;
int maxHp = 1000;
float ratio = hp / maxHp;
float ratio2 = hp / (float)maxHp;
cout << "정수 나눗셈 결과: " << ratio << endl;
cout << "실수 나눗셈 결과: " << ratio2 << endl;
return 0;
}
🌐 1️⃣ 변수의 유효 범위 (Scope)
🔗 개념 설명
| 구분 | 설명 | 위치 |
|---|
| 전역 변수 | 프로그램 전체에서 사용 가능 | .data / .bss |
| 지역 변수 | 함수나 블록 내부에서만 사용 가능 | 스택(Stack) |
| 지역 static 변수 | 함수 내에서만 유효, 프로그램 종료 시까지 유지 | .data |
- 전역 변수는 프로그램 시작부터 종료까지 생존.
- 지역 변수는 블록({})이 끝나는 순간 메모리 해제.
- 지역 변수와 전역 변수가 같은 이름이면 지역 변수가 우선함 (Shadowing 현상).
📜 예제 코드 & 설명
#include <iostream>
using namespace std;
int g_hp = 100;
int g_mp;
int main()
{
int hp = 50;
cout << "전역 hp: " << g_hp << endl;
cout << "지역 hp: " << hp << endl;
{
int hp = 30;
cout << "블록 안 지역 hp: " << hp << endl;
}
cout << "블록 밖 지역 hp: " << hp << endl;
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;
int result2 = (a + b) * c;
cout << result << endl;
cout << result2 << endl;
🔄 3️⃣ 타입 변환 (Type Casting)
🔗 개념 설명
| 변환 방향 | 주의사항 |
|---|
| 큰 → 작은 타입 | 데이터 손실 (Overflow 위험) |
| 정수 → 실수 | 정밀도 손실 가능 |
| signed → unsigned | 해석 방식이 달라져서 값 왜곡 가능 |
📜 예제 코드 & 설명
int hp = 77777;
short hp2 = hp;
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;
float ratio = damage / maxHp;
cout << "정수 나눗셈 결과: " << ratio << endl;
float ratio2 = damage / (float)maxHp;
cout << "실수 변환 후 나눗셈 결과: " << ratio2 << endl;
📊 디버깅 포인트 정리
| 체크 포인트 | 조사식 예시 |
|---|
| 전역 변수 주소 | &g_hp |
| 지역 변수 주소 | &hp |
| 타입 변환 확인 | hp2 |
| 나눗셈 결과 확인 | ratio, ratio2 |
📑 메모리 맵 정리표
| 변수명 | 초기화 여부 | 위치 |
|---|
| 전역 g_hp | 초기화 있음 | .data |
| 전역 g_mp | 초기화 없음 | .bss |
| 지역 hp | 초기화 있음 | 스택 |
| const 문자열 | 있음 | .rodata |
📌 실습 요약 & 정리표
| 주제 | 핵심 포인트 |
|---|
| 유효 범위 | 블록 단위로 소멸, 전역은 프로그램 종료까지 유지 |
| 연산 우선순위 | 곱셈 > 덧셈, 논리 AND > OR |
| 타입 변환 | 큰→작은 손실 / 정수→실수 정밀도 문제 |
| 사칙 연산 | 0 나누기, 오버플로우, 정수 나눗셈 주의 |
🧰 실습 흐름 요약 (디버깅 포인트)
- 전역 변수 주소 확인
- 지역 변수 스택 위치 확인
- 타입 변환 후 값 변화 확인
- 정수 나눗셈과 실수 나눗셈 결과 비교
- 연산 우선순위 영향 확인
🏁 최종 핵심 요약 (한눈에 암기)
| 주제 | 키워드 요약 |
|---|
| 유효 범위 | 중괄호 생존, 전역은 프로그램 종료까지 |
| 연산 우선순위 | 곱셈 > 덧셈, AND > OR, 괄호 필수 |
| 타입 변환 | 손실 주의, 부호 해석 주의 |
| 사칙 연산 | 오버플로우, 0 나누기, 정수 나눗셈 |
📌 매일 복습용 1분 퀴즈
1️⃣ 전역변수 g_hp는 어디에 저장될까?
→ .data
2️⃣ 곱셈과 덧셈 중 누가 먼저?
→ 곱셈
3️⃣ int → short 변환 시 주의할 점은?
→ 상위 비트 날아감
4️⃣ 정수 나눗셈 주의할 점은?
→ 소수점 손실
🔥 마무리
이 자료는 기초 문법에서 놓치기 쉬운 "유의사항"을 완벽하게 정리한 자료입니다.
디버깅 + 디어셈블리 분석까지 하면 진짜 실력자로 성장할 수 있습니다.
필요하면 이 자료 기반 실습 문제도 추가로 만들어드릴게요!
복습용 요약본 필요하신가요? 🔥