본문 바로가기
프로그래밍/C++

C++ 문법 공부 - 데이터 타입(data type)

by pentode 2018. 4. 9.

프로그래밍은 데이터를 조작하여 원하는 결과를 얻는 일련의 작업을 프로그래밍 언어로 기술하는 것이라고 할 수 있습니다. 기계를 조작하는 프로그램도 내부적으로는 특정 영역에 특정 데이터를 입력하고, 어떠한 이벤트(인터럽트)를 발생시키면, 기계가 움직이는 형태 입니다. 즉, 기본은 데이터를 다루는 것입니다. 이번에는 C++에서 데이터를 다루는 방법에 대해서 알아보겠습니다.


프로그램에서 데이터를 다루기 위해서는 데이터를 어디에 저장해두고, 그 데이터에 특정 연산을 할 수 있어야 합니다.


데이터를 저장하는곳이 변수(variable)가 되겠습니다. 그런데 C++에서 변수는 한 종류만 있는것이 아니라 저장할 수 있는 데이터의 크기, 형태, 정밀도 등에 따라 다양한 타입이 있습니다. 이것을 데이터 타입 이라고 합니다.


C++는 변수를 선언할 때 어떤 타입의 데이터를 넣을 수 있는  변수이다 라고 지정을 합니다. 이후부터 그 변수에서 다른 타입의 데이터는 넣을 수 없습니다. (예외로 암시적 형변환이라고 비슷한 유형끼리는 자동으로 타입이 변경되는 것도 있는데, 그건 나중에 알아보겠습니다.)


1. 변수 선언하기


타입명을 적고 띄우고, 변수명을 적습니다. 공백은 스페이스 탭등이 여러개 들어가도 됩니다. 콤마(,)로 구분하여 여러개를 한번에 선언할 수 있습니다.


int a;

int b, c, d;


2. 변수값 초기화


선언과 동시에 초기화 합니다. 초기화는 최초에 값을 입력한다는 뜻입니다.


int value = 0;


함수 호출 처럼 초기화 할 수 도 있습니다.


int value(0);


여러개를 한번에 초기화 할 수도 있습니다.


int a = b = c = 0;


콤마(,)로 분리해서  여러개를 초기화 할 수 도 있습니다.


int a = 0, b = 1;


선언 후에 초기화 해도 됩니다.


int a;

a = 1;


3. 데이터 타입


C++에는 아주 많은 데이터 타입이 있습니다. C++ 언어의 데이터 타입이 가지는 저장공간은 컴파일러마다 다를 수 있습니다. 이 글은 Visual Studio 2017 Community Edition 기준 입니다.


데이터 타입은 기본적으로 음수부터 양수까지의 값을 가지는데, unsigned가 지원되면 0을 포함하는 양수 만을 가지게 됩니다. 예로 int 는 음수에서 양수의 범위를 가집니다.  unsigned int 로 선언하면 양수의 값만을 가지게 됩니다.

 

형식 이름바이트기타 이름값의 범위
int

4

signed-2,147,483,648 to 2,147,483,647
unsigned int

4

unsigned0 to 4,294,967,295
__int8

1

char-128 to 127
unsigned __int8

1

unsigned char0 to 255
__int16

2

short, short int, signed short int-32,768 to 32,767
unsigned __int16

2

unsigned short, unsigned short int0 to 65,535
__int32

4

signed, signed int, int-2,147,483,648 to 2,147,483,647
unsigned __int32

4

unsigned, unsigned int0 to 4,294,967,295
__int64

8

long long, signed long long-9,223,372,036,854,775,808 to 9,223,372,036,854,775,807
unsigned __int64

8

unsigned long long0 to 18,446,744,073,709,551,615
bool

1

nonefalse or true
char

1

none-128 to 127 by default
0 to 255 when compiled by using /J 옵션
signed char

1

none-128 to 127
unsigned char

1

none0 to 255
short

2

short int, signed short int-32,768 to 32,767
unsigned short

2

unsigned short int0 to 65,535
long

4

long int, signed long int-2,147,483,648 to 2,147,483,647
unsigned long

4

unsigned long int0 to 4,294,967,295
long long

8

none (but equivalent to __int64)-9,223,372,036,854,775,808 to 9,223,372,036,854,775,807
unsigned long long

8

none (but equivalent to unsigned __int64)0 to 18,446,744,073,709,551,615
enum

varies

none
float

4

none3.4E +/- 38 (7 digits)
double

8

none1.7E +/- 308 (15 digits)
long double

same as double

noneSame as double
wchar_t

2

__wchar_t0 to 65,535

 

4. 리터럴(literal)


변수에 들어가는 변수에 값을 직접 입력할 때의 즉시값입니다. int, long은 같은 형식의 숫자를 값으로 가지고, 범위만 다른 경우 입니다. 이러한 경우에서 처럼 서로 구분할 필요가 있을때 값뒤에 표시를 하여 구분합니다. 이때 표시하는 문자는 대소문자를 구분하지 않습니다.


int a = 1;

long a = 1L; // 뒤에 L 을 붙여 표시합니다.


문자형(char)의 경우 숫자로도 표현할 수 있습니다.


char a = 'A';     // 작은 따옴표로 둘러싸 줍니다.

char a = 65;      // ASCII 코드 65는 문자 'A' 를 뜻합니다.

wchar_t a = L'A'; // wchar_t 는 유니코드는 저장합니다. 문자 리터럴 앞에 L을 붙입니다.


불리언 타입 변수는 true 와 false 두 개의 리터럴 만을 가집니다.


bool a = true;


실수형은 F를 위에 붙입니다.


float a = 1.1F;


5. 열거형(enumeration) - enum 타입


남자, 여자를 나타내는 데이터를 저장하고 싶다고 가정해 보겠습니다.


이러한 타입은 언어 자체에서 제공하지 않으므로, 정수형 숫자로 0은 남자, 1은 여자라고 정의해 두고 사용할 수 있을 것입니다. 값이 0이면 남자를 출력하고, 1이면 여자라고 출력하는 프로그램을 작성하는 것입니다.


이 방법의 단점은 코드만 봐서는 의미를 알기 힘들고 정수값은 0, 1외에도 많은 값이 있으므로 성별을 표시하는 변수에 0, 1 외에 다른 값을 입력하는 실수를 할 수 도 있을 것입니다.


그렇다면 bool 타입을 사용해서 true이면 남자, false이면 여자로 정의 해서 사용하는 것도 것도 가능하겠습니다. 이번에는 두 가지 값밖에 입력하지 못하니까 엉뚱한 값을 입력할 염려는 없습니다. 하지만 아직도 의미적으로 정확한 것은 아닙니다.


다음과 같이 enum  타입을 사용해서 정의를 해보겠습니다. 이제 Sex 라는 새로운 타입이 생성하고 Man, Woman 두 개의 값을 가지게 선언합니다.


enum Sex {Man, Woman};


이제 enum Sex 타입을 정의해서 사용할 수 있습니다. enum 타입은 함수처럼 초기화 할 수 없습니다. enum Sex a(Man); 처럼 쓸 수는 없다는 것입니다.


enum Sex a = Man;

enum Sex b = Woman;


if(a == b) { ... }


변수의 선언시 enum 을 빼고 사용할 수 도 있습니다.


Sex a = Man;


이제 각각의 의미도 명확 해졌고, 다른 값을 입력하는 오류도 발생하지 않게 되었습니다. 이 처럼 성별, 요일, 코드성 데이터등 갯수가 제한되어 있는 데이터를 표현하는데 enum 타입이 사용되어 집니다.


enum 타입에 대해서 좀 더 자세히 알아보면 위의 정의에서 Man과 Woman 은 실제로 0, 1의 값을 가집니다. 언어 내부적으로는 정수형으로 처리되는 것입니다. 값이 자동으로 붙는데 그 값을 직접 지정할 수 있습니다.


enum Sex {Man = 1, Woman };


하나씩 각각을 지정할수도 있고 위에서처럼 하나의 값을 지정하고 뒤의 값을 지정하지 않으면, 지정된 곳부터 순서대로 값이 들어가게 됩니다. Man = 1, Woman = 2 가 되는 것입니다. 하나씩 직접 지정하여 중간의 값을 건너뛰고 지정할 수도 있습니다.


enum 타입을 선언과 동시에 변수를 만다는 방법도 있습니다.


enum Sex {Man, Woman} a, b;


위와 같이 사용합니다. enum Sex 타입 변수  a, b 두 개가 선언과 동시에 만들어 졌습니다.


또 다른 사용법은 다음과 같이 타입 명칭을 지정하지 않는 것입니다.


enum {Man, Woman} a, b;


이렇게 하면 타입 이름이 없으므로 선언과 동시에 만든 변수 외에는 나중에 변수를 만들 수 없게 됩니다.


여기까지 해서 C++에서 변수와 데이터 타입에서 대해서 알아보았습니다. 다음에는 프로그램의 흐름제어(Flow Control)에 대해서 알아보겠습니다.



6.  상수(const)


변수 선언시 앞에 const 를 붙이면 상수가 됩니다. 상수는 최초 한번 값을 초기화 한 후에는 값을 변경할 수 없습니다.


const int a = 5;


또한 값의 초기화도 선언과 동시에 해야 합니다.  아래와 같이 선언과 초기화를 별도로 하려고 하면 컴파일이 되지 않습니다.


const int a;

a = 5;


이러한 상수는 Magic number라고 불리는 프로그램에서 사용되는 주요 상수를 저장하는 많이 사용됩니다.


const float pi = 3.14f;


이처럼 변하지 않는 원주율 같은 것이 예가 될 수 있겠습니다.

반응형