Study/CS50 with bc

모두를 위한 컴퓨터 과학 - Part 1. 컴퓨팅 사고

Dodal 2021. 2. 7. 23:45

CS50이란? 

하버드 대학교의 컴퓨터과학 입문 강좌이다.

David Malan 교수가 진입장벽이 있는 컴퓨터과학의 교육 내용을 쉽게 풀이하며 수업을 진행한다.

컴퓨터 기초의 지식에 대한 필요성을 느낀 나는 이 수업을 발견했고, 데이비드 교수님..말은 좀 빠르시지만

수업 내용을 이해하기 쉽게 풀어서 설명을 잘 해주셔서 은근 영어공부도(?? 된다..

하버드대학교 강의를 인터넷을 통해서 대한민국에서! 그것도 제대로된 번역 자료로 접할 수 있다는 것에 새삼

인터넷에 발전에 따른 큰 혜택을 누릴 수 있다는 것에 감사함을 느끼게 된다.

학습을 통해서 간단한 퀴즈를 풀고, 이수증을 발급 할 수 있어서 뿌듯함의(?) 메리트가 있는 것 같다.

벌써 3주차의 강의가 진행 중이지만, 공부한 내용을 머릿 속으로만 정리를 해서 블로그에 다시 내용을 간추려서 정리해 보려고 한다.

 

 

 

들어가기전 컴퓨터 과학은 문제 해결에 대한 학문이다.

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

그 중간에 있는 과정이 바로 컴퓨터 과학이다.

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

따라서 컴퓨터 과학의 가장 첫 번째 개념은 어떻게 표현하는지에 대한 '표현 방법'이다.

 

(1) 2진법

인간이 일상에서 사용하는 10개의 숫자로 표현하는 것이 10진법이다.

그러나 컴퓨터에서는 이렇게 많은 숫자가 존재하지 않는다.

오직 0과 1로 데이터를 표현한다.

 

이 처럼 0과 1로만 표현하는 것을 '2진법'이라고 한다.

컴퓨터는 신기하게도 오로지 0과 1만으로 숫자 뿐만 아니라 글자, 사진, 영상, 소리 등을 저장할 수 있다.

어떻게 이런 것이 가능할까?

 

우리가 위에 숫자를 '백이십삼'이라고 읽는 이유는 1을 백의자리, 2를 십의자리, 3을 일의자리로 보기 때문이다.

이것을 표현하면 '1x100 + 2x10 + 3x1 = 123'가 된다.

우리는 이것을 정말 당연하게 여긴다.

왜냐하면 우리 모두 이런 표현에 대한 약.속.이 있기 때문이다.

우리는 이 약속에서 자리수를, '10의 거듭제곱'으로 표현을 했다.

 

비슷하게 2진법에서는 두 개의 숫자만으로 각 자리수가 2의 거듭제곱을 의미한다.

 

위와 같은 방법으로 10진법의 3을 2진법으로 표현하면 어떻게 될까?

바로 '11'이 된다. 위의 표에서 보면 2진법에서는 두 번째 자리는 2¹로 2이다.

2진법에서 11은 2¹x1 + 1x1 = 3이 된다.

 

마찬가지로 2진법에서 100은 2²x1 + 2¹x0 + 1x0 = 4가 된다.

 

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

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

* 트렌지스터는 전압 레벨을 높고 낮게 바꾸는 역할을 한다. 

 

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

 

비트

정보를 저장하고 연산을 수행하기 위해 컴퓨터는 비트(bit)라는 측정 단위를 쓴다.

비트는 이진 숫자를 가진 "binary digit"의 줄임말이며, 0과 1, 두가지 값만 가질 수 있는 측정 단위이다.

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

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

 

비트열

하나의 비트는 0과 1, 이 두 가지의 값만 저장할 수 있다.

컴퓨터 내부에서 물리적으로 표현될 때는 켜고 끌 수 있는 스위치라고 생각할 수 있겠다.

(켬 = 1/ 끔 =0)

 

하지만 비트 한 개는 많은 양의 데이터를 나타내기에 턱없이 부족하다.

그래서 여러 숫자 조합을 컴퓨터에 나타내기 위해 비트열을 사용한다.

바이트(byte)여덟 개의 비트가 모여 만들어진 것이다.

하나의 바이트여덟 개의 비트가 있고 ( 원바 에잇빝 )

비트 하나는 0 or 1로 2^8 = 256개의 서로 다른 바이트가 존재할 수 있다.

 

바이트가 모이면 더 큰 단위가 될 수 있다.

킬로 바이트 = 1000 바이트

메가 바이트 = 1000 킬로 바이트(100만 바이트)

기가 바이트 = 1000 메가 바이트 ( 10억 바이트)

테라 바이트 = 1000 기가 바이트 ( 1조 바이트 )

.

.

페타바이트, 엑사바이트 ..등 더 큰 단위도 존재한다.

 

다양한 데이터 표현하기

하나의 비트로 노트북이나 휴대전화가 충전 중인지 아닌지에 대한 정보를 참, 거짓으로 컴퓨터에 저장할 수 있다.

하나의 바이트(8bit)알파벳 하나를 표시할 수 있다.

 

더 큰 데이터 단위는 좀 더 복잡한 유형의 데이터를 저장할 수 있다.

오른쪽 표의 일부 예제에서 1 킬로바이트는 몇 문단의 문자를 나타낼 수 있고

1 메가 바이트는 1분가량의 노래 파일의 크기와 같고 1gb는 약 3분 길이의 hd영화 정도의 크기이다.

 

 

(2) 정보의 표현

문자의 표현

2진법에서 컴퓨터 스위치를 on/off 하면서 숫자를 표현한다고 정의했다.

그럼 문자는 어떻게 표현될까?

 

바로 문자를 숫자로 표현할 수 있도록 정해진 약속이 있다.

 

그 중 하나는 아스키코드 ASCII이다.

총 128개의 부호로 정의되어 있는데, 가령 알파벳 A는 10진수 기준으로 65로 나타내고 B는 66이다.

그럼 아스키 부호의 A의 65는 10진법의 기준으로 2진법 기준으로 바꾸면 어떻게 표현할 수 있을까?

26x1 + 25x0 + 24x0 + 23x0 + 22x0 + 2x0 + 1x1 (64+1) 로 표현할 수 있다.

따라서 A를 2진법으로 표현하면, 1 0 0 0 0 0 1 이된다.

 

이 외에도 Unicode (유니코드)라는 표준에서 더 많은 비트를 사용하여 더 다양한 다른 문자들도 표현가능 하도록

지원하고 있다. ASCII로는 문자들을 표현하기에 제한이 많다.

 

Unicode 😂 이런 이모티콘 까지 표현할 수 있다.

이 이모티콘은 10진법으로 128,514이다.

2진법으로는 111110110011111011000000010 이다..😲

 

만약 내가 스마트폰으로  😂 이모티콘을 보내면 위의 이진수값의 패턴을 보낸 것이다.

그럼 이모티콘을 받은 상대방의 안드로이드 혹은 iOS는 0과 1의 패턴을 받아  😂 이 이모티콘이 명시된다.

 

그림,영상,음악의 표현

문자와 같이 그림도 역시 숫자로 표현할 수 있다.

우리가 스크린을 통해 보는 그림을 자세히 살펴 보면 수많은 작은 점들이 빨간색, 초록색, 파란색을 띄고 있다.

ㅣ런 작은 점을 픽.셀.이라고 부른다.

각각의 픽셀은 세 가지 색을 서로 다른 비율로 조합해서 특정한 색을 갖게 해준다.

 

예를 들어 빨간색 72, 초록색 72, 파란색 33을 섞게 되면 노란색이 되는 것과 같은 방식이다.

이 숫자들을 포현하는 방식을 RGB라고 한다.

 

즉 노란색의 커다란 이미지는 72 72 33으로 정의되는 무수히 많은 픽셀들을 RGB코드(숫자)로 표현할 수 있다.

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

음악도 각 음표를 숫자로 표현할 수 있다.

 

3) 알고리즘

우리는 이제 컴퓨터에 정보를 입력하는 방식에 대해 알았다.

그렇다면 이 정보를 컴퓨터에서 어떻게 가공하여 출력하는 것일까?

우리가 일상 생활에서 다양한 문제를 처리하는 방식 처럼 컴퓨터 또한 순서대로 필요한 동작을 하여 문제를 처리한다.

이를 알고리즘이라고 하는데, 알고리즘은 어떻게 정의할 수 있고 그 정확성과 효율성은 어떨까?

 

앞서 숫자, 글자, 색깔 등을 컴퓨터가 이해할 수 있는 2진법으로 표현하는 것을 배웠다.

이것은 입력에 해당하는 것이다.

 

이제는 출력에 대해 알아볼 차례이다.

그럼 어떻게 입력에서 출력을 얻을 수 있을까?

컴퓨팅은 입력을 받아 그 입력을 처리한 후 출력하는 과정이다.

알고리즘은 입력에서 받은 자료를 출력하는 형태로 만드는 처리 과정을 뜻한다.

즉 알고리즘이란 입력값을 출력값으 형태로 바꾸기 위해 어떤 명령어들이 수행되어야 하는지에 대한

규칙들의 순서적 나열이다!!

 

이러한 일련의 순서적 규칙들을 어떻게 나열하는지에 따라 알고리즘의 종류가 달라진다.

같은 출력값이라도 알고리즘에 따라 출력 하기까지의 시간이 다를 수 있다. = 효율성에 따라

 

[정확한 알고리즘]

예를 들어 전화번호부에서 '맹구'를 찾는 작업을 한다고 치자.

전화번호부를 집어 들고 첫 페이지를 펼친 후, '맹구'가 있는 페이지를 한장 한장씩 찾는다.

맹구가 나올 때까지..

맹구가 전화번호부에 있다면 언젠가 맹구가 있는 페이지를 찾을 수 있을 것이다.

하지만 알고리즘은 정확성도 중요하지만 동시에 효율성도 중요시한다.

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

한 번에 한 페이지씩 맹구를 찾는 알고리즘은 정확하긴 하지만 매우 오래걸리고 비효율 적이고 세월아 내월아다.

한 번에 두 페이지를 넘기게끔 하여 알고리즘을 개선할 수 있을 것이다.

하지만 이 알고리즘을 그대로 사용한다면 맹구가 있는 페이지를 그냥 지나쳐버릴 수 있다.

이럴 때는 이전 페이지를 확인하면 되지만 이 알고리즘마저도 이 문제를 해결하기에 가장 효율적인 방법은 아니다.

 

[정확하고 효율적인 알고리즘]

이번에는 더 직관적이고 효율적인 알고리즘을 적용하여 맹구를 찾아보자.

먼저 전화번호부 가운데를 편다. 만약 맹구가 그 페이지에 있다면 알고리즘은 종료된다.

없다면, 전화번호부가 이름순으로 정렬되어 있으니 우리는 맹구가 지금 페이지 보다 앞부분에 있는지

뒷부분에 있는지 알고 있다.

그러므로 책의 절반을 버릴 수 있게 되고 나머지 절반에 대해 똑같은 알고리즘을 수행한다.

 

한 페이지가 남을 때까지 계속 수행한다.

마지막에 남은 한 페이지에는 맹구의 이름이 있거나 없거나 둘중 하나일 것이다.

이 알고리즘은 전화번호부가 100페이지고 100페이지가 또 추가 되어 200페이

지가 되었다고 생각해보자.

한장 한장 넘기는 첫 번째 알고리즘은 100번 페이지를 더 넘거야 하지만, 절반씩 줄어드는 두번째 알고리즘은 단 1번의 절차만 더 수행하면 된다.

단 한 번의 동작으로 200페이지의 반인 100페이지가 사라지기 때문이다.

 

앞서 다룬 알고리즘이란 입력값을 출력값으 형태로 바꾸기 위해 어떤 명령들이 수행되어야 하는지에 대한 규칙들을 순서적으로 나열이라는 정의를 다시 곱씹어 보자.

 

우리는 맹구를 전화번호부에서 찾기 위해 어떤 명령어들이 수행되어야 하는지에 대해 두가지 알고리즘을 찾아봤다.

첫 번째 알고리즘은 한 장을 넘긴 다음 또 한 장 넘기는 규칙들의 순서적 나열이고,

두 번째 알고리즘은 반을 줄이고 다음 또 반을 줄이는 규칙들의 순서적 나열이었다.

 

의사코드

중간중간 들여쓰기가 되어있는 부분은 종속 관계를 나타낸다.

 

위와 같은 알고리즘은 위와 같은 의사코드라는 방식으로 보다 명료하게 정리할 수 있다.

의사코드는 필요한 행동이나 조건을 장 설정하여 컴퓨터가 수행해야 하는 일을 절차적으로 파악할 수 있게 도와준다.

 

노란색으로 강조된 부분들은 함수(function)이라고 불린다.

함수는 컴퓨터에게 이 경우에는 사람에게 무엇을 할지 알려주는 동사와 같다.

 

다음으로 노란색으로 강조된 If,Else 부분들은 조건이라고 부른다.

이것은 여러 선택지 중 하나를 고르는 것이다.

 

앞서 말한 결정을 내리기 위한 질문이 필요하다. 

이것을 불리언(Boolean)이라고 한다.

답이 예, 아니오 혹은 참,거짓으로 나오거나 2진법에서 0또는 1로 나오는 질문을 뜻한다.

 

마지막으로 노란색으로 강조된 부분은 루프라고 한다.

이 것은 뭔가를 계속해서 반복하는 순환이다.

 

 

반응형