[ C++ ] 기초 정리 2. 자료형과 연산자
열혈강의 C++언어본색 책을 보면서 정리한 자료입니다.
CHAPTER 2. 자료형과 연산자
2.1 변수와 상수
Def . 프로그래밍
자료를 저장하고 더하거나 비교하는 등의 연산을 하여 자료를 처리하는 과정.
프로그래밍의 기본은 자료형과 연산자들이다.
Def . 변수
프로그램이 처리한 처리대상 또는 처리 결과를 저장하는 주 기억장치의 특정 위치
변수는 이름을 지정할 때 특정 규칙들이 있다.
- 영문 소,대문자, 숫자, 밑줄(_)으로만 이름을 지정 가능 // 띄어쓰기 불가능
- 숫자는 변수 이름의 첫 글자에 들어갈수 없다
- 영문 소문자와 대문자는 구별이 된다
- 예약어는 변수 이름으로 사용 불가능 // 예약어 : 컴퓨터 언어에서 이미 약속된 단어
- 변수 이름 길이에는 제한이 없다
- 프로그래밍을 할 때는 우리가 사용하는 일반적인 단어로 하는 것이 아닌 컴퓨터의 언어로 진행을 해야 한다. 이때 사용하는 단어는 크게 두가지 이다. 예약어와 사용자 정의어로 구분이 된다. 예약어는 이미 컴퓨터 언어에서 약속된 단어이고 사용자 정의어는 말 그대로 사용자가 필요에 의해 정하는 것으로, 예약어는 사용자 정의어로 사용할 수 없다. 변수는 사용자 정의어에 해당이 된다.
Def . 상수
- 기억 장소에 저장되는 값으로 변수에 저장될 수도 있고 프로그램 코드 내에서 별도의 변수 할당 없이 사용될 수도 있다.
- 상수의 종류에는 문자와 숫자로 나누어진다. 숫자는 일반적인 표기법을 따르지만 문자의 경의 작은따옴표(‘’)로 묶어서 표기하고 문자열은 큰따옴표(“”)로 묶어서 표기한다.
Def . 선언
- 변수를 사용하기 전에 이를 알리는 작업이다. 변수가 어떤 종류의 데이터를 가지는지 유형을 설명하는 작업이다.
2.2 컴퓨터가 표현하는 데이터
- 프로그램을 작성할 떄 가장 먼저 해야 할 일은 대상 데이터를 저장할 변수와 저장되는 데이터의 성격을 결정하는 것이다. ‘성격’이란 데이터 특성에 따른 컴퓨터의 표현이나 저장 방식으로, 숫자인가 문자인가 또는 숫자라면 소수점이 있는 형태인가 아닌가 등을 구분하는 것이다.
- 기억해야 할 것은 문자는 (‘’) 또는 (“”)로 묶어서 표기했다는 것이다.
Def . 자료형 ( 데이터 형 Data Type )
데이터 특성에 따른 컴퓨터의 표현이나 저장 방식을 설명하는 형식
아래 표는 C++에서의 대표적인 자료형의 예약어다.
표기 | 내용 | 크기 |
Char | 문자 | 1Byte = 8Bit |
Double | 배정도형 실수 | 8Byte = 64Bit |
Float | 단정도형 실수 | 4Byte = 32Bit |
int | 정수 ( 컴퓨터 언어에서의 기본! ) | 4Byte = 32Bit |
- 자료형간의 연산 결과
같은 자료형의 연산 = 같은 자료형의 결과를 얻는다.
서로 다른 자료형의 연산 = 기억장소 크기가 더 큰 자료형의 결과를 얻는다.
즉 컴퓨터 자료형에 따라 데이터의 표현 방법과 연산 결과가 달라진다.
2.3 기본 자료형
- 컴퓨터 언어의 변수도 데이터 담을 수 있는 크기가 있다. 그 범위를 넘으면 정확한 값을 표현하지 못한다. 즉 변수의 크기에 따라 사용할 자료형이 구분이 된다.
표기 | 내용 | 크기 | 예시 |
Char | 문자 | 1Byte = 8Bit | ‘A’ |
Unsigned char | ??????? | 1Byte = 8Bit | ??????? |
Double | 배정도형 실수 | 8Byte = 64Bit | +-3.54326 |
Long double | 긴 배정도형 실수 | 8Byte = 64Bit | +-3.543154743 |
Float | 단정도형 실수 | 4Byte = 32Bit | +-7467.1 |
int | 정수 ( 컴퓨터 언어에서의 기본! ) | 4Byte = 32Bit | +-984 |
Short int | 짧은 정수 | 2Byte = 16Bit | +-45 |
Long int | 긴 정수 | 4Byte = 32Bit | +-5643 |
Unsigned int | 부호 없는 정수 | 4Byte = 32Bit | 872 |
Unsigned short int | 부호 없는 짧은 정수 | 2Byte = 16Bit | 43 |
Bool | 논리형 연산자 | 1Byte = 8Bit | 1(true), 0(false) |
주의 해야 할 점은 소수점이 있는 상수는 배정도형 실수 (Double) 을 기본으로 한다. 즉 선언을 안 해도 자동으로 Double로 인식
2.4 변수의 자료 범위
- 변수의 크기에 맞지 않은 자료를 입력하면 에러가 아닌 화면에 예상치 못한 값이 나온다.
- 최대값을 넘는 경우 다시 최솟값부터 진행이 된다.
- 해당 변수가 다룰 데이터의 범위가 적절한지를 꼭! 잘 판단해야 한다. 이를 해결하기 위해 형 변환이라는 작업이 있다.
2.5 형변환
- 정수형 값은 배정 도형 변수(double, float)에 할당이 가능하다. 따로 형 변환 필요 없이 가능은 하지만. 결과는 정수형의 결과를 실수형으로 표현한 데이터가 손실되어 표현된다.
- 즉 a=3, b=20 / float = c 여기서 c=b/a 를 진행하면 c=6.00000이 표현된다.
- 이러한 현상을 대비하기 위해 우리는 형 변환이 필요하다.
- 즉 오른쪽의 수식 결과를 왼쪽의 변수 자료형에 맞게 변환 작업을 하는 것이다.
- 방법은 그냥 c=b/(float) a 또는 c=b/af이라고 언급하면 끝이다.
Def . 명시적 형변환 ( Type Conversion )
- 일시적으로 형을 변환시키는 방법이다. 즉 수식 결과를 변수 자료형에 맞게 일시적으로 수식을 변환시키는 방법!
2.6 연산자
2.6.1 입출력 연산자
표기 | 내용 | 예시 |
Cout | 출력 연산자 | Cout << 출력내용; |
Cin | 입력 연산자 | Cin >> 입력내용; |
- 리다이렉션 기호인 <<, >> 이것들은 입출력 방향을 전환하라는 말이다. << 기호는 오른쪽의 내용을 왼쪽 장치로 입출력 방향을 결정한 것이다. 즉 cout << “메롱”; 은 cout 장치로 메롱을 보내라는 내용이다.
2.6.2 산술 연산자
표기 | 내용 | 예시 |
* | 곱하기 | 3*6 |
/ | 나누기 | 3/6 |
+ | 더하기 | 3+6 |
- | 빼기 | 3-6 |
% | 나머지를 구하는 연산자 | 3%2 |
- 산술 연산자는 이항 연산자 ( 두개의 연산대상을 필요로 하는 연산자 ) 이다.
2.6.3 변수 초기화와 단축 연산자
Def. 변수 초기화 ( initialization )
- 특정 변수에다가 값을 넣어 주는 작업이다. 즉 데이터를 넣어주는 작업이다.
- 이때 주의해야할 점은 변수 속에 이전에 사용했던 데이터 즉 쓰레기 값이 남아 있는데 연산자를 통해 명령을 수행한다면 ( ex. A+1 / 이때 A는 초기화 X ) 에러가 나온다.
Def. 단축 연산자
- 누적 연산 수식을 간략하게 표현하기 위해 사용하는 연산자
표기 | 내용 | 예시 |
*= | 곱셈 누적 | A*=3 : A에 3을 곱한다. |
/= | 나누기 누적 | A/=3 : A에 3을 나눈다. |
+= | 더하기 누적 | A+=3 : A에 3을 더한다. |
-= | 빼기 누적 | A-=3 : A에 3을 뺀다. |
%= | 나머지 누적 | A%=3 : 3의 나머지 구한다 |
++ | 1 누적 | A++ : A에 1을 더한다 |
-- | 1 감소 | A-- : A에 1을 뺀다 |
- 이때 ++ 와 – 연산자는 변수의 앞에 올 수도 있고 뒤에 올 수도 있다. 앞에 오는 경우 즉 ++가 전치 연산자가 되는 경우에는 변수 사용 전 1을 더하는 작업을 진행한다. 뒤에 오는 경우 즉 ++가 후치 연산자가 되는 경우에는 변수 사용 후 1을 더하는 작업을 진행한다.
2.6.4 논리형 그리고 관계 연산자, 논리 연산자
- 우리가 앞서 배운 자료형에는 논리형이라는 것이 있다. 대표적으로 bool이 있는데 이 자료형은 데이터를 true, false 즉 1과 0으로만 표현을 한다. 그렇다면 자료형 범위는 1Bit가 충분하다. 하지만 컴퓨터 자료표현은 1Byte로 이루어지기 때문에 크기는 1Byte가 된다.
표기 | 내용 | 크기 | 예시 |
Bool | 논리형 연산자 | 1Byte = 8Bit | 1(true), 0(false) |
여기서 Bool은 0이 아닌 자료는 모두 true로 표현한다. ( 컴퓨터 구조 수업을 들으면 그 이유를 알수있음.. )
Def. 관계 연산자
- 산술 연산자 외에 ‘크거나 같다’와 같이 크기를 비교하는 연산자
표기 | 내용 | 예시 |
>, < | 크다, 작다 | 10>3 : 결과는 true |
>=, <= | 크거나 같다, 작거나 같다 | 10>= 10 : 결과는 true |
== | 같다 ( = 하나만 쓰면 할당의 의미 ) | 10==9 : 결과는 false |
!= | 다르다 | 10!=10 결과는 falsa |
Def. 논리 연산자
- 두개 이상의 연산 결과에 대해 연산 결과 간의 관계에 대한 논리를 판단하는 연산자
표기 | 내용 | 예시 |
&& | 논리곱 (AND) 조건의 결과가 같아야 true | (10>3)&&(10<3) : 결과는 false |
|| | 논리합 (OR) 조건중 하나만 true 면 true | (3>10)||(10>3) : 결과는 true |
! | 논리 부정 (NOT) 하나의 항목에 대해 연산을 수행하며 부정의 의미 | !3 : 결과는 false 왜냐면 3는 0이 아니므로 true인데 부정 false |
2.6.5 비트 연산자
- 컴퓨터의 자료 표현은 바이트 단위로 수행된다. 반면 비트 연산자는 연산 단위가 자료형에 상관없이 비트 단위(2진수)로 수행이 된다.
- 비트 연산자를 사용할 때 자료 값 확인을 위해 2진법을 사용하게 되면 표현 자릿수가 길어지므로 16진법을 사용한다.
- 비트 연산자가 필요한 이유는 컴퓨터의 기본 단위인 비트를 통해서 바로 연산을 이용해서 훨씬 빠르기 때문이다.
진법 표현
표기 | 내용 | 예시 |
HEX | 16진법 출력 | Cout << hex << a; : a를 16진수로 출력 |
Dex | 10진법 출력 | Cout << dex << a; : a를 10진수로 출력 |
0x | 16진법 표기 | 0x1243 : 10진법의 1243이 아닌 16진법의 1243 |
비트 연산자
표기 | 내용 | 예시 |
>> | 오른쪽 시프트 | 111>>2 : 111을 2진수로 나타내고 오른쪽으로 2비트 이동 |
<< | 왼쪽 시프트 | 111<<2 : 111을 2진수로 나타내고 왼쪽으로 2비트 이동 |
& | 비트 논리곱 | 비트 단위(2진수)로 논리곱 수행 |
| | 비트 논리합 | 비트 단위(2진수)로 난리합 수행 |
^ | 비트 배타적 논리합 (NOR) | 비트 단위(2진수)로 배타적 논리합 수행 서로 다른값은 참, 같으면 거짓 |
~ | 비트 논리부정 | 비트 단위(2진수)로 부정 수행 |
- 이때 주의해야 할 점은 시프트 할 때 이동되어서 없어지는 부분도 있고 새로 추가되는 부분도 생긴다. 새롭게 생기는 부분에는 0으로 채워진다.
- 또한 결과를 나타낼 때 32비트에서 0번째 비트 ( 2진수의 가장 앞부분 )이 1이면 음수이다.
2.7 연산자 우선순위
- 연산자의 우선순위는 크게 산술 연산자, 관계 연산자, 논리 연산자 순이다. 비트 연산자의 경우 관계 연산자와 논리 연산자 중간에 위치하나 단항 연산자에 해당하는 ~는 산술 연산자보다 앞서 수행된다. 또한, 소괄호는 단항 연산자를 제외한 다른 연산자보다 우선된다.
- 쉽게 이야기하자면 전치 연산자보다 후치 연산자가 우선적이며, 단항 연산자는 복항 연산자보다 우선적이다. 그리고 산술 <- 관계 <- 논리 순이다.