Menu

C++ 데이터 타입: int, double, char, bool 등

C++의 기본 데이터 타입(정수, 부동소수점, char, bool)을 실용적으로 둘러봅니다. 크기, signed와 unsigned, 리터럴과 접미사, 오버플로, 그리고 올바른 타입을 고르는 방법도 함께 다룹니다.

이 페이지에는 실행 가능한 에디터가 있습니다 - 편집하고 실행하면 결과를 바로 볼 수 있습니다.

C++에서 타입이 중요한 이유

변수 페이지에서는 int age = 30;처럼 명시적인 타입으로 값을 선언했습니다. 그 타입은 단순한 꼬리표가 아닙니다 - 컴파일러에게 몇 바이트를 예약할지, 그 바이트를 어떻게 해석할지, 어떤 연산이 허용되는지를 알려줍니다. 타입을 잘못 고르면 조용히 정밀도를 잃거나, 오버플로가 나거나, 미정의 동작을 유발할 수 있습니다.

C++는 내장 타입을 몇 가지 계열로 묶습니다: 정수, 부동소수점 수, 문자 타입, 그리고 불리언입니다. 각각을 살펴본 다음 사람들이 걸려 넘어지는 규칙들을 보겠습니다.

기본 타입들

하나의 프로그램에 각 핵심 타입을 하나씩 담았습니다. 리터럴 접미사(L, f, u)와 char의 작은따옴표에 주목하세요.

bool은 기본적으로 true/false가 아니라 1 또는 0으로 출력됩니다. char는 작은따옴표를 씁니다 - 'A'는 한 문자이지만 "A"(큰따옴표)는 문자열 리터럴로, 완전히 다른 타입입니다. 이 두 실수는 초반에 매우 흔합니다.

크기는 고정되어 있지 않다

이것이 Java 같은 언어에서 온 사람에게 가장 큰 놀라움입니다. C++ 표준은 최소 크기와 상대적 순서(shortintlonglong long)만 보장합니다. 실제 크기는 컴파일러와 플랫폼에 따라 다릅니다. 항상 sizeof로 확인하세요.

전형적인 64비트 Linux 빌드에서는 int = 4, long = 8을 보게 됩니다. 하지만 64비트 Windows에서는 long이 4바이트에 불과합니다. 바로 이 이식성 격차가 long을 64비트라고 가정하는 코드를 작성하면 안 되는 이유입니다.

정확한 폭이 필요하면 <cstdint>의 고정 폭 정수 타입을 사용하세요.

파일 형식, 네트워크 프로토콜, 또는 머신마다 동일하게 동작해야 하는 모든 것에는 int32_t/int64_t를 사용하세요. 캐스트 (int)a에 주목하세요 - 8비트 타입을 스트림으로 보내면 숫자가 아니라 문자로 출력되므로, 먼저 캐스트하세요.

Signed와 unsigned

모든 정수 타입에는 두 가지 종류가 있습니다. signed 타입은 음수를 담을 수 있고, unsigned 타입은 그럴 수 없으며 음수 범위를 더 큰 양수 최댓값과 맞바꿉니다. 평범한 int는 기본적으로 signed입니다.

부호 없는 0에서 빼면 음수가 되는 대신 거대한 양수로 되돌아갑니다. 이것은 사람들을 끊임없이 함정에 빠뜨립니다 - 특히 .size()가 반환하는 size_t(부호 없는 타입)에서요.

vector<int> v = {1, 2, 3};
// 위험: v.size()는 부호가 없습니다. v가 비어 있으면 v.size() - 1이 거대한
// 숫자로 되돌아가 루프가 거의 영원히 돕니다.
for (size_t i = 0; i <= v.size() - 1; i++) { /* ... */ }

i < v.size()를 선호하고(절대 <= size() - 1을 쓰지 말 것), 아니면 범위 기반 for 루프로 문제 자체를 피하세요.

정수 오버플로는 미정의 동작이다

부호 없는 래핑(이것은 잘 정의되어 있음)과 달리, 부호 있는 정수 오버플로는 C++에서 미정의 동작입니다. 컴파일러는 무엇이든 할 수 있습니다 - 쓰레기 값을 반환하거나, 최적화로 검사를 없애거나, 충돌할 수 있습니다.

해결책은 어느 언어에서나 오버플로 함정과 같습니다: 산술을 더 넓은 타입에서 하세요. 덧셈이 64비트에서 일어나도록 + 이전에 한쪽 피연산자를 long long으로 캐스트하세요. 결과를 나중에 캐스트하는 것은 너무 늦습니다 - 오버플로는 이미 일어났습니다.

올바른 타입 고르기

대부분의 코드에서는 기본값으로 충분합니다: 정수에는 int, 소수에는 double. 이유가 있을 때만 다른 것으로 손을 뻗으세요.

타입일반적 크기사용 시점
int32비트정수의 기본값
long long64비트약 20억을 넘는 값: 타임스탬프, 큰 카운터
double64비트소수의 기본값 - 좋은 정밀도
float32비트정밀도를 희생할 수 있는 메모리가 빠듯한 배열
bool1바이트true/false 플래그
int32_t / int64_t정확함크로스플랫폼 형식, 프로토콜, 비트 조작

명심해야 할 함정이 몇 가지 있습니다. float는 유효 십진 자릿수가 약 7자리뿐이므로 0.1f + 0.2f는 정확히 0.3이 아닙니다 - 정말로 메모리를 아껴야 하는 경우가 아니라면 double을 선호하세요. 그리고 char는 플랫폼에 따라 signed일 수도 unsigned일 수도 있으므로, 원시 바이트에 대해 산술을 한다면 signed char 또는 unsigned char를 명시하세요.

다음: auto 키워드

매번 타입을 적는 것은 번거롭고, 때로는 타입이 길거나 이름 붙이기 어렵습니다. C++는 auto 키워드로 컴파일러가 타입을 추론하게 해줍니다 - auto x = 42;xint로 만들고, auto it = v.begin();은 장황한 반복자 타입을 타이핑하는 수고를 덜어줍니다. 다음 페이지에서는 auto가 코드를 더 명확하게 하는 경우와 너무 많이 감추는 경우를 다룹니다.

자주 묻는 질문

C++의 기본 데이터 타입은 무엇인가요?

기본 타입은 정수(short, int, long, long long), 부동소수점(float, double, long double), 문자 타입 char, 불리언 타입 bool입니다. 각 정수 타입은 추가로 signed 또는 unsigned가 될 수 있습니다. 그 외의 모든 것 - std::string, 배열, 직접 만든 클래스 - 은 이들 위에 만들어집니다.

C++에서 int와 long의 차이는 무엇인가요?

둘 다 정수를 저장하지만, long은 최소한 int만큼 넓다는 것이 보장됩니다(64비트 플랫폼에서는 흔히 64비트지만 Windows에서는 32비트뿐). 표준은 최소 크기만 고정하므로, 폭을 보장하려면 <cstdint>int32_t, int64_t 같은 고정 폭 타입을 사용하세요.

C++에서 int는 몇 비트인가요?

표준은 int최소 16비트임만 보장하지만, 사실상 모든 최신 데스크톱과 서버에서는 32비트입니다. 크기가 플랫폼에 따라 다르므로 절대 단정하지 마세요 - 확인하려면 sizeof(int)를 출력하거나, 정확한 폭이 필요하면 int32_t 같은 <cstdint> 타입을 사용하세요.

Coddy programming languages illustration

Coddy로 코딩 배우기

시작하기