Programming Languages/C++
변수와 자료형
newclass
2025. 3. 27. 23:02
2.1 변수와 자료형
2.1.1 기본 자료형
C++에는 다양한 기본 자료형이 있습니다. 자료형은 데이터의 종류와 크기를 정의하며, 컴퓨터가 메모리를 어떻게 할당하고 해석할지 결정합니다.
정수형 자료형
자료형 설명 일반적 크기 값 범위 예시
int | 기본 정수형 | 4바이트 | -2,147,483,648 ~ 2,147,483,647 | int age = 25; |
short | 작은 정수형 | 2바이트 | -32,768 ~ 32,767 | short count = 100; |
long | 큰 정수형 | 4/8바이트 | ±9.2억/±9.2경 | long population = 8000000L; |
long long | 매우 큰 정수형 | 8바이트 | ±9.2경 | long long distance = 9876543210LL; |
부동 소수점 자료형
자료형 설명 일반적 크기 정밀도 예시
float | 단정밀도 부동 소수점 | 4바이트 | ~7자리 | float price = 19.99f; |
double | 배정밀도 부동 소수점 | 8바이트 | ~15자리 | double pi = 3.14159265359; |
long double | 확장 정밀도 부동 소수점 | 8-16바이트 | 15+ 자리 | long double bigNum = 3.14159265359L; |
문자 및 논리 자료형
자료형 설명 크기 값 범위 예시
char | 문자/작은 정수 | 1바이트 | -128 ~ 127 | char grade = 'A'; |
bool | 논리값 | 1바이트 | true/false | bool isActive = true; |
부호 수정자
기본 자료형에 적용할 수 있는 부호 수정자도 있습니다:
- unsigned: 양수만 저장 (범위가 0부터 시작)
- signed: 양수와 음수 모두 저장 (대부분의 자료형 기본값)
unsigned int positiveOnly = 100; // 0 ~ 4,294,967,295
signed int withSign = -100; // -2,147,483,648 ~ 2,147,483,647
unsigned char byte = 255; // 0 ~ 255
2.1.2 변수 선언 및 초기화
C++에서는 변수를 여러 가지 방식으로 선언하고 초기화할 수 있습니다:
기본 선언 및 초기화
// 선언만 하기
int number; // 값이 정의되지 않은 상태 (쓰레기값 포함)
// 선언 후 초기화
int count;
count = 20;
// 선언과 동시에 초기화
int value = 30; // 할당 초기화
int score(90); // 직접 초기화
C++11 이후의 유니폼 초기화
C++11에서 도입된 중괄호 초기화는 더 일관된 초기화 방법을 제공합니다:
int x{10}; // 직접 리스트 초기화
int y = {20}; // 복사 리스트 초기화
int arr[3]{1, 2, 3}; // 배열 초기화
// 유니폼 초기화의 장점: 데이터 손실 방지
// int narrowingError = {2.5}; // 컴파일 오류: 축소 변환
int allowNarrowing = 2.5; // 경고만 발생: 2로 잘림
여러 변수 한번에 선언하기
int a = 1, b = 2, c = 3; // 같은 타입의 여러 변수
int d, e = 5; // d는 초기화되지 않음, e는 5
2.1.3 상수
상수는 프로그램 실행 중에 값이 변경되지 않는 변수입니다. C++에서는 여러 종류의 상수가 있습니다:
const 키워드
const int MAX_USERS = 100; // 변경 불가능한 상수
// MAX_USERS = 200; // 컴파일 오류
// 포인터와 const
const int* ptr1; // 포인터가 가리키는 데이터가 상수
int* const ptr2 = &value; // 포인터 자체가 상수
const int* const ptr3; // 둘 다 상수
constexpr 키워드 (C++11)
constexpr은 컴파일 타임에 값이 결정되는 상수 표현식을 정의합니다:
constexpr double PI = 3.14159265359;
constexpr int square(int x) { return x * x; } // 컴파일 타임 함수
// 사용 예
constexpr int result = square(5); // 컴파일 타임에 계산: 25
#define 매크로 (권장하지 않음)
#define PI 3.14159265359 // 전처리기 매크로로 정의된 상수
주의: #define은 단순 텍스트 대체이므로 타입 검사가 없고 디버깅이 어려워 const나 constexpr을 권장합니다.
열거형 상수
// 전통적인 열거형
enum Color { RED, GREEN, BLUE }; // RED=0, GREEN=1, BLUE=2
// 범위 지정 열거형 (C++11)
enum class Fruit : int { APPLE, BANANA, ORANGE };
2.1.4 자료형 변환
암시적 변환 (자동 형변환)
int i = 10;
double d = i; // int -> double: 안전한 변환
char c = 65; // int -> char: 'A'
int j = 3.14; // double -> int: 데이터 손실 (j = 3)
명시적 변환 (타입 캐스팅)
// C 스타일 캐스팅
double pi = 3.14159;
int intPi = (int)pi; // 3
// C++ 스타일 캐스팅
int intPi2 = static_cast<int>(pi); // 더 안전하고 명확한 방법
C++에서는 다음 4가지 타입의 캐스팅 연산자를 제공합니다:
- static_cast: 컴파일 타임에 형 검사를 수행하는 가장 일반적인 타입 변환
- dynamic_cast: 다형성 클래스 간의 안전한 다운캐스팅
- const_cast: const 또는 volatile 속성 제거
- reinterpret_cast: 포인터 간의 위험한 변환
double value = 3.14;
int valueInt = static_cast<int>(value); // 3
const int constValue = 10;
int* nonConstPtr = const_cast<int*>(&constValue); // const 제거
int* ptr = new int(5);
long address = reinterpret_cast<long>(ptr); // 포인터를 정수로 변환