변수와 자료형
변수와 자료형¶
1. 변수란?¶
변수는 데이터를 저장하는 메모리 공간에 붙인 이름입니다.
#include <iostream>
int main() {
int age = 25; // 정수형 변수
double height = 175.5; // 실수형 변수
char grade = 'A'; // 문자형 변수
std::cout << "나이: " << age << std::endl;
std::cout << "키: " << height << std::endl;
std::cout << "등급: " << grade << std::endl;
return 0;
}
2. 기본 자료형¶
정수형 (Integer Types)¶
| 타입 | 크기 | 범위 |
|---|---|---|
short |
2바이트 | -32,768 ~ 32,767 |
int |
4바이트 | 약 -21억 ~ 21억 |
long |
4/8바이트 | 시스템에 따라 다름 |
long long |
8바이트 | 약 -922경 ~ 922경 |
#include <iostream>
int main() {
short s = 32767;
int i = 2147483647;
long l = 2147483647L;
long long ll = 9223372036854775807LL;
std::cout << "short: " << s << std::endl;
std::cout << "int: " << i << std::endl;
std::cout << "long: " << l << std::endl;
std::cout << "long long: " << ll << std::endl;
return 0;
}
부호 없는 정수 (Unsigned)¶
unsigned int positive = 4294967295; // 0 ~ 약 42억
unsigned short us = 65535; // 0 ~ 65535
실수형 (Floating Point Types)¶
| 타입 | 크기 | 정밀도 |
|---|---|---|
float |
4바이트 | 약 7자리 |
double |
8바이트 | 약 15자리 |
long double |
8~16바이트 | 시스템에 따라 다름 |
#include <iostream>
#include <iomanip> // setprecision
int main() {
float f = 3.14159265358979f;
double d = 3.14159265358979;
std::cout << std::setprecision(15);
std::cout << "float: " << f << std::endl;
std::cout << "double: " << d << std::endl;
return 0;
}
출력:
float: 3.14159274101257
double: 3.14159265358979
문자형 (Character Type)¶
#include <iostream>
int main() {
char letter = 'A';
char newline = '\n';
char tab = '\t';
std::cout << "문자: " << letter << std::endl;
std::cout << "ASCII 값: " << (int)letter << std::endl; // 65
// 이스케이프 시퀀스
std::cout << "Tab:\tAfter tab" << std::endl;
std::cout << "Quote: \"Hello\"" << std::endl;
return 0;
}
이스케이프 시퀀스¶
| 시퀀스 | 의미 |
|---|---|
\n |
줄바꿈 |
\t |
탭 |
\\ |
백슬래시 |
\" |
큰따옴표 |
\' |
작은따옴표 |
불리언형 (Boolean Type)¶
#include <iostream>
int main() {
bool isTrue = true;
bool isFalse = false;
std::cout << "true: " << isTrue << std::endl; // 1
std::cout << "false: " << isFalse << std::endl; // 0
// 조건 표현식
bool result = (5 > 3); // true
std::cout << "5 > 3: " << result << std::endl;
return 0;
}
3. 변수 선언과 초기화¶
선언과 초기화 방식¶
#include <iostream>
int main() {
// 선언만 (초기화되지 않음 - 쓰레기값)
int a;
// 선언과 동시에 초기화
int b = 10;
// 중괄호 초기화 (C++11, 권장)
int c{20};
// 복사 초기화
int d = {30};
// 여러 변수 동시 선언
int x = 1, y = 2, z = 3;
std::cout << "b: " << b << std::endl;
std::cout << "c: " << c << std::endl;
std::cout << "d: " << d << std::endl;
return 0;
}
중괄호 초기화의 장점¶
int a = 3.14; // 가능 (3으로 잘림, 경고 없을 수 있음)
int b{3.14}; // 컴파일 에러! (좁히기 변환 금지)
int c{3}; // 정확한 값
4. 상수¶
const 상수¶
#include <iostream>
int main() {
const int MAX_SIZE = 100;
const double PI = 3.14159;
std::cout << "MAX_SIZE: " << MAX_SIZE << std::endl;
std::cout << "PI: " << PI << std::endl;
// MAX_SIZE = 200; // 에러! const는 수정 불가
return 0;
}
constexpr (컴파일 타임 상수)¶
#include <iostream>
constexpr int square(int x) {
return x * x;
}
int main() {
constexpr int SIZE = 10;
constexpr int AREA = square(5); // 컴파일 시 계산
int arr[SIZE]; // 배열 크기로 사용 가능
std::cout << "SIZE: " << SIZE << std::endl;
std::cout << "AREA: " << AREA << std::endl;
return 0;
}
const vs constexpr¶
| 구분 | const | constexpr |
|---|---|---|
| 초기화 시점 | 런타임 가능 | 컴파일 타임 필수 |
| 배열 크기 | 일부 컴파일러만 | 항상 가능 |
| 함수 적용 | 불가 | 가능 |
5. auto 키워드 (C++11)¶
컴파일러가 타입을 자동으로 추론합니다.
#include <iostream>
int main() {
auto i = 42; // int
auto d = 3.14; // double
auto c = 'A'; // char
auto b = true; // bool
auto s = "Hello"; // const char*
std::cout << "i type: int, value: " << i << std::endl;
std::cout << "d type: double, value: " << d << std::endl;
// 타입 확인 (디버깅용)
// typeid(i).name() 으로 확인 가능
return 0;
}
auto 사용 시 주의¶
auto x = 10; // int (리터럴 기본값)
auto y = 10.0; // double
auto z = 10.0f; // float (f 접미사)
auto ll = 10LL; // long long
6. 형변환 (Type Casting)¶
암시적 형변환 (자동)¶
#include <iostream>
int main() {
int i = 10;
double d = i; // int → double (안전)
double pi = 3.14;
int truncated = pi; // double → int (소수점 손실!)
std::cout << "d: " << d << std::endl; // 10
std::cout << "truncated: " << truncated << std::endl; // 3
return 0;
}
명시적 형변환¶
#include <iostream>
int main() {
double pi = 3.14159;
// C 스타일 (비권장)
int a = (int)pi;
// C++ 함수 스타일
int b = int(pi);
// static_cast (권장)
int c = static_cast<int>(pi);
std::cout << "a: " << a << std::endl; // 3
std::cout << "b: " << b << std::endl; // 3
std::cout << "c: " << c << std::endl; // 3
return 0;
}
C++ 캐스트 연산자¶
| 캐스트 | 용도 |
|---|---|
static_cast<T> |
일반적인 타입 변환 |
const_cast<T> |
const 제거/추가 |
dynamic_cast<T> |
다형성 클래스 변환 |
reinterpret_cast<T> |
비트 수준 재해석 |
7. 크기 확인: sizeof¶
#include <iostream>
int main() {
std::cout << "char: " << sizeof(char) << " bytes" << std::endl;
std::cout << "short: " << sizeof(short) << " bytes" << std::endl;
std::cout << "int: " << sizeof(int) << " bytes" << std::endl;
std::cout << "long: " << sizeof(long) << " bytes" << std::endl;
std::cout << "long long: " << sizeof(long long) << " bytes" << std::endl;
std::cout << "float: " << sizeof(float) << " bytes" << std::endl;
std::cout << "double: " << sizeof(double) << " bytes" << std::endl;
std::cout << "bool: " << sizeof(bool) << " bytes" << std::endl;
int arr[10];
std::cout << "int[10]: " << sizeof(arr) << " bytes" << std::endl;
return 0;
}
8. 리터럴 (Literals)¶
정수 리터럴¶
int decimal = 42; // 10진수
int octal = 052; // 8진수 (0으로 시작)
int hex = 0x2A; // 16진수 (0x로 시작)
int binary = 0b101010; // 2진수 (C++14, 0b로 시작)
long l = 42L;
unsigned u = 42U;
long long ll = 42LL;
unsigned long long ull = 42ULL;
실수 리터럴¶
double d1 = 3.14;
double d2 = 3.14e2; // 314.0 (과학적 표기법)
double d3 = 3.14e-2; // 0.0314
float f = 3.14f; // float (f 접미사)
long double ld = 3.14L; // long double (L 접미사)
숫자 구분자 (C++14)¶
int million = 1'000'000; // 가독성 향상
long long big = 1'234'567'890LL;
double pi = 3.141'592'653;
9. 타입 별칭¶
typedef (전통적 방식)¶
typedef unsigned int uint;
typedef long long int64;
uint a = 100;
int64 b = 1234567890123LL;
using (C++11, 권장)¶
using uint = unsigned int;
using int64 = long long;
uint a = 100;
int64 b = 1234567890123LL;
10. 표준 고정 크기 타입¶
<cstdint> 헤더에 정의된 플랫폼 독립적인 타입입니다.
#include <iostream>
#include <cstdint>
int main() {
int8_t a = 127; // 정확히 8비트
int16_t b = 32767; // 정확히 16비트
int32_t c = 2147483647; // 정확히 32비트
int64_t d = 9223372036854775807LL; // 정확히 64비트
uint8_t ua = 255; // unsigned 8비트
uint16_t ub = 65535; // unsigned 16비트
std::cout << "int8_t max: " << (int)a << std::endl;
std::cout << "int16_t max: " << b << std::endl;
std::cout << "int32_t max: " << c << std::endl;
std::cout << "int64_t max: " << d << std::endl;
return 0;
}
11. 요약¶
| 분류 | 타입 | 크기 |
|---|---|---|
| 정수 | int |
4바이트 |
| 정수 | long long |
8바이트 |
| 실수 | double |
8바이트 |
| 문자 | char |
1바이트 |
| 불리언 | bool |
1바이트 |
| 키워드 | 용도 |
|---|---|
const |
런타임 상수 |
constexpr |
컴파일 타임 상수 |
auto |
타입 자동 추론 |
static_cast |
안전한 형변환 |
12. 연습 문제¶
연습 1: 변수 출력¶
다양한 타입의 변수를 선언하고 값을 출력하세요.
연습 2: 형변환¶
섭씨 온도를 입력받아 화씨로 변환하세요. (F = C × 9/5 + 32)
연습 3: sizeof¶
모든 기본 타입의 크기를 출력하는 프로그램을 작성하세요.
다음 단계¶
03_Operators_and_Control_Flow.md에서 연산자와 제어문을 배워봅시다!