정보처리기사 진법 변환을 공부하다 문득 든생각

애초에 뭔 진법이 이렇게 많냐 이거 왜쓰는거야?

10진수

우리의 손가락을 열개다

그 덕분에 우리는 숫자를 0부터 9까지 쉽게 셀 수 있다

이게 우리가 십진수를 쓰게 된 유래다

2진수

컴퓨터는 0과1로만 이루어져있다

는 사실을 알고는 있지만 컴퓨터로 0123456789 텍스트를 치면 다 나오는데

근본적으로 0과 1로 변환되어야 할 이유는 무엇일까

컴퓨터가 데이터를 보는 방법이 그 이유다

컴퓨터는 전압을 올리거나 내리는 방식으로 데이터를 표현한다

전압이 있을 때는 1, 없을 때는 0으로 표시하는 방식이 가장 간단하고 안정적이다

이렇게 그래프 상으로는 전류가 끊긴 것 같지만

사실은 이런식으로 되어있는 형태이다

 

그리고 각각의 자릿수를 Bit 비트 라고 한다

즉, 1 bit 로 표현할 수 있는것은 참, 거짓 딱 두가지이다

 

여기서 2비트로 늘리면 표현할수 있는 가지수는 2의 2승으로 4가지로 늘어난다 (0부터 3)

4비트는 2의 4승으로 16가지의 표현이 가능하다 (0부터 15)

8비트는 2의 8승으로 256가지의 표현이 가능하다 (0부터 255)

 

컴퓨터는 이 8비트를 데이터가 저장되는 최소 단위로 삼기로 했다

4개로 나뉘어진 비트의 단위를 Nibble이라하며, 앞4비트와 뒤4비트가 합쳐진 8비트를 1Byte 라고 한다

1 byte = 8bits
           = 2nibble ( 4bits : 4bits)
           = 2 ^ 8 = 256 (0~255)

16진수

앞서 4비트는 16가지의 표현이 가능하다 했다

기존의 10진수로는 0부터 9까지 한자리수로 표현이 가능한데, 10이상의 숫자까지 한자리로 표현할 수가 없었다. 여기서 16진수가 등장한다

10이상의 숫자가 나오면 10 = a, 11 = b, 12 = c, 13 = d, 14 = e, 15 = f 이렇게 알파벳으로 표현하게 되었다

예를 들어, 10진수 255는 2진수로 11111111, 16진수로는 FF로 표현된다

왜 굳이 다양한 진법을 사용할까?

16진수를 사용하면 큰 수를 더 간결하고 알아보기 쉽게 표현할 수 있기 때문에 메모리 주소, 색상 코드, 파일 형식 등에서 자주 사용된다

2진수는 컴퓨터 내부에서 데이터를 처리하는 데 필수적이지만, 사람이 직접 읽고 쓰기에는 불편하다

그래서 8진수16진수처럼 더 큰 단위를 사용해 데이터를 간단히 표현할 수 있다

특히 16진수는 4비트 단위를 깔끔하게 나눌 수 있어 데이터의 경계를 명확히 볼 수 있다

8bits = 1 byte : C언어로 char
16bits = 2 byte : C언어로 short int
32bits = 4 byte : C언어로 int
64bits = 8 byte : C언어로 long int

더 큰 단위 또한 있다

1 byte
1000 byte = 1 Kbyte (10^3)
1000 Kyte = 1 Mbyte (10^6)
1000 Myte = 1 Gbyte (10^9)
1000 Gyte = 1 Tbyte (10^12)

8진수

8진수는 2진수보다 더 짧고 간결하게 데이터를 표현할 수 있는 방법이다

예를 들어, 3비트0부터 7까지 8개의 값을 표현할 수 있다

8진수는 예전 컴퓨터 시스템에서 메모리나 데이터 표현을 단순화하기 위해 자주 사용되었다

 

정리하자면 진법이 다양한 이유는 결국 컴퓨터의 효율성사람의 편의성을 동시에 만족시키기 위해서라고 볼 수 있겠다

 

참고 자료

https://youtu.be/lZKej5s3T_w?si=Da7ZiAMwnwQFkbcg

CS50으로 C언어를 처음 접하는 나로서는 처음 헤맸던 부분들 중 하나가

 

바로 첫 줄의 #include <stdio.h>였다

첫 줄부터 자꾸 오류가 뜨니 난감하기 그지없었는데,

 

includePath오류는 구글링 하면 나오는 방식대로 따라 하면

오류가 뜨지 않는데 <cs50.h>은 여전히 찾지 못하더라

 

왜냐!?

CS50 Sandbox 샌드박스가 아닌 VSCode 비주얼스튜디오 코드에서 실습을 했기 때문

 

CS50 공식 홈페이지에 들어가 보면

따로 CS50 라이브러리를 작업하는 폴더에 설치해 주면 된다고 한다

 

나는 맥 유저라 하위 내용 그대로 따라 하였다

From Source (Linux and Mac)

Download the latest release from https://github.com/cs50/libcs50/releases

  1. Extract libcs50-*.*
  2. cd libcs50-*
  3. sudo make install

 

1번 링크에서 소스 코드 폴더를 다운로드한다

 

 

다운로드한 폴더를 압축 풀고 작업하는 폴더에 넣어준다

 

터미널에서 해당 폴더 위치인지 확인 후

 

sudo make install

 

명령어를 입력하면 설치가 완료된다

 

 

이제 원활하게 C언어를 실습할 수 있다!

모두를 위한 컴퓨터 과학 CS50 데이비드 J. 말란 (David J. Malan)

C언어로 1 나누기 10을 했을 때, 소수점 값은?

#include <cs50.h>
#include <stdio.h>

int main (void)
{
  float x = get_float("x: ");
  float y = get_float("y: ");

  printf("x / y =%f\n", x / y);
}

 

C 언어의 float를 활용해 x를 y로 나눠보자

 

 

x: 1
y: 10
x / y =0.100000

 

우리가 알고 있듯 값은 0.1이다

뒤에 있는 0000... 들은 필요가 없으므로 깔끔하게 보이게 하려면

 

#include <cs50.h>
#include <stdio.h>

int main (void)
{
  float x = get_float("x: ");
  float y = get_float("y: ");

  printf("x / y =%.1f\n", x / y);
}

 

f 앞에. 1을 입력해 주면 된다

 

x: 1
y: 10
x / y =0.1

 

그럼 이렇게 깔끔하게 출력된다

 

그런데 말입니다, 소수점을 50자리까지 보이게 하면 어떨까요?

 

#include <cs50.h>
#include <stdio.h>

int main (void)
{
  float x = get_float("x: ");
  float y = get_float("y: ");

  printf("x / y =%.50f\n", x / y);
}

 

. 50으로 코드를 수정했다

결과는?!

 

x: 1
y: 10
x / y =0.10000000149011611938476562500000000000000000000000

 

으잉? 50자리까지는 출력되는데 중간 숫자가 이상하다

왜 그럴까?

 

float에서 저장가능한 비트의 수가 32비트로 유한하기 때문이다

( double 은 64비트를 사용한다.

고로, double을 사용하면 좀 더 정확하게 계산할 수 있다 )

 

컴퓨터의 저장 공간(메모리)에는 한계가 있고 특정 지점 뒤에는 한계에 부딪혀

결국 저장할 수 있는 값들 중 1 / 10에 가까운 값을 저장하게 된다

 

정수 오버플로우

비슷한 오류로, 1부터 시작해 2를 계속해서 곱하는 코드를 실행했을 때

 

#include <stdio.h>
#include <unistd.h>

int main(void)
{
    for (int i = 1; ; i *= 2)
    {
        printf("%i\n", i);
        sleep(1);
    }
}
...
1073741824
overflow.c:6:25: runtime error: signed integer overflow: 1073741824 * 2 cannot be represented in type 'int'
-2147483648
0
0
...

 

int 타입이 저장할 수 있는 32비트의 크기를 넘은 이후에는 더 이상 넘어갈 1의 자리가 없기 때문에

그 이상의 숫자를 저장하지 못하고 에러와 함께 0이 출력된다

 

실생활에서 발견되었던 오버플로우 문제는 Y2K, 보잉 787 사례가 있다

1999년에 큰 이슈가 되었던 Y2K 문제는 연도를 마지막 두 자리수로 저장했던 관습 때문에 새해가 오면 ‘99’에서 ‘00’으로 정수 오버플로우가 발생하고, 새해가 2000년이 아닌 1900년으로 인식된다는 문제였습니다.
그리고 세계는 수백만 달러를 투자해서 프로그래머들에게 더 많은 메모리를 활용해서 이를 해결하도록 하였습니다.
이는 통찰력 부족으로 발생한 아주 현실적이고 값비싼 문제였습니다.
또한 다른 사례로 비행기 보잉 787에서 구동 후 248일이 지나면 모든 전력을 잃는 문제가 있었습니다.
왜냐하면 강제로 안전 모드로 진입하였기 때문입니다.
이는 소프트웨어의 변수가 248일이 지난 뒤에 오버플로우가되어 발생하였기 때문이었습니다.
248일을 1/100초로 계산하면 대략 2의 32제곱이 나옵니다.
보잉을 설계할때 사용한 변수보다 너무 커졌던 것입니다.
이를 해결하기 위해 주기적으로 재가동을 하여 변수를 다시 0으로 리셋했습니다. 

 

따라서 다루고자 하는 데이터 값의 범위를 유의하며 프로그램을 작성하는 것이 중요하다

1. 컴퓨팅 사고 computational Thinking, Scratch

1) 2진법

컴퓨터 과학문제 해결에 대한 학문이다

문제해결입력(input)을 전달받아 출력(output)을 만들어내는 과정이다

그 중간 과정이 컴퓨터 과학이다

 

입력과 출력을 표현하기 위해선 모두가 동의한 약속(표준)이 필요하다

 

2진법

0,1,2,3,4,5,6,7,8,9,10 총 10개의 기호로 표현하는 방법은 10진법

하지만 컴퓨터는 오직 0과 1로만 데이터를 표현하는 2진법을 사용한다

 

전기를 통해 연산하는, 즉 전기를 켜고 끄는 방식으로 작동하는 컴퓨터에게 적합한 방법이다

컴퓨터 안에는 많은 스위치(트랜지스터)가 있고 on/off 상태를 통해 0과 1을 표현한다

 

2진법에서 하나의 자릿수를 표현하는 단위를 비트(bit)라고 한다

 

비트 Bit

이진 숫자라는 뜻의 binary digit의 줄임말이다

0과 1, 두 가지 값만 가질 수 있는 측정 단위이다

컴퓨터 내부에서 물리적으로 표현하자면 켜고 끌 수 있는 스위치라고 생각할 수 있다 (켜기=1, 끄기=0)

디지털 데이터를 여러 비트들로 나타냄으로써 두 가지 값만을 가지고도 많은 양의 정보를 저장할 수 있다

또한 저장되어 있는 데이터를 수정하기 위해 비트에 수학적 연산을 수행할 수 있다

 

비트열

비트 한 개로는 많은 양의 데이터를 나타내기에 턱없이 부족하므로 여러 숫자 조합을 컴퓨터에 나타내기 위해 비트열을 사용한다

바이트(byte)여덟 개의 비트가 모여 만들어진 것이고 2^8 = 256 개의 서로 다른 바이트가 존재할 수 있다

바이트가 모이면 더 큰 단위가 될 수 있다
(비트 bit > 바이트 byte > 킬로바이트 KB > 메가바이트 MB > 기가바이트 GB > 테라바이트 TB)

출처: 부스트코드 모두를 위한 컴퓨터 과학 CS50

 

2) 정보의 표현

문자의 표현

 

문자를 숫자로 표현 할 수 있는 약속(표준) 중 하나는 설명미국정보교환표준부호

ASCII (아스키코드/American Standard Code For Information Interchange)이다

총 128개의 부호로 정의되어 있다

출처: 부스트코드 모두를 위한 컴퓨터 과학 CS50

ex) A를 2진법으로 표현하려면

  1. 아스키코드를 참고하여 A를 10진법으로 표현하면 65이다
  2. 2^5x1 + 2^5x0 + 2^4x0 + 2^3x0 2^2x0 + 2x0 + 1x1 (64+1)
  3. 2진법으로 표현하면 1000001 

 

이 외에도 Unicode 유니코드로 더 많은 비트를 사용해 다양한 문자들도 표현가능하다

 

😂(기쁨의 눈물)과

스마트폰으로 이모티콘을 보내면 안드로이드 혹은 IOS는 0과 1의 패턴을 받아 노란 얼굴에 눈물을 흘리는 사진으로 보여준다

 

그림, 영상, 음악의 표현

 

문자와 마찬가지로 그림도 숫자로 표현할 수 있다

스크린의 그림을 자세히 보면 수많은 작은 점들이 빨간색, 초록색, 파란색을 띠고 있는데

이러한 작은 점을 픽셀 Pixel이라고 한다

 

픽셀은 세 가지 색을 서로 다른 비율로 조합해 특정한 색을 나타낸다

 

ex) 빨간색 72 , 초록색 72 , 파란색 33 = 노란색

 

위의 숫자들을 표현하는 방식을 RGB (Red, Green, Blue)라고 한다

 

영상 또한 수많은 그림을 빠르게 연속적으로 이어 붙여놓은 것이기 때문에 숫자로 표현이 가능하다

음악도 마찬가지로 각 음표를 숫자로 표현할 수 있다

 

3) 알고리즘

알고리즘 Algorithms

입력 input에서 받은 자료를 출력 output 형태로 만드는 처리과정

입력값을 출력값의 형태로 바꾸기 위해 어떤 명령들이 수행되어야 하는지에 대한 규칙들의 순서적 나열이다

알고리즘을 평가할 때는 정확성도 중요하지만 효율성도 중요하다

효율성은 작업을 완료하기까지 시간과 노력이 얼마나 덜 들이는지에 대한 것이다

 

의사코드 Pseudocode

컴퓨터가 수행해야 할 행동이나 조건의 절차를 명료하게 정리한 것

 

함수 Function

조건

불리언 Boolean

값(답)이 예 Yes, 아니오 No, 참 True, 거짓 False 2진법에선 0 또는 1로 나온다

루프 Loop (반복)

3번째 라인코드로 돌아가라는 반복

 

https://youtu.be/6hfOvs8pY1k

 

 

비전공자와 전공자의 차이정말 단순하게 따져보자면 전공한 수업이 다르다는 것

그렇다면 비전공자들도 전부는 아니더라도 똑같이 대학교 강의를 수강하면 되는것 아닌가?

찾아보고 내가 공부할 사이트들만 찝어왔다 (전부 무료)

 

부스트코스

네이버 커넥트재단에서 기획하고 운영하는 사이트이다

 

모두를 위한 컴퓨터 과학 (CS50 2019)

https://www.boostcourse.org/cs112

 

모두를 위한 컴퓨터 과학 (CS50 2019)

부스트코스 무료 강의

www.boostcourse.org

하버드대학의 최고 인기강좌, 데이비드 말란 교수님의 CS50입니다.
프로그래밍을 처음 공부하는 비전공자 분들도 쉽고 재미있게 학습하실 수 있습니다.-출처: 강의 상세 페이지

여기서 내가 수강할 강의는 무려 하버드대 강의이다

1강 들어본 바로는 정말 재밌고 현장감이 느껴지며 말이 무척 빠르시다

부스트코스 사이트에서 영상 하단에 강의 내용도 잘 정리 해줘 공부하기 좋은 것 같다

 

KOCW (Korea OpenCourseWare)

대학 공개 강의 서비스이다

고등교육 교수학습자료 공동활용 체제, KOCW(Korea OpenCourseWare)

KOCW는 국내.외 대학 및 기관에서 자발적으로 공개한 강의 동영상, 강의자료를 무료로 제공하는 서비스로, 대학생, 교수자는 물론 배움을 필요로 하는 누구든지 언제 어디서나 이용 가능합니다.-출처: KOCW 소개 페이지

여기서 소프트웨어 교육은 하위 링크에 있다

http://www.kocw.net/home/special/themeCourses.do#subject/04

 

KOCW - 테마

이전 다음

www.kocw.net

카테고리가 다양하니 골라 들으면 된다

 

K-MOOC (Massive, Open, Online, Course)

무크(MOOC)란 Massive, Open, Online, Course의 줄임말로 오픈형 온라인 학습 과정을 뜻합니다.
이 것은 강의실에 수용된 학생만이 강의를 들을 수 있었던 것에서 청강만 가능한 온라인 학습동영상으로 변화하고
현재는 질의응답, 토론, 퀴즈, 과제 제출 등 양방향 학습을 할 수 있는 모습으로 완성되었습니다.

이 사이트를 추천하는 블로그는 많은데, 솔직히 강의의 종류가 많지 않아서 가장 아쉬운 사이트이다

공학, 컴퓨터.통신, 이공계 기초과학 카테고리는 하위 링크이다

http://www.kmooc.kr/courses#

 

분야별 강좌 | K-MOOC

 

www.kmooc.kr

취지는 좋으나 강의가 많지 않음 (오른쪽에서 갯수 확인 가능)

+ Recent posts