따배씨++ (2.1 fundamental data type)

4956 단어 cppcpp

안녕하십니까. 김동우입니다.

2월 마지막주부터 3월 1일까지 이어진 연휴를 잘 보내고 다시 돌아왔습니다.

그럼, 공부했던 코드를 그대로 올리도록 하겠습니다.

#include <iostream>
#include <bitset>

int main() 
{
	using namespace std;

	int j = 3;
	int i = -1;
	int k = 123;
	char a = 'H';
	// 'H'를 아스키 코드로 변환 -> 0,1 전압의 차이를 나타내는 2진수로 변경
	// 1byte = 8bit, 1bit는 2^1, 2bit 2^2 의 범위를 표현 가능
	// 메모리의 주소와는 큰 관계가 없는 개념이고, 주소는 계속 변한다.
	// 타 프로그램 또한 메모리를 사용하고 있기 때문 -> chrome 등
	// x86, x64 컴파일에 따라서 또 주소 표현이 달라진다.
	// char의 경우 1byte, integer의 경우 4byte를 차지한다.(메모리를)
	// 각 자료형에 따라 차지하는 공간의 크기가 다르다.
	// 1. wchar_t는 다른 char와 문자를 저장하는 방식이 다르다.
	// 문자열을 저장하는 방식 -> string : fundamental dtype은 아니다.
	// std에 존재하는 dtype이다.

	// integer의 경우 unsigned, signed로 나뉜다.
	// signed type 내에도 char가 존재한다. - 문자열, 정수형 둘 다 된다.
	// 정수로 저장하더라도 문자로 변환해서 출력한다.
	// unsigned - 양의 정수와 0
	// signed - 음의 정수와 양의정수, 0
	// 수학에서 음, 양의 정수를 말할 때 기본적으로 0은 제외된 상태이다.
	// signed와 unsigned는 동일한 bit를 가진다. 
	// 그렇다면 unsigned의 경우 양의 정수 범위가 늘어나는가?
	// signed의 경우 생략이 가능한 자료형이 존재한다.
	// short, int, long, long long이 그에 해당한다.
	// unsigned 의 경우에도 int는 생략할 수 있다.
	// 해당 자료형은 최대 크기를 제한하지 않고, 최소 크기만을 제한한다.
	// 컴파일러에 따라 자료형의 범위가 달라질 수 있다.

	// 부동소수점 (float, double, long double) 개념은 후에 다시 나온다.
	// 정밀도의 차이를 나타내기 때문에 float과 double의 차이가 있다.
	// 단정밀도 - 배정밀도 (float - double)
	
	// bool은 true, false의 형태
	// void type의 경우 no storage type이다.
	// null pointer는 후에 포인터에서 나온다.

	cout << (uintptr_t)static_cast<void*>(&a) << endl;;
	// output : 470038543108
	
	cout << (uintptr_t)static_cast<void*>(&i) << '\n' << endl;;
	// output : 470038543044
// -----------------------------------------------------------------

	bool bValue = false;

	cout << (bValue ? 'A' : 'B') <<'\n' << endl; //output : B
	// bValue -> true : 1, false : 0
	// bool 타입은 숫자로 저장된다.

	char chValue = 'A';
	char chValue2 = 65;

	cout << chValue << endl;			// output : A
	cout << (int)chValue << endl;		// output : 65
	cout << chValue2 << '\n' << endl;	// output : A
	// 문자열 저장방식 숫자 -> 숫자를 문자열로 저장 시 문자.


	float fValue = 3.141592f; 
	// float은 f를 넣어주자. 그렇지 않을 경우 compiler는 double로 인식.
	// 정밀도가 더 높은 수를 float에 넣을 경우 잘릴 수 있다고 경고한다.
	// float과 double의 차이에 대해서는 잘 알아야 한다.
	double dValue = 3.141592;
	
	cout << fValue << endl;			// output : 3.14159
	cout << dValue << '\n' << endl; // output : 3.14159
	// 출력 시 자리수가 변경되는 것은 cout에서 하는 것이고,
	// 내부적으로는 정확하게 저장할 수 있는 방식으로 저장한다.
	// 그러나 해당 dtype들은 수학적으로 완벽하지 않다.

	auto aValue = 3.141592; // double aValue로 선언
	auto aValue2 = "Apple"; // char[6], string aValue2로 선언
	// 쌍따옴표를 써야 string 선언이 가능하다.

	cout << aValue << endl;				// output : 3.14159
	cout << aValue2 << '\n' << endl;	// output : Apple
	
	cout << sizeof(aValue) << endl;				// output : 8 (x64)
	cout << sizeof(aValue2) << '\n' << endl;	// output : 8 (x64)
	// sizeof는 sizeof(dtype) or sizeof(variables) 로 사용
	// 해당 자료형이나 변수가 얼마나 byte를 차지하는지 나타낸다.

// -----------------------------------------------------------------

	int a = 123;	 // copy initialization
	int b(123);		 // direct initialization - OOP 에서 주로 사용
	int c{ 123 };	 // uniform initialization - OOP 에서 주로 사용

	// int d(3.14);		// warning - non strict : 잘릴 수 있다고 경고
	// int e{ 4.5 };	// error - strict : 불가능한 선언이다.

	// copy, direct - 실행은 시켜주지만 소실될 수 있음을 경고
	// uniform - 실행 자체를 거절한다.

	int intV1, intV2, intV3; 
	char charV1, charV2;
	// 같은 자료형의 여러 변수를 동시에 선언 가능
	// 해당 선언과 비슷하게 선언할 때, 하나의 변수만 초기화 하지 말자.
	// 초기화하려면 모두 초기화하자.
	// 변수의 선언은 변수 사용처와 가깝게 하자. - 디버깅이 편해진다.
	// 리팩토링에 있어서도 해당 방식이 상당히 편하다.
	// 현재 저의 노트처럼 해주시는 것을 의미합니다.

	return 0;
}

C++ 자료형에 관련된 노트와 코드입니다.

해당 코드를 조금 예쁘게 올리고 싶은 마음이 있지만, 지금 벨로그 글을 꾸미는 것보다는 할 일이 많기 때문에 이해해주셨으면 좋겠습니다.

오늘은 기본 개념에 대한 내용이었기 때문에, 따로 작성할 글은 더 없는 것 같습니다.

그렇기에 당장 중요한 내용은 아니지만, 제가 따로 고민했던 것을 적어보고자 합니다.

  1. w_char - char

    해당 자료형들은 문자를 나타내는 자료형입니다. 그러나 w_char의 경우 UNICODE, char의 경우 ASCII로 문자열을 저장하게 됩니다.

    이 차이에 의해 할당되는 byte가 달라지게 되며, w_char는 2byte, char의 경우 1byte의 메모리 공간을 차지하게 됩니다.

  2. unsigned 자료형의 범위는 양의 정수를 더 표현할 수 있는가?

    결론은 맞습니다.

    unsigned int의 경우 signed int의 음의 정수 범위만큼을 양의 정수로 더 표현할 수 있게 됩니다.

    즉, 0 ~ 4,294,967,295 의 범위를 가지게 되는 것이죠.

자, 그럼 이번 글은 여기까지 적겠습니다.

좋은 웹페이지 즐겨찾기