[Rookiss C++] 자료형

황교선·2023년 3월 13일
0

cpp

목록 보기
2/19

우선 자료형을 설명하기 전에 필요한 문법과 개념들을 설명한다.

키워드

특별한 의미가 있는 미리 정의된 예약된 식별자

키워드는 컴파일러가 사용하기 위해 미리 예약해둔 단어이기 때문에 그 용도에 맞게 사용해야 한다. 용도는 나중에 천천히 알게 된다.
코드를 짤 때는 키워드와 식별자의 조합으로 이루어진다. 미리 예약된 단어인 키워드와 우리가 보기 편하게 이름을 정한다는 식별자를 통해서 문장을 구성하게 된다.

대표적인 키워드

| short | int | long | float | double |
| char | unsigned | signed | for | while |
| continue | break | if | else | class |

식별자

개체나 변수, 클래스, 구조체, 열거형식, 함수 등에 쓰이는 문자 시퀸스
다시 말해 우리가 프로그래밍할 때 무언가에 붙여주는 이름

식별자 규칙(변수의 이름 생성 규칙)

  • 영소문자, 영대문자 및 _ 로 시작하는 것은 가능
    • 소문자와 대문자는 다른 것으로 구분됨
  • 키워드는 이미 정의되어 있기 때문에 불가능
  • 숫자는 식별자의 첫 번째로 들어가는 것이 아니면 가능
    • ex) 1abc (X), a1bc (O), abc_1 (O)
  • _ 이외의 특수문자는 불가능
    • 공백도 불가능
  • 기존에 선언한 이름과 겹치는 것이 불가능

들여쓰기

  • 코드의 가독성을 위해 사용함
  • 영역이 동일한 문장들을 같은 라인에 맞춤

사용 방법

  • Tab을 누르면 현재 문장이 4칸 안쪽으로 들여씀
  • Shift + Tab을 누르면 현재 문장이 4칸 바깥으로 내어씀
    • Shift : .…을 바꾸다, 대체하다
    • Shift는 보통 반대되는 기능으로써의 키로 사용함
      ex) 웹페이지에서 스페이스바를 누르면 아래로 내려가지만 쉬프트 + 스페이스바를 하면 올라감

세미콜론

;
문장의 끝을 알려주는 기호

  • 생략하면 컴파일 에러가 발생함
  • C++은 줄바꿈이 아닌 ;으로 문장의 끝을 구분함

주석

컴파일러가 무시하지만 프로그래머에게 유용한 텍스트
프로그램에 반영되지 않는, 코드의 중간 중간 쓸 수 있는 메모

사용 방법

// 한 줄 짜리 주석, //의 뒷부분부터는 주석으로 간주된다
int a; // 이렇게 문장의 끝 뒤에도 사용할 수 있다.

/* 여러 줄로 처리할 수 있는 주석 */
/* 
여러 줄로 
처리할 수 
있는 주석
중간에 코드가 들어가 있으면 그 코드 또한 주석처리된다.
*/

// 한 줄 짜리 주석을
// 그냥 여러번
// 사용하기도 한다

컴퓨터의 정보 처리

메모리

메모리는 컴퓨터구조와 운영체제에서 많이 다루게 되겠지만, 프로그램은 실제 컴퓨터(하드웨어) 위에서 *운영체제(소프트웨어) 위에서 돌아가는 것이기 때문에 간략하게 설명한다.

*운영체제도 프로그램이다.

컴퓨터는 크게 아래 네 가지로 구성되어 있다.

  • 여러가지 연산을 위해 사용되는 CPU(비유하자면 사람)
  • 메모리(사람이 작업하는 책상 위의 화이트보드에 적은 정보들)
  • 보조기억장치(책상 옆의 여러 자료가 저장되어 있는 책장)
  • 입출력장치(사람의 목소리, 귀, 손, 행동 등)

[https://hongong.hanbit.co.kr/컴퓨터의-4가지-핵심-부품cpu-메모리-보조기억장/](https://hongong.hanbit.co.kr/%EC%BB%B4%ED%93%A8%ED%84%B0%EC%9D%98-4%EA%B0%80%EC%A7%80-%ED%95%B5%EC%8B%AC-%EB%B6%80%ED%92%88cpu-%EB%A9%94%EB%AA%A8%EB%A6%AC-%EB%B3%B4%EC%A1%B0%EA%B8%B0%EC%96%B5%EC%9E%A5/)

사람이 작업하는 모든 것을 기억하기는 쉽지 않다. 작업하는 화이트보드에 적어두고 필요 없는 정보는 지우며 화이트보드의 공간을 최대한 잘 사용해야한다. 작업하는 일이 많아질수록 화이트보드는 여러 작업의 정보들로 쌓일 것이고, 더 이상 쓸 공간이 없으면 무언가를 지워야한다.

이 중 메모리에 관해서 더 비유하자면 아래처럼 되겠다.

  • 화이트보드가 메모리
  • 화이트보드의 크기가 메모리 크기(ex) 8GB, 16GB)
  • 화이트보드에 적는 내용이 변수, 상수 등
  • 화이트보드에는 각 칸이 나누어져 있어, 어디에 있는지를 확인할 수 있는 주소(포인터 개념에서 설명)

자료형을 여러가지로 나눈 이유는 컴퓨터가 명확히 이해할 수 있으며, 이 화이트보드와 책장의 공간활용과 사람의 성능을 최대한 잘하기 위함이라고 보면 되겠다. 실수보다 정수를 더 빠르게 처리하고 덧셈과 곱셈이 나눗셈보다 더 빠르다.

데이터

bit

데이터의 최소 단위

컴퓨터가 정보를 처리하는 단위가 비트이다. 하나의 공간에 0 또는 1의 값을 저장시킴으로서 2가지의 상태로 구분할 수 있다.

Byte

정보를 처리하는 가장 작은 단위

  • 8개의 bit로 이루어짐
  • 2가지의 상태를 구분할 수 있는 bit가 8개가 모였으므로 2^8 = 256의 가짓수를 파악할 수 있음
  • bit와 Byte를 축약어로 사용할 때 bit = b, Byte = B로 사용함
    • 예를들면 USB의 전송속도나 인터넷 속도를 얘기할 때 비트 단위로 얘기할 때가 많음
    • 기가비트(Gb = Giga bit), 기가바이트(Giga Byte) 라서 둘의 차이는 8배가 남 [10Gb = 1.25GB]

자료형

데이터가 어떻게 메모리에 저장되고, 프로그램에서 어떻게 처리되어야하는지를 명시적으로 알려주는 역할

  • 형식, 타입, 데이터 타입이라고도 부름
  • 컴퓨터는 이진수를 이용하여 모든 자료형 데이터를 저장

많이 사용하는 자료형의 목록은 다음과 같다.

분류자료형크기범위출력 포맷
bool불형1Bytetrue, false
char문자형2Byte-128 ~ 127%c
unsigned char0 ~ 255%c
short정수형-32768 ~ 32767%d
unsigned short0 ~ 65535%d
int4Byte-2,147,483,648 ~ 2,147,483,647%d
unsigned int0 ~ 4,294,967,295%u
long4Byte or 8Byte-2,147,483,648 ~ 2,147,483,647 or -9,223,372,036,854,775,808 ~ 9,223,372,036,854,775,807%ld
unsigned long0 - 18,446,744,073,709,551,615%lu
float실수형4Byte-3.4 X 10^38 ~ 3.4 X 10^38%f
double8Byte-1.7 X 10^308 ~ 1.7 X 10^308%lf
  • long만 크기가 두 가지로 나뉘는 이유는 Windows 운영체제만 4Byte고 macOS, Linux 등은 8Byte다.
  • unsigned는 부호 비트를 제거하여 저장 가능한 양수 범위를 두 배로 늘이는 역할의 키워드
  • 크기는 메모리에 할당되는 크기를 의미
  • 범위는 그 자료형이 다룰 수 있는 범위를 뜻함
  • 출력 포맷은 출력문으로

부울 형식, 불형

  • boolean, bool
  • true와 false라는 두 가지 값이 존재
  • 1과 0만으로 부울 형식의 모든 데이터의 경우의 수를 나타낼 수 있어 1bit만 사용하면 되지만, 데이터 처리의 최소 단위가 1Byte이기 때문에 크기는 1Byte
  • 보통 네이밍(변수 이름 짓기)은 is 또는 has로 시작해서 참, 거짓을 판가름하는 불형이라는 것을 바로 확인할 수 있게하여 가독성을 높임
bool isMale = true;
bool isHighLevel = false;
bool hasSkill = true;

문자 형식

  • 문자 하나를 표현할 수 있는 타입
  • 컴퓨터는 2진수 밖에 인식하지 못하여 문자도 숫자로 표현해야함
    • 즉, 정수처럼 사용할 수 있음
  • 보통 ASCII(아스키코드)를 나타내는데 사용
// 문자의 의미로 작은 따옴표 ''사용
char ch1 = 'a'; // 'a' 자체가 97이라는 값과 대응됨
char ch2 = 97;
char ch3 = 'a' + 1; // 'a'는 97이기 때문에 거기에 1을 더하면 98임. 98을 뜻하는 문자는 b.

char ch4 = '1'; // 1을 뜻하는 문자의 실제 값은 49임. char ch4 = 49를 한 것과 동일
char ch5 = 49;

// Escape Sequence
// 표기하기 애매한 애들을 표현
// \t 아스키코드9 = Tab
// \n 아스키코드10 = LineFeed(한 줄 아래로)
// \r 아스키코드13 = CarriageReturn (커서 << )
  • 나중에 string 이라는 문자들이 나열된 문자열 형식을 배움

정수 형식

정수

자연수와, 자연수에 음의 기호를 붙인 음의 정수, 그리고 0을 합친 수의 모임

  • 이진수로 표현함
  • 다양한 범위의 자료형을 통해 메모리 공간을 효율적으로 사용할 수 있음
  • 최상위 비트(MSB)는 부호 비트로 사용

음수를 표현하는 방식

  1. 최상위 비트만 부호 비트로 사용
    • 단점
      • -0과 +0이 만들어짐 → 0인지를 확인하기 위해 -0과 +0 두 번을 검사해야함
        • 표현할 수 있는 한 가지 경우의 수가 낭비됨
      • 음수와 양수의 덧셈이 복잡해짐
        • 절댓값이 큰 수가 앞으로 오게하여 뺄셈을 해야함
        • 또한 MSB를 절대값이 큰 수에 맞춰주어야함
  2. 1의 보수
    • 단점
      • -0과 +0이 만들어짐 → 0인지를 확인하기 위해 -0과 +0 두 번을 검사해야함
        • 표현할 수 있는 한 가지 경우의 수가 낭비됨
      • 캐리가 발생하는 경우 모두 처리해주어야함
  3. 2의 보수
    • 컴퓨터의 음수를 표현하는 방식으로 사용

2의 보수로 표현하는 방법

  • 표현하려는 음수를 우선 양수로 나타냄
  • 그 양수에서 모든 비트를 반전시킴
  • 거기에 1을 더함
  • ex) 4비트 시스템에서의 -7 표현 방법
    • 0111 (8 0 + 4 1 + 2 1 + 1 1 = 7)
    • 1000 (모든 비트를 반전)
    • 1001 (반전된 비트에 + 1)
short s = 20;
short s2 = -345;
unsigned short s3 = 65000; // 0과 양의 정수만을 담을 수 있는 자료형

int i = 100;
int i2 = -200;

long l = 12345678;
long l2 = -12345678;

실수 형식

정수 형식 자체만으로 실수를 표현하기는 까다롭다. 그래서 실수 형식도 존재하는데 크게 두 가지이다.

  • float
  • double

부동소수점

뜰 부, 움직일 동, 소수점
소수점의 위치를 고정하지 않는다

  • 현재 우리가 사용하는 실수 형식의 표현 방식
  • 표현할 수 있는 범위가 고정소수점 방식보다 월등히 큼

[http://www.tcpschool.com/cpp/cpp_datatype_floatingPointNumber](http://www.tcpschool.com/cpp/cpp_datatype_floatingPointNumber)

#include <iostream>
#include <iomanip> // 원하는 소숫점 자릿수까지 출력하기 위해 넣은 헤더
using namespace std;

int main() 
{
    float f = 3.14159265358979323846264f;
    double d = 3.14159265358979323846264;

    cout << setprecision(20); // 원하는 소숫점 자릿수까지 출력하기 위해 설정하는 함수
    cout << f << endl;
    cout << d << endl;
}

// 출력 결과
//     3.14159265358979323846264
// f : 3.1415927410125732422
// d : 3.141592653589793116

각 자료형의 크기에 대한 코드

#include <iostream>
using namespace std;

int main() 
{
    cout << "char \t\t:" << sizeof(char) << " bytes\n";
    cout << "bool \t\t:" << sizeof(bool) << " bytes\n";
    cout << "short \t\t:" << sizeof(short) << " bytes\n";
    cout << "int \t\t:" << sizeof(int) << " bytes\n";
    cout << "long \t\t:" << sizeof(long) << " bytes\n";
    cout << "long long \t:" << sizeof(long long) << " bytes\n";
    cout << "float \t\t:" << sizeof(float) << " bytes\n";
    cout << "double \t\t:" << sizeof(double) << " bytes\n";
}

/* 출력 결과
char 		:1 bytes
bool 		:1 bytes
short 		:2 bytes
int 		:4 bytes
long 		:8 bytes
long long 	:8 bytes
float 		:4 bytes
double 		:8 bytes
*/

참고한 자료

profile
성장과 성공, 그 사이 어딘가

0개의 댓글