C++ 변수와 타입

C++Beginner
지금 연습하기

소개

이 랩에서는 C++ 의 변수와 타입을 배우게 됩니다. 변수를 정의하는 방법과 다양한 유형의 변수를 사용하는 방법을 배우게 됩니다.

내용 미리보기

컴퓨터 프로그램은 데이터를 조작 (또는 처리) 합니다. *변수 (variable)*는 처리를 위해 데이터 조각을 저장하는 데 사용됩니다. 저장된 값을 변경할 수 있기 때문에 변수라고 불립니다.

  • 변수 (Variables)
  • 식별자 (Identifiers)
  • 변수 선언 (Variable Declaration)
  • 상수 (Constants)
  • 표현식 (Expressions)
  • 할당 (Assignment)
  • 기본 타입 (Basic Types)
  • 기본 타입 및 문자열 리터럴 (Literals for Basic Types and String)

변수

*변수 (variable)*는 특정 데이터 타입을 저장하는 명명된 저장 위치입니다. 즉, 변수이름, 타입을 가지며 을 저장합니다.

  • 변수는 radius, area, age, height와 같은 이름 (또는 식별자 (identifier)) 을 갖습니다. 각 변수를 고유하게 식별하여 변수에 값을 할당하고 저장된 값을 검색하려면 이름이 필요합니다.
  • 변수는 int, double 과 같은 타입을 갖습니다.
  • 변수는 해당 특정 타입을 저장할 수 있습니다. 변수는 타입과 연결되어 있으며, 특정 타입의 값만 저장할 수 있습니다.
  • 타입은 데이터의 크기와 레이아웃, 값의 범위, 적용할 수 있는 연산 집합을 결정합니다.

다음 다이어그램은 두 가지 유형의 변수, intdouble을 보여줍니다. int 변수는 정수 (정수) 를 저장합니다. double 변수는 실수 (실수) 를 저장합니다.

image desc

식별자

*식별자 (identifier)*는 변수 (또는 함수나 클래스와 같은 다른 모든 엔티티) 의 이름을 지정하는 데 필요합니다. C++ 는 식별자에 대해 다음과 같은 규칙을 적용합니다.

  • 식별자는 대문자 및 소문자 (a-z, A-Z), 숫자 (0-9), 밑줄 "_"로 구성된 문자 시퀀스입니다.
  • 공백 (공백, 탭, 줄 바꿈) 및 기타 특수 문자 (예: +, -, *, /, '@' 등) 는 허용되지 않습니다.
  • 식별자는 문자 또는 밑줄로 시작해야 합니다. 숫자로 시작할 수 없습니다. 밑줄로 시작하는 식별자는 일반적으로 시스템 사용을 위해 예약되어 있습니다.
  • 식별자는 예약된 키워드 또는 예약된 리터럴 (예: int, double, if, else, for) 일 수 없습니다.
  • 식별자는 대소문자를 구분합니다. roseRose가 아니고, ROSE도 아닙니다.

변수 명명 규칙

변수 이름은 명사 또는 여러 단어로 구성된 명사구입니다. 첫 번째 단어는 소문자로 시작하고, 나머지 단어는 첫 글자를 대문자로 표기하며, 단어 사이에 공백이 없습니다. 예를 들어, thefontSize, roomNumber, xMaxthisIsAVeryLongVariableNamecamel-case로 알려져 있습니다.

권장 사항

  1. 자기 설명적이고 변수의 의미를 밀접하게 반영하는 이름을 선택하는 것이 중요합니다. 예를 들어, numberOfStudents 또는 numStudents와 같습니다.
  2. a, b, c, d, i, j, k, i1, j99와 같은 의미 없는 이름을 사용하지 마십시오. 좌표의 x, y, z, 인덱스의 i와 같은 일반적인 이름을 제외하고는 단일 알파벳 이름을 피하십시오.
  3. 이름이 의미를 정확하게 반영하도록 하기 위해 30 자 정도의 긴 이름을 사용하는 것도 괜찮습니다.
  4. 단수 및 복수 명사를 신중하게 사용하여 단수 및 복수 변수를 구분합니다. 예를 들어, 단일 행 번호를 참조하려면 변수 row를 사용하고, 여러 행을 참조하려면 rows를 사용합니다.

변수 선언

변수를 사용하기 전에 먼저 이름타입선언해야 하며, 다음 구문 중 하나를 사용합니다.

구문 예시
지정된 타입의 변수 선언 int option;
쉼표로 구분된 동일한 타입의 여러 변수 선언 double sum, difference, product, quotient;
변수를 선언하고 이 타입의 초기값을 할당 int magicNumber = 88;
이 타입의 초기값을 가진 여러 변수 선언 double sum = 0.0, product = 1.0;

예시

int mark1;           // int 변수 mark1 선언
mark1 = 76;          // mark1 사용
int mark2;           // int 변수 mark2 선언
mark2 = mark1 + 10;  // mark2 와 mark1 사용
double average;      // double 변수 average 선언
average = (mark1 + mark2) / 2.0;   // average, mark1 및 mark2 사용
int mark1;           // 오류: 두 번 선언
mark2 = "Hello";     // 오류: 다른 타입의 값 할당
int number;             // 선언되었지만 초기화되지 않음
cout << number << endl; // 초기화 전에 사용, 경고/오류는 없지만 예상치 못한 결과 발생.

참고:

  • C++ 에서는 변수를 사용하기 전에 변수의 이름을 선언해야 합니다.
  • C++ 는 "강력한 타입 (strongly-type)" 언어입니다. 변수는 타입을 갖습니다. 변수의 타입이 선언되면, 해당 특정 타입에 속하는 값만 저장할 수 있습니다.
  • 각 변수는 한 번만 선언할 수 있습니다.
  • C++ 에서는 사용하기 전에 선언하기만 하면 프로그램 내 어디에서든 변수를 선언할 수 있습니다.
  • 변수의 타입은 프로그램 내에서 변경할 수 없습니다.
  • 선언되었지만 초기화되지 않은 변수는 쓰레기 값을 포함합니다. C/C++ 는 초기화 전에 변수를 사용해도 경고/오류를 발생시키지 않으므로 예상치 못한 결과가 발생할 수 있습니다.

상수 (const)

상수는 const 키워드로 선언된 수정 불가능한 변수입니다. 프로그램 실행 중에는 값을 변경할 수 없습니다. 또한, const는 선언 시 초기화되어야 합니다. 예를 들어:

const double PI = 3.1415926;  // 초기화 필요

상수 명명 규칙: 밑줄로 연결된 대문자 단어를 사용합니다. 예를 들어, MIN_VALUE와 같습니다.

표현식

*표현식 (expression)*은 연산자 (operator) (예: '+', '-', '*', '/') 와 피연산자 (operand) (변수 또는 리터럴 값) 의 조합으로, 특정 타입의 단일 값을 생성하도록 평가될 수 있습니다. 예를 들어,

1 + 2 * 3           // int 7 반환

int sum, number;
sum + number        // int 값으로 평가됨

double principal, interestRate;
principal * (1 + interestRate)  // double 값으로 평가됨

할당 (=)

*할당문 (assignment statement)*은 다음을 수행합니다:

  1. 리터럴 값 (RHS) 을 변수 (LHS) 에 할당합니다; 또는
  2. 표현식 (RHS) 을 평가하고 결과 값을 변수 (LHS) 에 할당합니다.

RHS 는 값이어야 하며, LHS 는 변수 (또는 메모리 주소) 여야 합니다.

할당문의 구문은 다음과 같습니다:

구문 예시
리터럴 값 (RHS) 을 변수 (LHS) 에 할당 number = 88;
표현식 (RHS) 을 평가하고 결과를 변수 (LHS) 에 할당 sum = sum + number;

할당문은 다음과 같이 해석해야 합니다: 오른쪽에 있는 표현식 (expression) (RHS) 이 먼저 평가되어 결과 값 ( rvalue 또는 right-value 라고 함) 을 생성합니다. 그런 다음 rvalue는 왼쪽에 있는 변수 (LHS) (또는 lvalue, 즉 rvalue를 저장할 수 있는 위치) 에 할당됩니다.

기본 타입

아래 표는 기본 타입의 전형적인 크기, 최소값, 최대값을 보여줍니다. 다시 한 번 말씀드리지만, 크기는 구현에 따라 다릅니다.

범주 타입 설명 바이트 (전형적인) 최소값 (전형적인) 최대값 (전형적인)
정수 int(또는 signed int) 부호 있는 정수 (최소 16 비트) 4 (2) -2147483648 2147483647
정수 unsigned int 부호 없는 정수 (최소 16 비트) 4 (2) 0 4294967295
정수 char 문자 (구현에 따라 부호 있거나 없을 수 있음) 1
정수 signed char 문자 또는 부호 있는 작은 정수 (부호 있음 보장) 1 -128 127
정수 unsigned char 문자 또는 부호 없는 작은 정수 (부호 없음 보장) 1 0 255
정수 signed short 짧은 부호 있는 정수 (최소 16 비트) 2 -32768 32767
정수 unsigned short 부호 없는 짧은 정수 (최소 16 비트) 2 0 65535
정수 long 긴 부호 있는 정수 (최소 32 비트) 4 (8) -2147483648 2147483647
정수 unsigned long 부호 없는 긴 정수 (최소 32 비트) 4 (8) 0 위와 동일
정수 long long 매우 긴 부호 있는 정수 (최소 64 비트) 8 -2e^63 2e^63-1
정수 unsigned long long 부호 없는 매우 긴 정수 (최소 64 비트) 8 0 2e^64-1
실수 float 부동 소수점 숫자, ≈7 자리 4 3.4e^38 3.4e^(-38)
실수 double 배정밀도 부동 소수점 숫자, ≈15 자리 8 1.7e^308 1.7e^(-308)
실수 long double long double 정밀도 부동 소수점 숫자, ≈19 자리 12 (8)
부울 숫자 bool true 또는 false의 부울 값 1 false (0) true (1 또는 0 이 아닌 값)
와이드 문자 wchar_tchar16_t ,char32_t 와이드 (2 바이트) 문자 2 (4)

sizeof 연산자

C/C++ 는 피연산자의 크기 (바이트 단위) 를 얻기 위해 단항 sizeof 연산자를 제공합니다. 다음 프로그램은 sizeof 연산자를 사용하여 기본 타입의 크기를 출력합니다 (다음 코드를 /home/labex/Codetest.cpp에 저장).

/*
 * Print Size of Fundamental Types.
 */
#include <iostream>
using namespace std;

int main() {
   cout << "sizeof(char) is " << sizeof(char) << " bytes " << endl;
   cout << "sizeof(short) is " << sizeof(short) << " bytes " << endl;
   cout << "sizeof(int) is " << sizeof(int) << " bytes " << endl;
   cout << "sizeof(long) is " << sizeof(long) << " bytes " << endl;
   cout << "sizeof(long long) is " << sizeof(long long) << " bytes " << endl;
   cout << "sizeof(float) is " << sizeof(float) << " bytes " << endl;
   cout << "sizeof(double) is " << sizeof(double) << " bytes " << endl;
   cout << "sizeof(long double) is " << sizeof(long double) << " bytes " << endl;
   cout << "sizeof(bool) is " << sizeof(bool) << " bytes " << endl;
   return 0;
}

출력:

sizeof(char) is 1 bytes
sizeof(short) is 2 bytes
sizeof(int) is 4 bytes
sizeof(long) is 4 bytes
sizeof(long long) is 8 bytes
sizeof(float) is 4 bytes
sizeof(double) is 8 bytes
sizeof(long double) is 12 bytes
sizeof(bool) is 1 bytes

image desc

typedef 문

unsigned int를 여러 번 입력하는 것은 귀찮을 수 있습니다. typedef 문은 기존 타입에 대한 새 이름을 생성하는 데 사용할 수 있습니다. 예를 들어, "unsigned int"에 대한 "uint"라는 새 타입을 다음과 같이 만들 수 있습니다. #include 바로 뒤에 typedef를 배치해야 합니다. 프로그램의 가독성과 이해도를 떨어뜨릴 수 있으므로 typedef를 사용할 때는 주의해야 합니다.

typedef unsigned int uint;

많은 C/C++ 컴파일러는 unsigned inttypedefsize_t라는 타입을 정의합니다.

typedef unsigned int size_t;

기본 타입 및 문자열 리터럴

정수 리터럴 (integer literals)

123-456과 같은 정수는 기본적으로 int로 처리됩니다. 예를 들어,

int number = -123;
int sum = 4567;

기본 10 진수 정수 외에도, 16 진수 값에는 접두사 '0x'를, 이진수 값에는 접두사 '0b'를 사용할 수 있습니다 (일부 컴파일러에서). 예를 들어,

int number1 = 1234;       // 10 진수
int number2 = 01234;      // 8 진수 1234, 10 진수 2322
int number3 = 0x1abc;     // 16 진수 1ABC, 10 진수 15274
int number4 = 0b10001001; // 이진수 (일부 컴파일러에서는 작동하지 않을 수 있음)

long 리터럴은 접미사 'L' 또는 'l'로 식별됩니다 (숫자 1 과 혼동될 수 있으므로 소문자는 피하십시오). long long int는 접미사 'LL'로 식별됩니다. 또한 unsigned int에는 접미사 'U'를, unsigned long에는 'UL'을, unsigned long long int에는 'ULL'을 사용할 수 있습니다. 예를 들어,

long number = 12345678L;     // long 에 대한 접미사 'L'
long sum = 123;              // int 123 은 long 123L 로 자동 캐스팅됨
long long bigNumber = 987654321LL;  // long long int 에는 접미사 'LL' 필요

short 리터럴에는 접미사가 필요하지 않습니다. 그러나 허용된 범위 내에서 정수 값만 사용할 수 있습니다. 예를 들어,

short midSizeNumber = -12345;

부동 소수점 리터럴 (floating-point literals)

55.66-33.44와 같은 소수점이 있는 숫자는 기본적으로 double로 처리됩니다. 또한 1.2e3, -5.5E-6과 같이 과학적 표기법으로 표현할 수도 있습니다. 여기서 e 또는 E는 10 의 거듭제곱 지수를 나타냅니다. 분수 부분 또는 지수 앞에 더하기 기호 (+) 또는 빼기 기호 (-) 를 붙일 수 있습니다. 지수는 정수여야 합니다.

float 리터럴에는 'f' 또는 'F' 접미사를 사용해야 합니다. 예를 들어, -1.2345F. 예를 들어,

float average = 55.66;      // 오류! RHS 는 double 입니다. float 에는 접미사 'f'가 필요합니다.
float average = 55.66f;

long double에는 접미사 'L' (또는 'l') 을 사용합니다.

bool 리터럴 (bool literals)

bool 리터럴은 truefalse의 두 가지뿐입니다. 예를 들어,

bool done = true;
bool gameOver = false;
int i;
if (i == 9) {   // true 또는 false 반환
   ......
}

문자 리터럴 (character literals)

인쇄 가능한 char 리터럴은 작은 따옴표 쌍으로 문자를 묶어 작성합니다. 예를 들어, 'z', '$', 및 '9'. C++ 에서 문자는 8 비트 ASCII 코드를 사용하여 표현되며, 산술 연산에서 8 비트 부호 있는 정수로 처리될 수 있습니다. 즉, char와 8 비트 부호 있는 정수는 상호 교환 가능합니다. 또한 [-128, 127] 범위의 정수를 char 변수에 할당할 수 있으며, [0, 255] 범위의 정수를 unsigned char에 할당할 수 있습니다. 예를 들어,

char letter = 'a';             // 97 과 동일
char anotherLetter = 98;       // 문자 'b'와 동일
cout << letter << endl;        // 'a' 출력
cout << anotherLetter << endl; // 숫자 대신 'b' 출력
anotherLetter += 2;            // 100 또는 'd'
cout << anotherLetter << endl; // 'd' 출력
cout << (int)anotherLetter << endl;  // 100 출력

문자열 리터럴 (string literals)

String 리터럴은 큰 따옴표 쌍으로 묶인 0 개 이상의 문자로 구성됩니다. 예를 들어, "Hello, world!", "The sum is ", "". 예를 들어,

String directionMsg = "Turn Right";
String greetingMsg = "Hello";
String statusMsg = "";             // 빈 문자열

예시 (리터럴)

/* Testing Primitive Types */
#include <iostream>
using namespace std;

int main() {
   char gender = 'm';             // char 는 작은 따옴표로 묶임
   bool isMarried = true;         // true(0 이 아닌 값) 또는 false(0)
   unsigned short numChildren = 8; // [0, 255]
   short yearOfBirth = 1945;      // [-32767, 32768]
   unsigned int salary = 88000;   // [0, 4294967295]
   double weight = 88.88;       // 소수 부분 포함
   float gpa = 3.88f;           // float 에는 접미사 'f' 필요

   // "cout <<"는 모든 타입의 값을 출력하는 데 사용될 수 있습니다.
   cout << "Gender is " << gender << endl;
   cout << "Is married is " << isMarried << endl;
   cout << "Number of children is " << numChildren << endl;
   cout << "Year of birth is " << yearOfBirth << endl;
   cout << "Salary is " << salary << endl;
   cout << "Weight is " << weight << endl;
   cout << "GPA is " << gpa << endl;
   return 0;
}

출력:

Gender is m
Is married is 1    // true
Number of children is 8
Year of birth is 1945
Salary is 88000
Weight is 88.88
GPA is 3.88

요약

이 부분에서는 몇 가지 기본 타입을 소개했습니다. 변수를 어떻게 표현하고 어떻게 연산하는지 알아야 합니다. 각 타입의 메모리 크기와 각 타입의 범위를 염두에 두십시오.