형 변환

-> 서로 다른 타입간의 변환

 

묵시적 형 변환

-> 사용자가 의도하지 않아도 컴파일러가 자동으로 변환해주는 것

 

명시적 형 변환

-> 사용자가 의도한 형 변환

 

형 변환 규칙

#1 대입 연산자 기준

-> 대입 연산자 기준으로 좌측 자료형으로 형 변환이 발생한다.

 

묵시적 형 변환

int i = 3.14;
// double형 3.14라는 데이터가 int형 3이라는 정수로 형 변환되서 a에 대입된다.

double b = 3;
// int형 3이라는 데이터가 double형 3.0으로 형 변환되서 b에 대입된다.

명시적 형 변환

int a = (int)3.14;
int a = int(3.14);

#2 산술 연산 시 기준 (묵시적 형 변환)

 

정수 대 실수

-> 실수 형으로 형 변환

-> cout << (3 * 3.1) << endl;

-> 9.3

 

같은 타입, 크기가 다를 경우

-> 크기가 큰 쪽으로 형 변환

예)

int a = 3; (4byte)

long long b = 20; (8byte)

타입이 같고 크기가 다르기 때문에 8byte가 나온다.

 

float a = 3.14f; (4byte)

long long b = 20; (8byte)

cout << sizeof(a + b) << endl;

타입이 다르기 때문에 4byte가 나온다.

진수란?

-> 숫자를 표현하는 방법

 

진수의 종류

10진수 0 ~ 9까지 총 10개의 숫자를 표현할 수 있다.
-> 보통 사용하는 숫자 표현
2진수 0과 1 두 가지만 사용하여 표현할 수 있다. 
-> 기계어가 2진수로 되어 있다.
8진수 0 ~ 7까지 총 8개의 숫자를 표현할 수 있다.
-> 정수 앞에 0을 붙여서 8진수라고 명시해준다.
-> 각 자리당 000 ~ 111까지 표현할 수 있다.
16진수 0 ~ 15까지 총 16개의 숫자를 표현할 수 있다. / 정수 앞에 0x를 붙여서 16진수라고 명시해준다.
-> 10이상부터는 알파벳을 사용하여 혼돈을 방지한다.
-> 각 자리당 0000 ~ 1111까지 표현할 수 있다.

진수 변환 방법

10진수 -> 2진수 : 10진수의 값을 2로 나눠서 몫이 1이 되어 나누어 지지 않을 때까지 나누어 준다.

-> 그 후에 몫 1과 나머지 값을 아래부터 위에 순서로 명시해준다.

-> 예) 90 -> 1011010

10진수 -> 8진수 : 10진수의 값을 8로 나눠서 남은 숫자가 1이 나올 떄까지 나눠준다.

-> 예) 90 -> 0132

10진수 -> 16진수 : 10진수의 값을 16으로 나눌 수 없을 때까지 나눠준다.

나눌 수 없을때 몫을 0x앞에 나머지를 몫의 뒤에 명시해준다.

-> 예) 90 -> 0x5A

 

8진수, 16진수 -> 2진수 : 각 진수의 결과 값을 2진수로 풀어서 계산해본다.

 

-> 8진수 예) 0132 = 1011010 -> 90

 

-> 16진수 예) 0x5A = 1011010 -> 90

 

연산자

-> 연산 후 결과를 반환하는 것

 

연산자 종류

산술 연산자 +, -, *, /, %
-> 이항 연산자
대입 연산자
-> 이항 연산자
-> 대입 연산자 기준 양 항은 같은 타입의 자료형이어야 한다.
-> 대입은 우측에서 좌측으로 이루어진다.
-> 연산자는 연산 후 결과를 반환하기 때문에 연속 대입이 가능하다.
sizeof연산자 자료형이나 변수가 할당된 공간에 크기를 알아보기 위해 사용한다.
-> sizeof 연산자를 이용할 경우 자료형 또는 변수의 크기를 byte단위로 확인할 수 있다.
-> 예)
cout << sizeof(char) << endl;
cout << sizeof(int) << endl;
-> 한가지 더 예를 들어보면
-> 자료형 char에 a와 b라는 변수명을 지어주고 a 값은 'A' b는 'B'로 지어준다
-> 그럼 여기서 sizeof로 크기를 확인하면 4가 나오게 된다.
-> 왜냐하면 char에는 결과 값이 정수 값으로 저장이 되기 때문이다.
논리 연산자 &&(and)
-> 이항 연산자
-> 피 연산자로 조건을 취한다.
-> 두 조건을 만족하는 경우, 또는 하나만 만족하는 경우 등을 판별할 때 사용한다.
-> 두 조건이 모두 참이어야 참이다.
-> 하나라도 거짓일 경우 거짓이 된다.
-> 단, 시작부터 거짓이 올 경우 다음 연산은 수행하지 않는다.

||(or)
-> 이항 연산자
-> 둘 중 하나라도 참이면 참.
-> 둘 다 거짓이어야만 거짓이 된다.
-> 시작부터 참이 올 경우 다음 연산은 수행하지 않는다.

!(not)
-> 단항 연산자
-> 논리 부정
-> 참과 거짓을 서로 바꾼다( true -> false, false -> true )
비트단위 연산자 -> 이항 연산자
-> 논리 연산을 수행한다.
-> 단, 비트 단위로 수행한다.
-> &(AND), |(OR), ^(XOR), !(NOT)

&(AND)
-> 논리 연산자의 AND와 동일한 역할을 수행한다.
-> 단, 비트 단위로 비교를 한다.
-> 둘 다 1일 경우 참

|(OR)
-> 둘 중 하나라도 1일 경우 참, 둘 다 0일 경우 거짓

^(XOR)
-> 두 비트가 같으면 0, 다르면 1

~(NOT)
-> 0과 1을 서로 바꿔준다.
-> 1의 보수와 같다.
비트 단위 쉬프트 연산자 <<, >>
-> 이항 연산자
-> 본 기능은 쉬프트 연산자 이지만 cout / cin과 만나면 입출력 연산자로 사용이 된다.
-> 좌측 피 연산자의 모든 비트열을 << / >> 방향으로 우측 피 연산자의 값 만큼 이동시킨다.
-> 단, 표현할 수 있는 비트를 넘어가면 값이 소실될 수 있다.
-> 또한, 부호비트가 변경될 수 있다.
-> <<은 n * 2^n 이고, >>은 n / 2^n이다.
-> 쉬프트 연산자는 정수만 연산이 가능하다.

n / 2 와 n >> 1의 차이
/ 가 * 보다 속도가 무려 10배 가까이 차이가 난다고 함
속도가 빠른 순 << -> >> -> * -> / 

정수를 표현할 때는 쉬프트 연산자를 사용하면 좋다.(속도 때문에)
실수를 표현할 때는 어쩔 수 없이 /, * 연산자를 사용한다.

사용 예)
bitset<8> a = 10, b = 0
b = a << 3;
축약 연산자 +=, -=, *=, /=, %=, <<=, >>= 등
-> 코드의 간결화를 위해서 사용한다.
증감 연산자 ++, --
-> 피 연산자의 값을 1 증가 혹은 1 감소 시켜주는 연산자
-> 단, 증감 연산자가 피 연산자 앞 또는 뒤에 붙을 경우 다르게 작동한다.

전위 증감
-> 선 증감 후 연산
++i

후위 증감
-> 선 연산 후 증감
i++

전위 증감과 후위 증감의 차이점
-> 전위 증감은 본인이 증가 후 본인을 통해 연산을 수행한다.
-> 후위 증감은 본인과 동일한 임시 객체를 만든 후 본인은 증가 임시 객체는 연산에 반영한다.
-> 전위, 후위 둘 다 사용해도 무관할 경우 전위 연산자가 더 빠르다.
단항 연산자 피 연사자 1개 
이항 연산자 피 연사자 2개
삼항 연산자 피 연사자 3개
-> 조건 ? 참일 경우 수행 : 거짓일 경우 수행

 

bitset
-> 정수를 데이터로 취한다.
-> 받은 정수를 2진수로 변환한 값을 보여준다.
-> 단, bitset을 사용하기 위해서는 #include <bitset> 의 추가가 필요하다.
사용 예)
bitset<?> : ?에 비트를 입력한다.

-> 4비트로 표시하고 싶을 때

-> bitset<4> A = 5, A = 6;

 

life-with-coding.tistory.com/298

음수와 양수 변환

-> 단순하게 부호비트를 1로 바꾼다고해서 변환이 되는 것이 아니다!!

0001  1
1001 -1
----------------------
1010  0 이 아니다.
음수와 양수를 변환하는 방법으로는 2의 보수를 취해야 된다.

 

2의 보수란?

-> 1의 보수 취한 값에 + 1 한 것. 예) 1110 -> 1111

 

1의 보수란?

-> 비트 반전

-> 0은 1로, 1은 0으로 변환하는 것. 예) 0001 -> 1110

 

음수 1을 표현하는 방법

-> 표현 범위에서 벗어나면 제외된다.

-> 예) 0001 + 1111 = 1 0000 여기서 1은 표현 범위에서 벗어났기 때문에 제외 된다. 

-> 따라서 0001(1의 보수) -> 1111(2의 보수) = 0000

 

실수 자료형의 표현 방식

->이 방식은 정수부와 소수부의 자릿수가 크지 않아 표현 범위가 매우 적다.

 

부동 소수점 방식

-> 하나의 실수를 가수부(m)와 지수부(e)로 나누어 표현하는 방식.

-> 부동 소수점의 표현 방식은 +-(1.m) * 2^(e - 127) 이다.

-> 부동 소수점은 오차가 존재하는 단점이 있다.

int main()
{
	float a = 0;

	for (int i = 0; i < 100; ++i)
		a += 0.1f;

	printf("%f", a);
}

아스키코드란?

-> 아스키코드는 128개의 문자를 표현할 수 있다.

-> 맨 앞에 1bit는 Parity Bit(패리티 비트)라고 하며, 통신 오류 검출을 위해 사용했다.

-> 패리티 비트를 제외한 7bit로는 영문 키보드로 표현할 수 있는 모든 가능성을 담았다.

-> 다른 나라에서는 7bit로 표현하기에는 부족하니 문제가 발생했다.

-> 이를 해결하기 위해 8bit 모두 사용하며, 이를 ANSI 코드라고 부르는 사람도 있다.

-> 그래도 비 유럽국가(한국, 중국)에서는 여전히 제한적이다. (256개의 문자를 사용해도 부족함)

-> 이 모든 문제를 해결하기 위해 유니코드를 추가하게 되었다.

 

아스키코드를 참조하여 Hello 출력하기

int main()
{
	char H = 72, e = 101, l = 108, o = 111;

	cout << H << e << l << l << o << "\n";
}

동일한 문자가 들어가는 경우 변수를 추가할 필요가 없다.

상수란?

-> 변하지 않고 고정되어 있는 수

 

다음과 같이 a의 값을 변경할 경우 값이 변한다.

int main()
{
	int a = 10;
	a = 999;

	cout << a << endl;

}

이런 경우 const를 자료형 앞에 명시해주면 상수로 만들 수 있다.

 

const

-> 변수 선언 시 자료형 앞에 const를 명시하면 상수가 된다.

 

int a = 10 -> const int a = 10;

 

그러면 a가 상수로 만들어졌기 때문에 수정을 할 수가 없게 된다.

상수 사용 시 주의 사항

-> 변수를 상수로 만들 경우 동시에 초기화를 진행 해줘야 된다.

-> const int a; -> const int a = 0;

-> 변수를 선언만 할 경우 쓰레기 값으로 초기화가 진행 된다.

-> 쓰레기 값이 상수가 되면 사용하지 않는 변수가 메모리에 등록되는 형식이다.

 

리터럴 상수

-> 문자 그대로의 상수 예) 1, 2, 3

-> 컴퓨터가 연산을 수행하는 곳은 CPU이다.

-> 단, 메모리에 등록된 정보를 토대로 연산을 수행한다.

-> 3과 4는 메모리에 등록되어 있지 않아 연산을 수행할 수 없는 상황이다.

-> 리터럴 상수의 연산을 수행하기 위해 임시 메모리 영역에 잠시 등록하여 연산을 수행한다.

-> 말 그대로 임시 메모리 영역이기 때문에 코드라인을 벗어나는 즉시 소멸한다.

-> 연산 결과도 리터럴 상수이기 때문에 임시 메모리에 등록이 된다.

-> 다음과 같은 연산을 수행하기 위해서는 12byte의 메모리 영역이 필요하다.

-> int a = 3 + 4 -> CPU -> 임시 메모리 영역(3, 4) -> 임시 메모리 영역(7) 복사 -> a = 7

-> 결과가 나오게되면 3과 4는 코드라인에서 벗어나기 때문에 소멸이 된다.

-> 3과 4가 소멸이 되었기 때문에 사용하고 있는 메모리 영역은 12byte -> 4byte가 된다.

 

float에만 f키워드를 붙이는 이유. 예) 3.14 -> 3.14f

-> 임시 메모리 영역에 등록되는 데이터가 정수형이라면 기본 int형으로 간주한다. (4byte)

-> 임시 메모리 영역에 등록되는 데이터가 실수형이라면 기본 double형으로 간주한다. (8byte)

 

이유 추가

 

표기법

-> 변수명을 설정하는데 있어 해당 소속 규칙에 맞는 방법으로 설정하는 것.

 

표기법이 필요한 이유

-> 팀 작업을 수행하는데 있어 변수명을 일정하게 설정하여 원활한 팀작업을 하기 위해서

 

멤버변수

->m_Test;

표기법 설명
헝가리안 표기법

-> 변수명 앞에 각 자료형을 뜻하는 문자를 삽입하여 만든다.

-> 변수명만 보고도 어떤 자료형안이 알아볼 수 있도록하는 표기법

-> int iTest, float fTest

카멜 표기법 -> 변수명이 소문자로 시작, 복합어일 경우 새로 시작하는 단어는 대문자로 시작 예) playerHp
파스칼 표기법 -> 변수명이 대문자로 시작 예) PlayerHp
언더바 표기법 

-> 단어와 단어 사이에 _를 사용한다. 예) player_hp

 

cin

-> Console Input의 약자

-> 데이터를 입력할 때 사용한다. 

예)

int main()
{
	int a;

	cin >> a;

	cout << a << endl;

}

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

C++ 분기문(if, else if, else, switch)  (0) 2020.08.19
C++ 형변환  (0) 2020.08.18
C++ 진수, 연산자  (0) 2020.08.14
C++ 변수와 자료형  (0) 2020.08.12
C++ 절차지향과 객체지향, 문자열 출력, 실행 순서  (0) 2020.08.11

변수 : 메모리를 할당한 공간에 이름을 부여하는 것.

-> 할당한 메모리를 의미.

-> int a, b, c등

 

자료형 : 어떤 데이터를 저장할지, 얼마만큼 메모리 공간을 부여할지 설정하는 것.

-> int, float, double 등

 

변수에 최초로 값을 채워넣는 행위.

int PlayerHP = 100;

	// PlayerHP라는 이름을 부여받은 공간에 100이라는 정수 값을 채워 넣는다.
	PlayerHP = 100;

	// 선언과 동시에 초기화도 가능
	int PlayerHP = 100;

변수명 규칙

 

#1. 알파벳과 숫자를 조합하여 만들 수 있다.

단, 숫자가 먼저 올 수 없다.

 

int PlayerHP1; // 가능

int Player1HP; // 가능

int 1PlayerHP; // 불가능

 

#2. 변수명은 특수 문자로 만들 수 없다.

단, _는 허용된다.

int PlayerHP!; // 불가능

int PlayerHP_; // 가능

 

#3. 변수명은 대소문자를 확실히 구분한다.

int playerHp;

int PlayerHp;

 

#4 같은 이름으로 변수명을 재 선언 할 수 없다.

int PlayerHp;

int PlayerHp;

 

#5 프로그래밍에서 제공하는 기본 키워드로는 이름을 지을 수 없다.

int namespace;

 

자료형

 

#1. 기본 자료형

프로그래밍에서 기본적으로 제공하는 타입을 뜻한다.

 

#2. 사용자 정의 자료형

사용자가 자료형을 만들어서 사용한다.

 

자료형의 종류

정수 자료형, 실수 자료형, 단일 문자 자료형, 논리 자료형

 

#1. 정수 자료형

자료형 크기(byte)
short 2
int 4
long 4
long long 8

정수 자료형에 int와 long은 서로 같은 크기이다. 이유는 무엇일까?

자료형의 크기는 운영체제의 환경에 따라 변경될 수 있기 때문이다.

 

16bit 운영체제에서 int의 크기가 2byte 였는데, 32bit 운영체제로 바뀌면서 int의 크기가 4byte로 증가하였다.

 

#2. 실수 자료형

자료형 크기
float 4
double 8
long double 8

#3. 단일 문자 자료형

자료형 크기
char 1

 

#4. 논리 자료형

참과 거짓을 표현하는 자료형.

자료형 크기
bool 1

 

+ Recent posts