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);  // 포인터를 정수로 변환