본문 바로가기

Programming Languages/C++

기본 자료형 및 상수와 변수

기본 자료형(fundamental data types)이란 프로그래밍 언어에서 데이터를 표현하기 위한 기본적인 표현 형식이다. C++의 기본 자료형은 고정소수점 표현 방식인 정수형 자료형과 부동소수점 표현방식인 실수형 자료형으로 분류할 수 있다.

정수형 자료형에는 실제로 정수를 표현하기 위한 자료형(short int, int, long int, long long int)과 더불어 비록 숫자는 아니지만 문자를 표현하는 자료형(char), 참 거짓을 표현하는 자료형(bool)이 포함된다. short int, long int, long long int 등은 int를 생략하여 short, long, long long이라고 써도 된다. char형은 문자의 이진수 코드를 저장하므로 내부 표현은 결국 정수와 같은 고정소수점으로 볼 수 있으며, bool형의 값인 true, false는 각각 1과 0이라는 값에 해당된다. 그러므로 이 자료형들을 통틀어 정수형 자료형이라고 한다. bool형에 대해 산술 연산을 사용하는 것은 일반적이지 않지만 char, short, int, long, long long에 대해서는 사칙연산을 할 수 있어 기억공간 크기에 따른 값의 표현 범위가 다르다는 점 외에는 차이가 없다고 볼 수 있다.

bool을 제외한 정수형 자료형은 양과 음의 값을 모두 표현할 수 있다. 이러한 자료형 이름 앞에 unsigned라는 키워드를 사용하면 음수를 제외한 정수를 표현할 수 있게 된다. 양 음을 모두 표현할 수 있는 부호가 있는 정수형 자료형은 signed라는 키워드가 생략된 것이다.

 

실수형 자료형에는 flot, double, long double 등이 있다. 각 자료형을 표현하기 위한 기억공간의 크기는 sizeof(flot) ≤ sizeof(double) ≤ sizeof(long double)의 조건을 만족한다.

상수의 표현

기본 자료형의 값을 직접 표현한 것을 리터럴(literal)이라고 한다. 리터럴은 그 값을 프로그램에서 바꿀 수 없으므로 상수(constant)에 해당된다.

정수형 리터럴은 숫자를 표현하는 문자와 부호만으로 표현된다. 정수형 리터럴에는 접두사와 접미사를 사용함으로써 진법 및 구체적인 자료형을 표현할 수 있다. 접두사가 없을 경우 10진수이며, 0x나 0X는 16진수, 0을 사용할 경우 8진수, 0b나 0B를 사용할 경우 2진수이다. u나 U를 접미사로 사용할 경우 unsigned 정수형을 의미한다. 추가로 l,L,ll,LL 등의 접미사를 사용할 수 있는데, 이러한 접미사가 사용되지 않은 경우 int형이며, l이나 L은 long, ll이나 LL은 long long형을 나타낸다.

문자는 ' ' 기호 사이에 한 개의 문자를 넣어 표현하거나 8진수 또는 16진수 문자 코드를 이용하여 표현한다.

  표현 의미 비고
접두사 29 10진수 29 int형
0b11101 29의 2진수 표현 0b로 시작하면 2진수
035 29의 8진수 표현 0으로 시작하면 8진수
0x1d 29의 16진수 표현 0x로 시작하면 16진수
접미사 123u unsigned형 리터럴 접미사 u, U는 unsigned형
123L long형 리터럴 접미사 l, L은 long형
123ul unsigned long 접미사의 혼합
123LL long long 접미사 ll, LL은 long long형
문자 표현 'A' 정수 65 ASCII 코드에 해당되는 정수값
'\101' 'A'와 동일 \와 8진 숫자는 8진수 문자 코드
'\x41' 'A'와 동일 \x는 16진수 문자 코드

기본 자료형의 값이 10진수 숫자와 부호 외에 소수점을 포함하거나 10의 거듭제곱을 표현하기 위한 지수 기호인 e 또는 E가 있으면 실수형으로 해석된다. 기본적으로는 double형이고, 접미사 f나 F 또는 l이나 L이 사용될 경우 각각 flot 및 long double형이다.

표현 의미 비고
1200. double형 값 1200 실수형 표현은 기본적으로 double형
1200.0
12e2 12 * 10^2 = 1200
1.2e+3 1.2 * 10^3 = 1200
12000e-1 12000 * 10^-1 = 1200
1200.0f float형 값 접미사 f, F는 float형을 의미
12e2f
1200.0l long double형 값 접미사 l, L은 long double형을 의미
12e2L

변수

변수(variable)는 프로그램이 실행되는 동안 기억하고 있어야 하는 값들을 저장하는 메모리 영역이다. 모든 변수는 사용하기 전에 미리 선언하여야 하며, 이때 만든 이름으로 변수의 값을 읽거나 저장한다. 변수는 다음과 같이 선언한다.

  • 형식 1. TypeName varName;
  • 형식 2. TypeName varName1, varName2;

여기서 TypeName은 기본 자료형을 포함한 임의의 자료형이며, varName은 사용자가 만든 변수의 이름을 나타낸다.

예) int length; , double mean, stddev;

변수를 선언할 때 그 변수의 값이 초기화되도록 할 수 있다. 초기화란 변수가 만들어질 때 지정된 값을 갖게 만드는 것이다. 초기화에는 다음과 같은 방식을 사용할 수 있다.

  • 형식 1. TypeName varName = value;
  • 형식 2. TypeName varName(value);
  • 형식 3. TypeName varName = {value};
int a = 10;
int b(20);
int c{30};
int d = 1.5; // d의 값이 1로 초기화됨
int e{1.5}; // 오류 - 축소 변환이 필요함

 

자료형 추론 ▶ 변수를 선언할 때는 그 변수가 저장할 값의 자료형을 지정해야 한다. C++11의 자료형 추론을 활용하면 변수를 초기화하는 값의 자료형에 맞게 변수를 선언할 수 있다. 자료형 추론은 auto라는 키워드를 사용한다.

예를 들어 auto i{10}; 이라는 문장에서 변수 i의 자료형을 지정하지 않았지만 초기화에 사용된 값인 10이 int형이므로 변수 i의 자료형이 int형이라고 추론한다. 이 예에서는 자료형 추론의 유용성을 실감할 수 없지만, 템플릿과 함께 사용할 경우 문장을 간결하게 작성하는 데 도움이 된다.

const 한정어 ▶ 변수의 값이 항상 고정된 값을 갖게 하려면 변수를 선언할 때 const라는 키워드를 사용한다. 예를 들어 원주율은 고정된 값으로, 값이 변하지 않는다.

const double PI {3.141592};

원의 반경을 입력받아 그 원의 면적을 계산하는 코드

#include <iostream>
using namespace std;

int main()
{
 const double PI{3.14};
 double radius;
 
 cout << "원의 반경을 입력하시오 : ";
 cin >> radius;
 double area = radius * radius * PI;
 cout << "원의 면적은 = " << area << endl;
 return 0;
 }

 

constexpr 한정어 ▶ const 한정어는 그 값을 바꾸지 않기로 한다는 의미이다. 상수를 선언할 때 이와 유사하지만 의미가 조금 다른 한정어로 constexpr이 있다. constexpr은 그 값을 컴파일할 때 평가한다는 의미이고, 이것은 실행 중 값을 평가하는 것에 비해 효율적으로 동작할 수 있게 한다. 

const와 constexpr의 차이

int a;
std::cin >> a;
const int b = 20;
const int C1 = a; // cin을 통해 입력된 a의 값으로 초기화
constexpr int C2 = a + 10; // 오류: 컴파일 시에 a의 값을 알 수 없음
constexpr int C3 = b + 100; // b + 100을 컴파일 시에 계산할 수 있음
constexpr int C4 = C1 * 2; // 오류: 컴파일 시에 C1의 값을 알 수 없음

 

함수도 constexpr로 선언할 수 있으며, 모든 인수가 constexpr인 경우 컴파일할 때 값을 구할 수 있게 하라는 의미이다.

constexpr int fac(int n) { return n > 1 ? n * f(n-1) : 1;}
void f(int x){
 constexpr int a = fac(4); // 컴파일할 때 계산
 int b = fac(x); // 실행 중 계산
 ...
 }

 

변수의 유효기간 ▶ 변수의 유효기간(lifetime)은 그 변수가 언제 만들어져서 언제 없어지는가를 나타낸다. 일반적인 변수는 자동(automatic) 또는 정적(static) 유효기간을 갖는다.

유효기간이 자동에 해당되는 변수는 함수 안에 선언된 지역변수이다(static  한정어가 지정된 지역변수는 제외함). 자동 변수는 함수가 시작될 때 생성되고, 함수를 빠져나갈 때 소멸된다. 자동 변수를 초기화하지 않는다면 변수가 어떤 초깃값을 가지고 있을지 예상할 수 없다.

유효기간이 정적인 변수는 프로그램이 동작하는 내내 존재하는 변수로, 프로그램이 시작될 때 생성되고, 프로그램이 종료될 때 소멸된다. 함수에 속하지 않는 변수인 전역변수는 정적 유효기간을 갖는다. 함수의 지역변수 중 static이 지정된 변수 역시 정적 유효기간을 갖는다. 정적 유효기간을 갖는 변수는 선언할 때 초기화하지 않았을 경우 초깃값은 0이다.

int x; // 전역변수 - 정적 유효기간
int f(){
 int y; // 지역변수 - 자동 유효기간
 static int z; // 정적 지역변수 - 정적 유효기간
 ...
 }

 

 

'Programming Languages > C++' 카테고리의 다른 글

흐름제어 구문  (0) 2020.04.20
자료형의 변환  (0) 2020.04.17
연산자  (0) 2020.04.16
키워드와 식별자  (0) 2020.04.14
C++이란  (0) 2020.02.15