λ³Έλ¬Έ λ°”λ‘œκ°€κΈ°
C++ 기초

[C/C++] 2. νƒ€μž…κ³Ό μ—°μ‚°μž(Type & Operator)

by μ„œμ•„λž‘πŸ˜ 2021. 3. 12.

νƒ€μž…(Type)

λ‹€μŒμ€ C/C++μ—μ„œ μ§€μ›ν•˜λŠ” κΈ°λ³Έ 데이터 νƒ€μž…(Data Type)이닀.

  • char
  • boolean
  • short
  • int
  • long
  • float
  • double
  • pointer

κΈ°λ³Έ 데이터 νƒ€μž…μ€ ν”„λ‘œκ·Έλž¨μ—μ„œ λ³€μˆ˜λ₯Ό μ„ μ–Έν•  λ•Œ μ–Όλ§ˆλ§ŒνΌ λ©”λͺ¨λ¦¬ 곡간에 ν• λ‹Ήν•΄μ•Ό ν•˜λŠ”μ§€ λͺ…μ‹œμ μœΌλ‘œ μ„ μ–Έν•΄μ£Όμ–΄μ•Ό ν•˜λŠ” 역할이닀. PHP, 파이썬과 같은 μžλ™ νƒ€μž… μ–Έμ–΄μ˜ κ²½μš°λŠ” λ³€μˆ˜λ₯Ό μ„ μ–Έν•  λ•Œ νƒ€μž…μ„ μ§€μ •ν•˜μ§€ μ•Šμ§€λ§Œ, μ΄λŠ” νƒ€μž…μ΄ μ—†λŠ” 것이 μ•„λ‹ˆλΌ μ–Έμ–΄μ°¨μ›μ—μ„œ μžλ™μœΌλ‘œ μ§€μ •ν•΄μ£ΌλŠ” 것이닀.

 

Basic C Data Type (좜처: https://medium.com/@eitworld/c-data-type-5ab5a0773f17)

μœ„ ν‘œλŠ” Cμ–Έμ–΄μ—μ„œ μ§€μ›ν•˜λŠ” 데이터 νƒ€μž…κ³Ό 크기, 그리고 νƒ€μž…λ³„λ‘œ λ‚˜νƒ€λ‚Ό 수 μžˆλŠ” μ΅œλŒ€κ°’μ„ λ‚˜νƒ€λ‚Έλ‹€.

 

λ§Œμ•½ λ‚˜νƒ€λ‚Ό 수 μžˆλŠ” μ΅œμ†Œ/μ΅œλŒ€κ°’μ˜ λ²”μœ„λ₯Ό λ²—μ–΄λ‚œ 데이터λ₯Ό μ €μž₯ν•˜λ©΄, μ˜€λ²„ν”Œλ‘œμš°κ°€ λ°œμƒν•˜μ—¬ μ˜λ„μΉ˜ μ•Šμ€ κ²°κ³Όλ₯Ό κ°–κ²Œ λœλ‹€.

 

unsignedκ°€ 뢙은 νƒ€μž…μ€ 음수λ₯Ό ν—ˆμš©ν•˜μ§€ μ•ŠμœΌλ―€λ‘œ μ–‘μˆ˜ λ²”μœ„μ— ν•œν•΄μ„œ unsigedκ°€ 뢙지 μ•Šμ€ 같은 νƒ€μž…λ³΄λ‹€ 2λ°° 더 ν‘œν˜„ν•  수 μžˆλ‹€.

 

charλŠ” 8bit(1λ°”μ΄νŠΈ)의 크기둜 Cμ—μ„œλŠ” 보톡 λ¬Έμžμ—΄μ„ ν‘œκΈ°ν•  λ•Œ 쓰인닀. λ¬Έμžμ—΄μ΄ μ•„λ‹Œ 숫자λ₯Ό μ €μž₯해도 문제 μ—†λ‹€. 문자 ν‘œν˜„λ°©μ‹μ΄ μœ λ‹ˆμ½”λ“œκ°€ μ•„λ‹Œ λ©€ν‹°λ°”μ΄νŠΈ ν˜•μ‹μ˜ 경우, 1κΈ€μžλ‹Ή 1λ°”μ΄νŠΈμ˜ 크기λ₯Ό μ°¨μ§€ν•˜κΈ° λ•Œλ¬Έμ— charνƒ€μž…μ„ array둜 μ„ μ–Έν•˜μ—¬ μ›ν•˜λŠ” λ¬Έμžμ—΄λ‘œ μ €μž₯ν•œλ‹€.

 

booleanλŠ” μ •μˆ˜ν˜•νƒœμ˜ 1λ°”μ΄νŠΈ 크기만큼 μ €μž₯ν•  수 μžˆλ‹€.(bool이라고 μ„ μ–Έν•˜λ©°, λŒ€λΆ€λΆ„ μ°Έ/거짓을 λ‚˜νƒ€λ‚΄λŠ” true, false둜 λ‚˜νƒ€λ‚Έλ‹€)

 

shortλŠ” μ •μˆ˜ν˜•νƒœμ˜ 2λ°”μ΄νŠΈ 크기만큼 μ €μž₯ν•  수 μžˆλ‹€.

 

intλŠ” μ •μˆ˜ν˜•νƒœμ˜ 4λ°”μ΄νŠΈ 크기만큼 μ €μž₯ν•  수 μžˆλ‹€.

 

long은 μ •μˆ˜ν˜•νƒœμ˜ 8λ°”μ΄νŠΈ 크기만큼 μ €μž₯ν•  수 μžˆλ‹€.(32λΉ„νŠΈ μš΄μ˜μ²΄μ œμ—μ„œλŠ” 4λ°”μ΄νŠΈλ§ŒνΌ μ €μž₯ν•  수 μžˆλ‹€.)

 

float은 μ‹€μˆ˜ν˜•νƒœμ˜ 4λ°”μ΄νŠΈ 크기만큼 μ €μž₯ν•  수 μžˆλ‹€.

 

double은 μ‹€μˆ˜ν˜•νƒœμ˜ 8λ°”μ΄νŠΈ 크기만큼 μ €μž₯ν•  수 μžˆλ‹€.

 

pointerλ³€μˆ˜(μ„ μ–Έμ‹œ *κ°€ 뢙은 λ³€μˆ˜)λŠ” 8λ°”μ΄νŠΈ 크기만큼 μ €μž₯ν•  수 μžˆλ‹€.(32λΉ„νŠΈ μš΄μ˜μ²΄μ œμ—μ„œλŠ” 4λ°”μ΄νŠΈλ§ŒνΌ μ €μž₯ν•  수 μžˆλ‹€.)

 

 

μ—°μ‚°μž(Operator)

μ—°μ‚°μžμ˜ μ’…λ₯˜λŠ” λ‹€μŒκ³Ό κ°™λ‹€.

  • μ‚°μˆ μ—°μ‚°μž
  • λΉ„κ΅μ—°μ‚°μž
  • λ…Όλ¦¬μ—°μ‚°μž
  • λŒ€μž…μ—°μ‚°μž
  • λΉ„νŠΈμ—°μ‚°μž
  • μ¦κ°μ—°μ‚°μž

μ‚°μˆ μ—°μ‚°μž

μ‚°μˆ μ—°μ‚°μžλŠ” +, -, *, /, %와 같이 λ§μ…ˆ/λΊ„μ…ˆ/κ³±μ…ˆ/λ‚˜λˆ—μ…ˆ/λ‚˜λ¨Έμ§€ 계산과 같은 μ‚°μˆ μ μΈ ν‘œν˜„μ„ λ‚˜νƒ€λ‚Έλ‹€. μ—°μ‚°μžλ₯Ό κΈ°μ€€μœΌλ‘œ 우츑의 ν”Όμ—°μ‚°μžλ₯Ό 쒌츑의 ν”Όμ—°μ‚°μžμ— μ μš©ν•œλ‹€.

int var = 0;
int foo = var + 4;

λ³€μˆ˜ fooμ—λŠ” 0+4의 결과인 4κ°€ λ“€μ–΄μžˆλ‹€.

 

int var = 15;
int foo = var % 4;

λ³€μˆ˜ fooμ—λŠ” 15의 값을 가진 λ³€μˆ˜ varλ₯Ό 4둜 λ‚˜λˆˆ λ‚˜λ¨Έμ§€λ₯Ό μ €μž₯ν•˜κΈ° λ•Œλ¬Έμ— 3이 μ €μž₯λœλ‹€.

 

λΉ„κ΅μ—°μ‚°μž

λΉ„κ΅μ—°μ‚°μžλŠ” ==, !=, <, <=, >, >=와 같이 κ°™κ±°λ‚˜ λŒ€μ†ŒλΉ„κ΅λ₯Ό λ‚˜νƒ€λ‚Έλ‹€. λΉ„κ΅μ—°μ‚°μžμ˜ κ²°κ³ΌλŠ” true or false이닀.

bool var1 = 3 == 4;
bool var2 = 5 == 5;
bool var3 = 3 < 6;
bool var4 = 2 >= 10;

var1λΆ€ν„° κ²°κ³ΌλŠ” 0, 1, 1, 0이 될 것이닀. Cμ—μ„œ boolean을 λ‚˜νƒ€λ‚Ό λ•Œ, 거짓(false)은 0이며, 0이 μ•„λ‹Œ 값듀은 μ°Έ(true)으둜 κ°„μ£Όλœλ‹€. (trueκ°€ 1일 μˆ˜λ„ 있고 0κ³Ό 1이 μ•„λ‹Œ λ‹€λ₯Έ 수 μΌμˆ˜λ„ μžˆμŒμ„ μœ μ˜ν•˜μž)

 

!= μ—°μ‚°μžλŠ” 같지 μ•ŠμŒμ„ λ‚˜νƒ€λ‚΄κΈ° λ•Œλ¬Έμ— 3 != 4의 κ²°κ³ΌλŠ” true이닀.

 

λ…Όλ¦¬μ—°μ‚°μž

λ…Όλ¦¬μ—°μ‚°μžλŠ” ||, &&, ! 이며 AND, OR, NOTκ³Ό 같이 논리식을 νŒλ‹¨ν•˜λŠ” μ—°μ‚°μžλ‹€. 

 

&&λŠ” ν”Όμ—°μ‚°μž λͺ¨λ‘ true이면 trueλ₯Ό λ°˜ν™˜, λ‚˜λ¨Έμ§€λŠ” false λ°˜ν™˜(AND)

||λŠ” ν”Όμ—°μ‚°μž 쀑 ν•˜λ‚˜λΌλ„ true이면 true λ°˜ν™˜, λͺ¨λ‘ false일 λ•Œ false λ°˜ν™˜ (OR)

!λŠ” ν”Όμ—°μ‚°μžκ°€ true이면 falseλ₯Ό λ°˜ν™˜, false이면 trueλ₯Ό λ°˜ν™˜ (NOT)

 

bool var1 = 3 == 4;
bool var2 = 5 == 5;
bool var3 = 3 < 6;
bool var4 = 2 >= 10;

bool foo1 = var1 && var2;
bool foo2 = var2 && var3;
bool foo3 = var1 || var2;
bool foo4 = var1 || var4;
bool foo5 = !var1;

foo1λΆ€ν„° κ²°κ³ΌλŠ” 0, 1, 1, 0, 1이닀.

 

 

λŒ€μž…μ—°μ‚°μž

λŒ€μž…μ—°μ‚°μžλŠ” =, +=, -=, *=, /=, %= 이고, λŒ€μž…μ—°μ‚°μžλ₯Ό κΈ°μ€€μœΌλ‘œ 우츑의 ν”Όμ—°μ‚°μžλ₯Ό μ™Όμͺ½μ˜ ν”Όμ—°μ‚°μžμ— λŒ€μž…ν•˜λŠ” 역할을 ν•œλ‹€.

 

a = 5;
a += 2    // a = a + 2κ³Ό κ°™λ‹€
a -= 2	  // a = a - 2κ³Ό κ°™λ‹€
a *= 2	  // a = a * 2κ³Ό κ°™λ‹€
a /= 2	  // a = a / 2κ³Ό κ°™λ‹€
a %= 2	  // a = a % 2κ³Ό κ°™λ‹€

 

μ—¬κΈ°μ„œ a = 5λŠ” aλΌλŠ” μ΄λ¦„μ˜ λ³€μˆ˜ 곡간에 5λΌλŠ” 값을 λŒ€μž…ν•˜λΌλŠ” λͺ…령이닀.

a += 2λŠ” a = a + 2의 ν•¨μΆ•ν˜•μ΄λ©°, μ‚°μˆ κ³Ό λŒ€μž…μ„ λ™μ‹œμ— μ§„ν–‰ν•œλ‹€.

 

λΉ„νŠΈμ—°μ‚°μž

λΉ„νŠΈμ—°μ‚°μžλŠ” &, |, ^, ~ 이며, λΉ„νŠΈλ₯Ό κΈ°μ€€μœΌλ‘œ 논리연산을 μ§„ν–‰ν•œλ‹€. λ³€μˆ˜κ°€ λ‚˜νƒ€λ‚΄λŠ” μ‚¬μ΄μ¦ˆλ§ŒνΌ λΉ„νŠΈν¬κΈ°κ°€ 있고 λΉ„νŠΈ ν•˜λ‚˜μ”© 연산이 κ°€λŠ₯ν•˜λ‹€λŠ” μ˜λ―Έμ΄λ‹€.(int이면 4λ°”μ΄νŠΈμ΄λ―€λ‘œ 32λΉ„νŠΈμ΄κ³ , 32개의 λΉ„νŠΈλ₯Ό 각각 연산에 ν™œμš©ν•  수 μžˆλ‹€.)

 

&λŠ” ν”Όμ—°μ‚°μž λΉ„νŠΈ λͺ¨λ‘ 1이면 1을 λ°˜ν™˜, λ‚˜λ¨Έμ§€λŠ” 0 λ°˜ν™˜(AND)

|λŠ” ν”Όμ—°μ‚°μž λΉ„νŠΈ 쀑 ν•˜λ‚˜λΌλ„ 1이면 1 λ°˜ν™˜, λͺ¨λ‘ 0일 λ•Œ 0 λ°˜ν™˜ (OR)

^λŠ” ν”Όμ—°μ‚°μž λΉ„νŠΈκ°€ μ„œλ‘œ λ‹€λ₯΄λ©΄ 1 λ°˜ν™˜, κ°™μœΌλ©΄ 0λ°˜ν™˜(XOR)

~λŠ” ν”Όμ—°μ‚°μž λΉ„νŠΈλ₯Ό λ°˜μ „μ‹œν‚΄(1이면 0으둜, 0이면 1으둜)(NOT)

 

bit μ—°μ‚°μ˜ μ’…λ₯˜μ™€ 예(좜처: https://techvidvan.com/tutorials/python-bitwise-operators/)

λΉ„νŠΈμ—°μ‚°μ„ ν™•μΈν•˜λ €λ©΄ μ •μˆ˜λ‘œ ν‘œν˜„λœ ν”Όμ—°μ‚°μžλ₯Ό 2μ§„μˆ˜λ‘œ λ³€ν™˜ν•˜κ³  각 자리수의 λΉ„νŠΈλΌλ¦¬ μ—°μ‚°ν•œ ν›„ λ‹€μ‹œ 10μ§„μˆ˜λ‘œ λ³€ν™˜ν•˜λ©΄ λœλ‹€.

 

 

λΉ„νŠΈλ‹¨μœ„ μ—°μ‚°(좜처: http://www.serve.net/buz/Notes.1st.year/HTML/C1/bits.005.html)

 

 

μ‚Όν•­μ—°μ‚°μž

int var = 3;
int foo = var == 3 ? 15 : 0;

μ‚Όν•­μ—°μ‚°μžλŠ” 쑰건식 ? A : B 둜 λ‚˜νƒ€λ‚΄λ©°, 쑰건식이 true이면 Aλ₯Ό λ°˜ν™˜, false이면 Bλ₯Ό λ°˜ν™˜ν•œλ‹€.

 

 

μ—°μ‚°μž μš°μ„ μˆœμœ„

μ—°μ‚°μž μš°μ„ μˆœμœ„λŠ” μœ„μ™€ κ°™μœΌλ©°, λ”°λ‘œ μ™ΈμšΈ ν•„μš”λ„ κΈ°μ–΅ν•  ν•„μš”λ„ μ—†λ‹€. μ‚¬μš©ν•˜λ‹€λ³΄λ©΄ μ €μ ˆλ‘œ μ•Œκ²Œ 될 것이닀.

 

μ¦κ°μ—°μ‚°μž

int var = 3;
var++;
int var = 3;
var--;

증감 μ—°μ‚°μžλŠ” λŒ€μž…μ—°μ‚°μžμ˜ μ‚°μˆ κ³Ό λŒ€μž…ν•˜λŠ” +=, -=, *=, /=와 λΉ„μŠ·ν•˜λ‹€. μ¦κ°μ—°μ‚°μžμ—λŠ” ++κ³Ό --이 전뢀이닀. ++이 ν‘œν˜„ν•˜λŠ” 것은 값을 1μ”© μ¦κ°€ν•˜λŠ” 것이고 λ°˜λŒ€λ‘œ --κ°€ ν‘œν˜„ν•˜λŠ” 것은 값을 1μ”© κ°μ†Œν•˜λŠ” 것이닀. 

 

λ‹€λ§Œ ++이 λ³€μˆ˜ μ•žμ—λ„ 뢙을 수 있고 뒀에도 뢙을 수 μžˆλ‹€. μ•žμ— λΆ™μœΌλ©΄ μ „μœ„, 뒀에 λΆ™μœΌλ©΄ ν›„μœ„λΌλŠ” 이름이 λΆ™λŠ”λ‹€.(λŒ€λž΅ μ „μœ„ μ—°μ‚°, ν›„μœ„ μ—°μ‚°)

 

int var = 1;
int foo = var++;
int var = 1;
int foo = ++var;

μœ„ 두 μ˜ˆμ œμ—μ„œλŠ” μ „μœ„ μ—°μ‚°κ³Ό ν›„μœ„ μ—°μ‚°μ˜ 차이λ₯Ό 보여쀀닀.

첫 번째 μ˜ˆμ œμ—μ„œ fooλŠ” 1이고 두 번째 μ˜ˆμ œμ—μ„œ fooλŠ” 2κ°€ λŒ€μž…λœλ‹€. μ΄μœ λŠ” μ‚΄νŽ΄λ³΄λ©΄, ν›„μœ„ μ—°μ‚°(var++)의 경우 foo에 var의 값을 λŒ€μž…ν•œ 이후에 varλ₯Ό μ¦κ°€μ‹œν‚¨λ‹€. λ°˜λ©΄μ— μ „μœ„ μ—°μ‚°(++var)μ—μ„œλŠ” ++varκ°€ λ¨Όμ € μ‹€ν–‰λœ ν›„ foo에 λŒ€μž…ν•˜κΈ° λ•Œλ¬Έμ— fooμ—λŠ” 2κ°€ λŒ€μž…λœλ‹€.

 

 

μ „μœ„, ν›„μœ„μ— λ”°λΌμ„œ κ²°κ³Όκ°€ λ‹€λ₯Ό 수 μžˆμœΌλ‹ˆ 상황에 λ”°λΌμ„œ μ μ ˆν•˜κ²Œ νŒλ‹¨ν•˜μ—¬ μ‚¬μš©ν•˜μž.

 

λŒ“κΈ€