라벨이 computer인 게시물 표시

C언어 - 개념

이미지
 안녕하세요 알렉스 입니다. C언어에 대해서 설명을 드리도록 하겠습니다.  아래 내용은 '모두를 위한 컴퓨터 과학(CS50 2019)'를 시청하고 참고하여 작성을 하였습니다. 컴퓨터는 기본적으로 2개의 숫자만 이해를 합니다. 0,1입니다. 이때 사람이 2진수로만 프로그램을 작성하게 되면 상당히 힘들어 집니다. 이때 프로그래밍 언어가 개발되면서 그나마 인간이 이해할수 있는 코드를 작성하기 시작했습니다. 물론 컴퓨터는 이진수밖에 이해를 못하는 것은 예나 지금이나 마찬가지 였습니다. 하지만 프로그래밍 언어를 기계어로 전환해 주는 어셈블리어가 있기 때문에 과거 이진수로만 프로그래밍을 했을 때보다 상당히 쉬웠습니다. 대표적인 예가 C언어 입니다. C언어는 고급언어로 많은 사람들이 사용하는 프로그래밍 언어 입니다. C언어의 특징중 하나는 CPU종류와 상관없이 컴파일을 통해서 동작시킬수 있다는 것입니다. 절차 지향 언어이며 매우 엄격한 문법을 사용합니다.  절차지향언어에 대한 설명 링크 예로 들어 정수로 지정된 변수는 오직 정수만 저장할수 있습니다. 다른 데이터(문자열, 불리언 등등)는 넣을수가 없습니다.  또한 C언어는 메모리에 접근할수 있는 언어입니다. 해당 메모리에 접근하여 CRUD가 가능합니다. 이때 주의가 필요한데 OS가 점유하고 있는 메모리를 임의로 바꿀경우 PC가 멈추거나 망가질수 있습니다. 순서도 3가지 경우만 있으면 단순한 사칙연산에서 뇌수술까지 진행을 할수 있습니다. 1. 진행 : 이전단계가 마무리 되면 다음단계로 진행을 합니다. 2. 선택 : 참과 거짓에 따라 단계가 다르게 선택됩니다. 3. 반복 : 해당 단계를 반복합니다. 정지 조건이 설정되어 있지 않다면 무한으로 반복하게 됩니다. 위 기능들은 기본적으로 C언어의 함수에 존재한다. 기본적으로 C언어는 위에서 아래로, 오른쪽에서 왼쪽으로 진행이 되기 때문에 1번 조건을 충족한다.  'if'와 'else if' 또는 'else'를 사용하여 선택을 ...

정보의 표현 : 아스키 코드(ASCII Code)

이미지
 ASCII 코드는 1963년 미국 ANSI에서 표준화한 정보교환용 7비트 부호체게 입니다. 마지막 비트는 통신에러를 검출하기 위해서 비워뒀고 나머지 7비트를 이용하여 128개의 부호를 문자로 표현하는데 사용합니다. 예로들어 숫자 1을 ASCII코드로 표현할려고 합니다. ASCII표에서 숫자 1은 10진수로 49입니다. 이를 2진수로 변환하면  0110001 입니다. 이렇듯 0부터 127번까지 128개의 부호를 나타낼수 있습니다. 그리고 ASCII표는 이미 PC에 저장되어 있기 때문에 해당 7진수를 입력받게 되면 PC내의 ASCII코드를 참조하여 문자를 표현합니다.

2진법 : 컴퓨터의 기본단위

이미지
  컴퓨터는 실질적으로 0,1이외에 숫자는 알지 못한다. 그 이유는 컴퓨터의 구조를 보면 되는데 수많은 스위치를 통해 컴퓨터가 동작되기 때문에다.  사진1) ON, OFF  스위치 1개로 표현할수 있는 정보는 2개이다. ON, OFF이다. 이를 1bit라고 표현한다. 컴퓨터의 가장 기본적인 단위 이다.  bit는 가장 단위 이지만 이것이 8개가 모이면 byte라고 표현 한다.  사진2) 8개의 bit가 모인 byte  한개의 bit는 2가지의 정보를 표현할수 있습니다. 이를 8개 모으게 되면 사진2와 같이 총 256개의 정보를 표현할수 있습니다. 하드의 용량을 확인하면 Gigabyte, Terabyte등을 들을수가 있습니다. 이는 SI표준 단위를 사용한 것으로 각 단계마다 10^3씩 증가한다고 보면 됩니다. Kilobyte : 1000 byte Megabyte : 1000000 byte Gigabyte : 1000000000 byte Terabyte : 1000000000000 byte 보통 2.5GB는 2시간 영화 한편을 저장할수 있습니다. 이렇듯 2진수를 이용하여 정보를 저장 할수 있습니다.  Comunity Discord Link

Node JS의 Non Blocking(논 블로킹)

이미지
 안녕하세요. 이번 포스트는 저번의 싱글스레드의 연장선이라고 보시면 됩니다. 참고 하실분은 이전 글 링크를 참고 해 주시기 바랍니다. Node JS의 싱글스레드 - 1 Node JS의 싱글스레드 - 2 이번 글의 주제는 Non Blocking에 대한 것입니다. 그런데 Non Blocking이전에 일단 Blocking에 대해서 알아야 합니다. 위 그림은 블로킹 상태를 말하는 것입니다. 하나의 스레드에 하나의 작업만 가능하기 때문에 다음 작업을 진행하기 위해서는 현재의 작업이 마무리 되야 되는 것입니다.  하지만 논 블로킹 방식은 요청을 받으면 바로 진행을 하고 끝나는 순서로 Client에 응답을 합니다.  저번 싱글스레드 주제로 이야기 할때 이상한 점이 있었습니다. 점원은 한명인데 어떻게 동시에 여러잔의 커피를 만드는 것에 대한 이야기 입니다. 직원으로 이야기 하면 어렵지만 Node JS에서 이야기가 달라집니다.  서버에서 CPU가 맡은 작업과 IO가 맡은 작업이 있습니다. 이때 Client에서 요청이 들어오면 CPU에서 연산을 하고 완료가 되면 이를 IO쪽으로 넘김니다. 이후 IO에서도 작업이 완료되면 다시 CPU로 보내서 마무리 하고 응답을 하게 됩니다.   NodeJS은 싱글 스레드이기 때문에 하나의 스레드로 모든 요청 작업을 감당해야 합니다. 즉 위의 그림처럼 3개의 Client의 요청이 왔을때 요청 순서 및 작업이 끝나는 순서대로 응답을 보내게 됩니다.  즉 이처럼 논 블로킹을 이용하여 Node JS서버는 상당한 효율을 발휘합니다. 하지만 고사양의 연산이 필요한 어플리케이션 인 경우 CPU에서 다른 연산을 막을수 있기 때문에 효율이 좋지 않다. 즉 상황에 맞게 사용해야 하는 것이다. 

Node JS의 싱글스레드 - 2

이미지
 안녕하세요. 이번에는 싱글 스레드로 동작되는 Node JS에 오래 걸리는 작업의 요청이 들어올때 어떻게 대응하는지를 알아보겠습니다.  이번에도 모든 요청을 받습니다. 그런데 Client2 손님의 요청사항은 다른 손님의 요청에 비해 상당히 깁니다.  일단 요청 사항에 대해서 진행을 하고 가장 짧은 아이스 아메리카노를 Client1 손님한테 드립니다.   그런데 Client2 손님한테 음료를 주는것이 아닌 Client3 손님의 음료를 먼저 줍니다. 이유는 악마의 음료의 시간이 아이스 카페라테에 비해 훨씬 길기 때문에 먼저 완료된 요청사항 순서로 진행이 되기 때문입니다. Client3손님은 Client2손님의 음료가 나올때까지 기다릴 필요없이 완료되자마자 음료를 받을수 있습니다.  이제 마지막 Client2의 손님이 원하는 음료를 받게 됩니다. 이처럼 Node JS는 모든 요청을 다 받지만 그렇다고 요청의 순서대로 응답을 하지 않습니다. 먼저 끝나는 작업 순으로 Node가 응답을 보내는 것입니다.   위 과정을 커피점으로 묘사해서 설명을 했지만 실제로는 생략된 내용이 있습니다. 자세한 내용은 다음 Node JS에 대해서 글을 작성할때 설명 드리겠습니다. 다음글 : Node JS의 Non Blocking(논 블로킹)

Node JS의 싱글스레드 - 1

이미지
 안녕하세요. 알렉스 입니다. 이번에는 Node.JS가 왜 싱글스레드를 채용하고 개념에 대해서 알아보도록 하겠습니다.  일단 스레드를 일종의 직원이라고 보면 됩니다. 스레드가 많을수록 일하는 직원이 많아지는 것인데 Node JS는 단일 스레드를 채택했습니다. 위 그림에서 Client1이 아이스 아메리카를 주문하고 있습니다. 이때 Node직원이 응답을 하고 아이스 아메리카노를 만듭니다. 첫 그림의 메뉴에서 아이스 아메리카노는 약 10초간의 시간이 소요됩니다.  10초가 지난후 Node직원은 아이스 아메리카노를 Client1에 제공을하고 이후 업무를 종류하게 됩니다. 하지만 지금은 단일 client1의 요청이고 복수의 요청이 들어오면 어떻게 될까요? 위 그림처럼 여러 client가 줄지어 요청을 할때 Node가 첫번째 client의 요청을 듣고 작업을 수행한후 완료할때까지 10초가 걸립니다. 그리고 다음 손님또한 요청을 받고 그만큼 시간이 걸립니다. 이때 마지막 손님은 앞의 모든 손님들의 주문이 완료될때까지 기다려야하는데 그렇게 되면 인내심이 바닥나서 가게를 나갈수가 있습니다.  일단 주문을 한꺼번에 받습니다. 그리고 바로 받은 요청에 대해서 작업을 실행합니다.   첫 줄의 손님은 아이스 아메리카노를 요청했기 때문에 10초만에 음료가 준비 됩니다. 두번째, 세번째 손님도 주문한 순서대로 음료를 받게 됩니다. 하지만 중간에 상당히 오래 걸리는 주문을 하게 되면 어떻게 될까요. 순차적으로 주문을 받는데 중간에 악마의 음료를 주문해서 그 뒤로 주문한 사람이 오랫동안 기다려야 할까요? 이 내용은 다음 블로그 글에서 알려드리도록 하겠습니다. 다음글 : Node JS의 싱글스레드 -2

Hash Table의 구조와 원리

이미지
 안녕하세요. 알렉스 입니다. 이번에는 Hash Table에 대해서 설명을 드리도록 하겠습니다.  일단 사과(apple)상자를 어느 구역에 넣을건지를 결정해야 합니다. 물론 표를 만들어 기록하고 넣을수도 있지만 여기서는 Hash Table 방법으로 두기로 하겠습니다.  중요한 점은 apple와 구역사이에 작업이 있어야 합니다. 즉 apple와 구역이 어떻게든 연관이 되어 있다는 뜻입니다.  일단 알파벳(소문자)을 숫자로 치환한 표입니다. 이 표는 ASCII코드표중 소문자 부분만 참고했습니다. 따라서 소문자 알파벳 뿐만 아니라 넓게 숫자, 특수문자 등도 표를 확장할수 있습니다. 하지만 여기서는 Hash Tag의 원리를 파악하는 것이므로 소문자 알파벳으로 제한하겠습니다.  위 사진은 본격적으로 apple을 숫자로 변환하는 방법을 보여주고 있습니다. 각 알파벳에 대응하는 숫자를 더한 총합을 구역의 갯수, 여기서는 4를 나눈 나머지값의 구역에 넣으면 됩니다.  사실 apple외 숫자로 변환할수 있는 어떠한 문자가 들어와도 4로 나누면 0,1,2,3 요 4개중에 하나로 들어갑니다. 이유는 4로 나눌때 나머지는 4보다 같거나 클수 없기 때문입니다. 4보다 크면 또 나누면 되기 때문입니다. 이제 저는 숫자 2를 갖고 2구역으로 사과 상자를 들고 갑니다. 이제 사과 상자 뿐만 아니라 멜론, 망고, 토마토, 바나나 상자들도 Hash Tag 계산 방법을 이용해서 넣을수 있습니다.   그런데 50년이 흐른후 제가 사과상자를 찾으려고 했는데 기억이 나지 않았습니다. 제가 갖고 있는것은 '알파벳 기호 표'입니다.   50년전에 사과상자의 Hash Tag를 계산한 방법과 같이 똑같이 계산해서 사과상자가 있는 구역을 파악합니다.  물론 Hash Tag방법을 이용하여 같은 구역에 다른 과일이 있을수 있습니다. 여기서도 검색을 해야하지만 다른 주제이므로 넘어가도록 하겠습니다. 아래는 JavaSc...

Linked List 구조 및 원리

이미지
 안녕하세요. 저번의 연장으로 이번에는 Linked List의 구조와 원리에 대해서 배우겠습니다.  커다란 창고에서 제가 바나나가 들어있는 상자를 찾고 있습니다. 이때 창고는 크게 4구역으로 나눠져 있습니다. A,B,C,D구역이고 저는 일단 A구역에 무슨 과일이 있는지 확인하기로 하고 A구역으로 갑니다.  이때 A구역에 아쉽게 바나나가 아닌 사과가 있습니다. 이때 이 사과를 head라고 합니다. 머리 부분이라는 것입니다.  또한 사과상자에 노란 포스트잇이 붙어있는데 이것은 다음 어느 구역으로 가야하는지 적혀져 있습니다. 이 노랑 포스트잇은 프로그래밍을 할때 다음 값으로 갈수 있도록 하는 주소역할을 합니다.  제가 이제 D구역으로 갔는데 망고박스 과일이 있고 포스트잇에는 B구역 이라고 적혀져 있습니다.  제가 B구역에 가도 바나나를 찾지 못하고 토마토와 C구역으로 가라는 포스트잇을 읽었습니다. 그래서 C구역으로 갔습니다.  이제야 C구역에서 바나나 박스를 찾았습니다. 그런데 포스트잇 에는 null이라고 적혀져 있습니다. 이는 마지막 구역이라는 뜻입니다. 그런 의미로 마지막을 tail이라고 부릅니다.  이 처럼 특정 데이터를 찾을때 데이터(과일) 옆의 주소(포스트잇)를 따라가는 것을 Linked List이라고 합니다. 순차적으로 찾을수 있지만 문제는 100개의 구역이 있으면 뛰어다니면서 찾아다니기가 어렵다는 것입니다. 이렇기 때문에 여러가지 자료구조 방법이 있습니다.  다음글 : Hash Table구조와 원리

Queue(큐) 구조 및 원리

이미지
 안녕하세요. 알렉스 입니다. 저번에 Stack에 대한 원리에 대해서 알아 봤는데 이번에는 Queue에 대해서 알아 보도록 하겠습니다.  예시는 Stack와 비슷합니다. Stack에 대해서 모르시는 분들은 먼저 Stack글을 읽어주시기 바랍니다. 링크는 아래쪽입니다. 링크 : Stack(쌓다)구조 및 원리  저번과 마찬가지로 과일상자를 넣을 것입니다. 다만 이번에는 자판기 안에 넣을 것입니다. 이 자판기는 한번 넣으면 돈을 넣어야지 뺄수 있습니다. 따라서 자판기가 과일박스별로 층층이 싸이지만 위에서 뺄수는 없습니다. 이제 사과박스를 자판기 안에 넣겠습니다. 이 과정을 Enqueue라고 합니다.  다음 바나나박스를 자판기 안에 넣겠습니다..  모든 과일 박스를 넣게 되면 위 사진처럼 쌓이게 됩니다. 여기서 중요한 것은 Stack처럼 위에서 뺄수가 없습니다. 즉 박스 배출구(Box Exit)를 통해서만 뺄수 있습니다.  이때 가장 위에 있는 것은(mango) Rear라고 합니다. 가장 마지막에 있는 것은(apple) Front라고 합니다. 이는 나갈때 사과 상자가 가장 앞에 있기 때문에 Front라고 하는 것입니다.  이제 자판기에 1000\을 넣고 사과 상자를 뺍니다. 이때 사과가 사라진 자리에 위에 올려져 있던 상자(망고,토마토,바나나)들이 한칸씩 내려요게 됩니다. 마찬가지로 돈을 넣어서 계속 상자를 빼다보면 마지막에 망고 박스가 나오는 것을 알수 있습니다. 이 처럼 Stack와 달리 Queue는 먼저 들어온 것이 먼저 나오는 구조로 취해져 있습니다.  다음글