TIL

TIL 59: [컴퓨터 곡학] 기초

Deviloper😈 2021. 10. 26. 23:28

쀌 μ„Έμ…˜ λ‚΄μš©κΉŒμ§€ μ •λ¦¬ν•΄μ„œ μ—…λ‘œλ“œν•©λ‹ˆλ‹€! 역사 μˆ˜μ—… ν•˜λ“―μ΄ μ•Œλ €μ£Όμ…”μ„œ 재미있게 λ“€μ—ˆμŠ΅λ‹ˆλ‹€.

λ¬Έμžμ—΄

1 Byte = 8 Bits

λΉ„νŠΈ ν•˜λ‚˜ λ‹Ή 0κ³Ό 1둜 λ‚˜λˆ„μ–΄μ„œ ν‘œν˜„ν•  수 μžˆμŠ΅λ‹ˆλ‹€. 1 Byte, 즉 8 Bits 인 경우 256(2^8, 0~255)κ°€μ§€μ˜ 경우λ₯Ό ν‘œν˜„ν•  수 μžˆμŠ΅λ‹ˆλ‹€. 1 λ°”μ΄νŠΈ μ•ˆμ— 0κ³Ό 1둜 ν‘œν˜„ν•  수 μžˆλŠ” 8개의 칸이 μžˆλ‹€κ³  μƒκ°ν•˜μ‹œλ©΄ λ©λ‹ˆλ‹€.

ASCII μ½”λ“œλŠ” μ˜μ–΄μ™€ 숫자만 ν‘œν˜„ν•  수 μžˆλŠ” ν•œκ³„κ°€ μžˆμŠ΅λ‹ˆλ‹€. 이λ₯Ό ν•΄κ²°ν•˜κΈ° μœ„ν•΄, 그리고 μ „ μ„Έκ³„μ˜ λͺ¨λ“  문자λ₯Ό μ»΄ν“¨ν„°μ—μ„œ μΌκ΄€λ˜κ²Œ λ‹€λ£° 수 μžˆκ²Œν•˜κΈ° μœ„ν•΄ Unicodeκ°€ λ§Œλ“€μ–΄μ‘ŒμŠ΅λ‹ˆλ‹€. UnicodeλŠ” μ˜μ–΄ 뿐만 μ•„λ‹ˆλΌ λ‹€μ–‘ν•œ 언어와 심볼 등을 ν‘œν˜„ν•  수 μžˆλŠ” 문자 인코딩 λ°©λ²•μž…λ‹ˆλ‹€. μ—¬κΈ°μ„œ μΈμ½”λ”©μ΄λž€ μ–΄λ–€ λ¬Έμžλ‚˜ 기호λ₯Ό 컴퓨터가 μ΄μš©ν•  수 μžˆλŠ” μ‹ ν˜Έλ‘œ λ§Œλ“œλŠ” κ²ƒμž…λ‹ˆλ‹€. 

 

인코딩 λ°©μ‹μœΌλ‘œλŠ” 크게 UTF-8κ³Ό UTF-16이 μžˆμŠ΅λ‹ˆλ‹€. (Unicode Tranformation Format)

뒀에 λΆ™μ–΄μžˆλŠ” 숫자의 μ˜λ―ΈλŠ” 8λΉ„νŠΈ, 16λΉ„νŠΈ κΈ°μ€€μœΌλ‘œ μΈμ½”λ”©ν•œλ‹€λŠ” λœ»μž…λ‹ˆλ‹€. UTF-8은 UTF-16에 λΉ„ν•΄ λ°”μ΄νŠΈ μˆœμ„œκ°€ κ³ μ •λ˜μ–΄ 있으며, 1 byteμ—μ„œ 4 bytesκΉŒμ§€μ˜ 가변길이λ₯Ό κ°€μ§€λŠ” 인코딩 λ°©μ‹μž…λ‹ˆλ‹€. λ˜ν•œ UTF-8은 ν•œ 문자λ₯Ό λ‚˜νƒ€λ‚΄κΈ° μœ„ν•΄ 1 λ°”μ΄νŠΈλ₯Ό μ‚¬μš©ν•˜μ§€λ§Œ, UTF-16은 2λ°”μ΄νŠΈλ₯Ό μ‚¬μš©ν•©λ‹ˆλ‹€. μ΅œκ·Όμ—λŠ” λŒ€λΆ€λΆ„ UTF-8을 μ‚¬μš©ν•˜κ³  μžˆμŠ΅λ‹ˆλ‹€.

 

κ·Έλž˜ν”½

κ·Έλž˜ν”½μ—λŠ” 크게 λΉ„νŠΈλ§΅(λž˜μŠ€ν„°)κ³Ό λ²‘ν„°λ‘œ λ‚˜λ‰˜μ–΄μ§‘λ‹ˆλ‹€.

λΉ„νŠΈλ§΅(Bitmap) κ·Έλž˜ν”½μ€ λ‹€μ–‘ν•œ ν”½μ…€(점)λ“€μ˜ μ‘°ν•©μœΌλ‘œ κ·Έλ €μ§€λŠ” 이미지 ν‘œν˜„ 방식(jpg, gif, png, bmp, psd)μž…λ‹ˆλ‹€. λΉ„νŠΈλ§΅ μ΄λ―Έμ§€λŠ” μ •κ΅ν•˜κ³  ν™”λ €ν•œ ν‘œν˜„μ΄ κ°€λŠ₯ν•˜μ—¬, 주둜 사진 이미지에 주둜 μ‚¬μš©λ©λ‹ˆλ‹€. λΉ„νŠΈλ§΅ μ΄λ―Έμ§€λŠ” 크기λ₯Ό λŠ˜λ¦¬κ±°λ‚˜ 쀄이면 원본 이미지에 손상이 κ°€λŠ” 것이 νŠΉμ§•μ΄λ©°, '이미지가 κΉ¨μ‘Œλ‹€'라고 ν‘œν˜„λ˜κΈ°λ„ ν•©λ‹ˆλ‹€. 전문적인 μš©μ–΄λ‘œλŠ” 앨리어싱(aliasing)이라고 ν•©λ‹ˆλ‹€. μ΄λ―Έμ§€μ˜ λ³΅μž‘λ„μ— 따라 λ²‘ν„°λ‘œ λ³€ν™˜ν•˜λŠ” 데 였랜 μ‹œκ°„μ΄ 걸릴 수 μžˆμŠ΅λ‹ˆλ‹€.

벑터(Vector)λŠ” μ‹œμž‘μ κ³Ό 끝점을 μ—°κ²°ν•΄ μˆ˜ν•™μ  μ›λ¦¬λ‘œ Shapeλ₯Ό κ·Έλ € ν‘œν˜„ν•˜λŠ” 방식(svg, ai)을 λ§ν•©λ‹ˆλ‹€. λΉ„νŠΈλ§΅κ³Ό 달리 크기λ₯Ό ν™•λŒ€ μΆ•μ†Œν•΄λ„ ν’ˆμ§ˆ μ €ν•˜κ°€ μ—†μ–΄ 주둜 둜고 μΌλŸ¬μŠ€νŠΈμ™€ 같이 μ œν’ˆμ— μ μš©λ˜λŠ” 이미지에 μ‚¬μš©ν•©λ‹ˆλ‹€. λ˜ν•œ 큰 크기의 벑터 κ·Έλž˜ν”½μ€ μž‘μ€ 파일 μ‚¬μ΄μ¦ˆλ₯Ό μœ μ§€ν•  수 μžˆμŠ΅λ‹ˆλ‹€. κ·ΈλŸΌμ—λ„ 일반적으둜 크기가 λΉ„νŠΈλ§΅λ³΄λ‹€ ν½λ‹ˆλ‹€. μ™œλƒν•˜λ©΄ μ„ μ˜ μ‹œμž‘μ , 끝점, κ΅΅κΈ°, λΆ€λ“œλŸ¬μš΄ 정도, 컬러 λ“± λ‹€μ–‘ν•œ 데이터듀을 λ„£μ–΄μ€˜μ•Όν•˜κΈ° λ•Œλ¬Έμž…λ‹ˆλ‹€.

 

운영체제

Mac OS, Android, Ubuntu 등이 μš΄μ˜μ²΄μ œμž…λ‹ˆλ‹€. 컴퓨터λ₯Ό ν‚€λŠ” μˆœκ°„ ν•˜λ“œμ›¨μ–΄κ°€ μš΄μ˜μ²΄μ œλΌλŠ” ν”„λ‘œκ·Έλž¨μ„ μ‹€ν–‰μ‹œν‚΅λ‹ˆλ‹€. 그러면 μš΄μ˜μ²΄μ œλŠ” VS Code, Chrome, μΉ΄μΉ΄μ˜€ν†‘ λ“± μ‘μš© ν”„λ‘œκ·Έλž¨μ„ μ‹€ν–‰μ‹œν‚΅λ‹ˆλ‹€. 운영체제의 κΈ°λŠ₯μœΌλ‘œλŠ” 크게 μ•„λž˜ 세가지와 κ°™μŠ΅λ‹ˆλ‹€.

  • μ‚¬μš©μžμ—κ²Œ νŽΈλ¦¬ν•œ GUIν™˜κ²½μ„ μ œκ³΅ν•¨
  • ν•˜λ“œμ›¨μ–΄λ₯Ό μ‚¬μš©ν•  수 μžˆλ„λ‘ νŽŒμ›¨μ–΄μ™€ λ“œλΌμ΄λΈŒλ₯Ό 관리함
  • μ‘μš©ν”„λ‘œκ·Έλž¨μ„ μ‹€ν–‰ν•  수 있게 ν•΄μ€Œ

 

ν”„λ‘œμ„ΈμŠ€ (Process) / μŠ€λ ˆλ“œ (Thread) /  λ©€ν‹° μŠ€λ ˆλ“œ (Multi-thread)

μ‚¬μš©μžκ°€ μ‘μš© ν”„λ‘œκ·Έλž¨μ„ μ‹€ν–‰ν•˜λ©΄, μš΄μ˜μ²΄μ œλŠ” μ‘μš©ν”„λ‘œκ·Έλž¨μ—κ²Œ ν”„λ‘œμ„ΈμŠ€λΌλŠ” 땅을 μ€λ‹ˆλ‹€. 

μ—¬κΈ°μ„œ Chrome λΈŒλΌμš°μ €λ₯Ό 두 개 μ‹€ν–‰ν•˜λ©΄ 두 개의 ν”„λ‘œμ„ΈμŠ€κ°€ μƒμ„±λ©λ‹ˆλ‹€. 즉, ν•˜λ‚˜μ˜ μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ€ 닀쀑 ν”„λ‘œμ„ΈμŠ€λ₯Ό λ§Œλ“€κΈ°λ„ ν•©λ‹ˆλ‹€.

λ•…(ν”„λ‘œμ„ΈμŠ€)μ—μ„œ μΌν•˜λŠ” 일꾼듀이 μŠ€λ ˆλ“œλΌκ³  μƒκ°ν•˜μ‹œλ©΄ λ©λ‹ˆλ‹€.

 

μ—¬κΈ°μ„œ λ¬Έμ œλŠ” μŠ€λ ˆλ“œλŠ” ν•œλ²ˆμ— ν•œκ°€μ§€ 일밖에 λͺ»ν•©λ‹ˆλ‹€. 두가지 일을 λ™μ‹œν•  수 μ—†μŠ΅λ‹ˆλ‹€.

 

이λ₯Ό ν•΄κ²°ν•˜κΈ° μœ„ν•΄ λ©€ν‹°μŠ€λ ˆλ“œλΌλŠ” κ°œλ…μ„ λ„μž…ν–ˆμŠ΅λ‹ˆλ‹€. μ• ν”Œλ¦¬μΌ€μ΄μ…˜ λ‚΄λΆ€μ—μ„œμ˜ λ©€ν‹°νƒœμŠ€ν‚Ήμž…λ‹ˆλ‹€.

 

ν•˜μ§€λ§Œ μ—¬κΈ°μ„œλ„ λ¬Έμ œκ°€ μžˆμŠ΅λ‹ˆλ‹€. κ°œλ°œμžκ°€ 이 μ—¬λŸ¬κ°œμ˜ μŠ€λ ˆλ“œλ₯Ό ν•˜λ‚˜ν•˜λ‚˜ κ΄€λ¦¬ν•΄μ€˜μ•Ό ν•œλ‹€λŠ” μ μž…λ‹ˆλ‹€. 일일이 μ—°κ²°ν•΄μ£Όκ³ , 일일이 진행상황을 확인해야 ν•΄μ„œ λ²ˆκ±°λ‘œμ›€μ΄ μƒκ²ΌμŠ΅λ‹ˆλ‹€.

 

μ΄λŸ¬ν•œ 문제λ₯Ό ν•΄κ²°ν•˜κΈ° μœ„ν•΄ 비동기 κ°œλ…μ΄ λ„μž…λ˜μ—ˆμŠ΅λ‹ˆλ‹€. Node.jsκ°€ μ•Œμ•„μ„œ 비동기 μž‘μ—…μ„ 톡해 일꾼의 κ³ μš©λΆ€ν„° μž‘μ—…μ΄ 마무리될 λ•ŒκΉŒμ§€ κ΄€λ¦¬ν•œ ν›„, λλ‚˜κ³ λ‚˜μ„œ κ°œλ°œμžμ—κ²Œ μ•Œλ €μ€λ‹ˆλ‹€. 비동기 덕뢄에 μŠ€λ ˆλ“œλ₯Ό 효율적으둜 μ‚¬μš©ν•  수 있게 λ˜μ—ˆμŠ΅λ‹ˆλ‹€.

 

 

κ°€λΉ„μ§€ μ»¬λž™μ…˜ (Garbage Collection, GC)

λ©΄μ ‘ 단골 질문이라고 ν•©λ‹ˆλ‹€. λ©”λͺ¨λ¦¬μ—λŠ” μŠ€νƒκ³Ό νž™μ΄ μžˆμŠ΅λ‹ˆλ‹€. GCλŠ” κ·Έ 쀑 λ©”λͺ¨λ¦¬ 상 νž™μ— μžˆλŠ” 참쑰링크가 λλ‚œ 데이터λ₯Ό νšŒμˆ˜ν•˜λŠ” 것을 λ§ν•©λ‹ˆλ‹€. GCκ°€ μ€‘μš”ν•œ μ΄μœ λŠ” λ°œμƒν•˜λŠ” μˆœκ°„ μž μ‹œ λ©ˆμΆ”κΈ°μ— ν”„λ‘œκ·Έλž¨ μ‹€ν–‰μ†λ„κΉŒμ§€ 영ν–₯을 미치기 λ•Œλ¬Έμž…λ‹ˆλ‹€.

let a; // μŠ€νƒμ— μ €μž₯. a에 μ‹€μ œ μ €μž₯이 된 것은 μƒμˆ˜ 10의 μ£Όμ†Œκ°’
a = 10; // νž™μ— μ €μž₯. μ°Έμ‘° μžλ£Œν˜•
let b = 10; //a와 같은 μ£Όμ†Œκ°’

console.log("result" + a); // 이 경우, a둜 κ°€κ³  a μ•ˆμ— μžˆλŠ” 10의 μ£Όμ†Œκ°’μœΌλ‘œ κ°€μ„œ 10을 κ°€μ§€κ³  옴.

// 이후에 aλ₯Ό μ•ˆμ“΄λ‹€λ©΄, aλŠ” μ“Έλͺ¨ μ—†λŠ” μ• κ°€ 됨. 그럼 ν”„λ‘œκ·Έλž˜λ°μ—μ„œλŠ” μŠ€νƒμ„ 비움. aκ°€ 사라짐
// νž™μ— μžˆλŠ” 10의 μ£Όμ†Œκ°’ 링크 λŠμ–΄μ§. GC

 

μΊμ‹œ (Cache)

λ°μ΄ν„°λ‚˜ 값을 μ €μž₯ν•˜λŠ” 'μž„μ‹œ' λ°μ΄ν„°μž…λ‹ˆλ‹€. μ—¬κΈ°μ„œ μ€‘μš”ν•œ 것은 'ν•œλ²ˆ μš”μ²­μ„ ν•΄μ„œ λ°›μ•„μ˜¨ 데이터'μ—μ„œ λ³€ν–ˆλŠ”μ§€ μ•ˆλ³€ν–ˆλŠ”μ§€μ— 따라 μΊμ‹œ μ—¬λΆ€κ°€ κ²°μ •λ©λ‹ˆλ‹€. μ‘μš©ν”„λ‘œκ·Έλž¨λ³„λ‘œ μΊμ‹œκ°€ μ‘΄μž¬ν•˜κ³ , ν΄λΌμ΄μ–ΈνŠΈ, μ„œλ²„ λ“± λ‹€μ–‘ν•œ κ³³μ—μ„œ μΊμ‹œλŠ” μžˆμŠ΅λ‹ˆλ‹€. 

μΊμ‹œμ˜ λ°μ΄ν„°λŠ” 일반적으둜 RAM(Random Access Memory)κ³Ό 같이 λΉ λ₯΄κ²Œ μ ‘κ·Όν•  수 μžˆλŠ” ν•˜λ“œμ›¨μ–΄μ— μ €μž₯되며, μ†Œν”„νŠΈμ›¨μ–΄ ꡬ성 μš”μ†Œμ™€ ν•¨κ»˜ μ‚¬μš©λ  μˆ˜λ„ μžˆμŠ΅λ‹ˆλ‹€. μΊμ‹œλŠ” κΈ°λ³Έ μŠ€ν† λ¦¬μ§€ 계측(SSD, HDD)에 μ—‘μ„ΈμŠ€ν•˜μ—¬ 데이터λ₯Ό κ°€μ Έμ˜€λŠ” 더 느린 μž‘μ—…μ˜ μš”κ΅¬λ₯Ό 쀄이고, 데이터 κ²€μƒ‰μ˜ μ„±λŠ₯을 λ†’μž…λ‹ˆλ‹€.

μΊμ‹œμ˜ μž₯μ μœΌλ‘œλŠ” μ•„λž˜μ™€ κ°™μŠ΅λ‹ˆλ‹€

  • μ• ν”Œλ¦¬μΌ€μ΄μ…˜ μ„±λŠ₯ κ°œμ„ 
  • λ°μ΄ν„°λ² μ΄μŠ€ λΉ„μš© 절감
  • λ°±μ—”λ“œ λΆ€ν•˜ κ°μ†Œ
  • 예츑 κ°€λŠ₯ν•œ μ„±λŠ₯
  • λ°μ΄ν„°λ² μ΄μŠ€ ν•«μŠ€νŒŸ 제거
  • 읽기 μ²˜λ¦¬λŸ‰ 증가: Input/Output operations per second(IOPS)둜 HDD, SSD λ“±μ˜ 컴퓨터 μ €μž₯ μž₯치의 μ„±λŠ₯ μΈ‘μ • λ‹¨μœ„