*CS50 컴퓨터 과학을 공부하며 정리한 글입니다. (edwith X CS50을 참조하였음을 밝힙니다.)
문제 해결은 입력을 전달받아 출력을 만들어내는 과정이다.
컴퓨터 과학은 이 중간 과정에 있다.
이를 간단히 표현해보면,
input - 컴퓨터 과학 - output
이렇게 정리할 수 있다.
입력과 출력을 표현하기 위해서 모든 사람이 동의할 표준 약속이 필요하다.
그 표현 방법에 대해 공부해보자.
1) 2진법
일상 속에서 사용하는
0, 1, 2, 3, 4, 5, 6, 7, 8, 9 총 10개의 기호로 표현하는 방법이
'10진법'이다.
하지만 컴퓨터는 오직 0과 1을 가지고 데이터를 표현한다.
이 표현 방법을 '2진법'이라고 한다.
컴퓨터는 0과 1만으로 글, 사진, 영상 그리고 소리 등을 저장할 수 있다.
2진법에서는 어떤 수의 각 자리수를 2의 거듭제곱으로 나타낸다.
첫 번째 자리: 1
두 번째 자리: 2^1 = 2
세 번째 자리: 2^2 = 4
네 번째 자리: 2^3 = 8
네 번째 자리 | 세 번째 자리 | 두 번째 자리 | 첫 번째 자리 | |
2진법 | 2^3 = 8 | 2^2 = 4 | 2^1 = 2 | 1 |
2진법으로 숫자 3을 표현하면, 11이된다.
2^1 + 1 = 3
이와 같은 2진법은 전기를 켜고 끄는 방식으로 작동하는(전기를 통해 연산하는) 컴퓨터에게 적합한 방법이다.
컴퓨터에는 엄청난 수의 스위치 = 트렌지스터가 있고 on/off 상태를 통해 0과 1을 표현한다.
컴퓨터는 2진법에서 하나의 자릿수를 표현하는 단위를 비트(bit)라고 한다.
비트
정보를 저장하고 연산을 수행하기 위해 컴퓨터는 비트(bit)라는 측정 단위를 쓴다.
비트는 이진 숫자라는 뜻을 가진 'binary digit'의 줄임말이며, 0과 1, 두 가지 값만 가질 수 있는 측정 단위이다.
디지털 데이터를 여러 비트들로 나타냄으로써 두 가지 값만을 가지고도 많은 양의 정보를 저장할 수 있다.
또한 컴퓨터는 저장되어 있는 데이터를 수정하기 위해 비트에 수학적 연산을 수행할 수 있다.
비트열
하나의 비트는 0과 1, 이 두 가지의 값만 저장할 수 있다.
컴퓨터 내부에서 물리적 표현될 때는, 켜고 끌 수 있는 스위치라고 생각할 수 있다. (켜기=1, 끄기=0)
하지만 비트 한 개는 많은 양의 데이터를 나타내기에 매우 부족하기에 여러 숫자 조합을 컴퓨터에 나타내기 위해 비트열을 사용한다.
바이트(byte)는 여덟 개의 비트가 모여 만들어진 것이다.
하나의 바이트에 여덟 개의 비트가 있고, 비트 하나는 0과 1로 표현될 수 있기 때문에
2^8 = 256 개의 서로 다른 바이트가 존재할 수 있다.
바이트가 모이면 더 큰 단위가 될 수 있습니다.
킬로바이트는 1,000 바이트
메가바이트는 1,000 킬로바이트(100만 바이트)
기가바이트는 1,000 메가바이트(10억 바이트)
테라바이트는 1,000 기가바이트(1조 바이트)
+ 페타바이트와 엑사바이트와 같은 더 큰 단위도 존재한다.
하나의 비트로는 어떠한 값이 참인지 거짓인지 표시 가능
하나의 바이트(8 bit)로 알파벳 하나를 표시 가능
더 큰 데이터 단위는 좀 더 복잡한 유형의 데이터를 저장할 수 있다.
1 KB는 몇 문단의 문자 표시 가능
1 MB는 1분가량의 노래 파일의 크기
1 GB는 약 30분 길이의 HD 영화 정도의 크기
2) 정보의 표현
컴퓨터에는 문자를 숫자로 표현할 수 있도록 정해진 표준 약속이 있다.
그 중 하나는 설명미국정보교환표준부호 ASCII(아스키코드/American Standard Code for Information Interchange)이다.
이는 총 128개의 부호로 정의되어 있는데, 알파벳 A는 10진수 기준으로 65, 알파벳 B는 66로 되어있다.
A는 10진법 기준으로 65이므로 26x1 + 25x0 + 24x0 + 23x0 + 22x0 + 2x0 + 1x1 (64+1)로 표현할 수 있다.
따라서 A를 2진법로 표현하면 1000001이 된다.
이 외에도 Unicode라는 표준에서는 더 많은 비트를 사용하여 더 다양한 다른 문자들도 표현가능 하도록 지원하고 있다.
예를 들면, 이모티콘 같은 문자
ASCII로는 문자들을 표현하기에 충분하지 않기 때문이다.
문자와 같이 그림도 역시 숫자로 표현할 수 있다.
스크린을 통해 보는 그림을 자세히 살펴 보면 수많은 작은 점들이 빨간색, 초록색, 파란색을 띄고 있다.
이런 작은 점을 픽셀이라고 부른다. 각각의 픽셀은 세 가지 색을 서로 다른 비율로 조합하여 특정한 색을 갖게 된다.
예를 들어 빨간색 72, 초록색 72, 파란색 33을 섞게 되면 노란색이 되는 것과 같은 방식이다.
이 숫자들을 표현하는 방식을 RGB(Red, Green, Blue)라고 한다.
즉, 노란색의 커다란 이미지는 72 73 33 으로 정의되는 무수히 많은 픽셀들의 RGB코드(숫자)로 표현할 수 있다.
영상 또한 수많은 그림을 빠르게 연속적으로 이어 붙여놓은 것이기 때문에 숫자로 표현이 가능하다.
음악도 마찬가지로 각 음표를 숫자로 표현할 수 있다.
3) 알고리즘
컴퓨팅은 입력을 받아 그 입력을 처리한 후 출력하는 과정이다.
알고리즘은 입력(input)에서 받은 자료를 출력(output)형태로 만드는 처리 과정을 뜻한다.
컴퓨팅은 입력을 받아 그 입력을 처리한 후 출력하는 과정이다.
알고리즘은 입력(input)에서 받은 자료를 출력(output)형태로 만드는 처리 과정을 뜻한다.
예를 들어, 전화번호부에서 Mike Smith를 찾는 일을 한다고 하자.
전화번호부를 집어 들고 첫 페이지를 펼친 후 Mike Smith가 그 페이지에 있는지 찾는다.
없으면 그 다음 페이지에서 찾는다.
Mike Smith 를 찾을 때까지 혹은 전화번호부가 끝날 때까지 이것을 반복한다.
하지만 언젠가는 Mike Smith 가 전화번호부에 있다면 이 알고리즘을 통해 Mike Smith 를 찾을 수 있을 것이다.
알고리즘의 평가할 때는 정확성도 중요하지만, 효율성도 중요하다.
효율성은 작업을 완료하기까지 얼마나 시간과 노력을 덜 들일 수 있는지에 대한 것이다.
한 번에 한 페이지씩 보는 알고리즘은 정확하지만, 매우 오래걸리고 비효율적인 알고리즘일 것이다.
한 번에 두 페이지를 넘기게끔 하여 알고리즘을 개선할 수 있다.
하지만 이 알고리즘을 그대로 사용한다면 Mike Smith가 있는 페이지가 그냥 넘어갈 수도 있으니 주의해야 한다.
이럴 때는 이전 페이지를 확인하면 되지만 이 알고리즘마저도 이 문제를 해결하기에 가장 효율적이지는 않다.
이번에는 더 직관적이고 효율적인 알고리즘을 적용하여 Mike Smith를 찾아보자.
먼저, 전화번호부 가운데를 펴자. 만약 Mike Smith가 그 페이지에 있다면 우리 알고리즘은 끝난다.
없다면, 전화번호부가 이름순으로 정렬되어 있으므로 우리는 Mike Smith가 지금 페이지보다 앞부분에 있는지 뒷부분에 있는지 알고 있다.
그러므로 책의 절반을 버릴 수 있게 되고 나머지 절반에 대해 똑같은 알고리즘을 수행하자.
한 페이지가 남을 때까지 계속 수행하자.
마지막에 남은 한 페이지에는 Mike Smith의 이름이 있거나 없거나 둘 중 하나일 것.
이 알고리즘은 기존 알고리즘보다 더 효율적이다.
만약 기존 전화번호부가 100페이지고, 100페이지가 또 추가되어 200페이지가 되었다고 생각해보자.
한장 한장 넘기는 첫 번째 알고리즘은 100번의 페이지를 더 넘겨야 하지만,
절반씩 줄어드는 두 번째 알고리즘은 단 1번의 절차만 더 수행하면 된다.
단 한 번의 동작으로 200페이지의 반인 100페이지가 사라지기 때문이다.
첫 번째 알고리즘은 한 장을 넘긴 다음 또 한 장 넘기는 규칙들의 순서적 나열
두 번째 알고리즘은 반을 줄이고, 다음 또 반을 줄이는 규칙들의 순서적 나열
위와 같은 알고리즘은 아래와 같은 의사코드라는 방식으로 보다 명료하게 정리할 수 있다.
의사코드는 필요한 행동이나 조건을 잘 설정하여 컴퓨터가 수행해야 하는 일을 절차적으로 파악할 수 있게 도와준다.
함수 / 컴퓨터에게 이 경우에는 사람에게 무엇을 할지 알려주는 동사와 같다.
조건 / 여러 선택지 중 하나를 고르는 것이다.
불리언 / 답이 Yes(예) 또는 No(아니오) 혹은 True(참) 또는 False(거짓)으로 나오는 아니면 2진법에서 0또는 1로 나오는 질문을 뜻한다.
루프 / 뭔가를 계속해서 반복하는 순환이다.
4) 스크래치: 기초와 심화
스크래치에는 알고리즘을 구성하는 요소로는 함수, 조건, 불리언 표현, 루프 등이 있다.
이 그래픽 프로그래밍 언어를 사용하면 블록을 옮겨 붙여서 알고리즘을 만들어 볼 수 있다.
블록의 종류에 따라서 프로그램이 수행하는 일의 종류가 달라진다. 입력이 주어졌을 때 블랙 박스를 거쳐 출력이 되는 컴퓨터의 작동 원리를 생각해보면, 하나의 블록이 블랙 박스의 역할을 하는 것이다.
명령 “말해라” 라는 블록에 “hello, world”라는 입력을 주게되면 그 결과로 고양이가 “hello, world”라고 말한다.
이러한 입력과 출력을 이어 붙여서 여러 작업을 순차적으로 수행할 수도 있다.
공부 후 퀴즈를 풀어보았다.
'공부 STUDY > CS' 카테고리의 다른 글
CS50 | 알고리즘 - 검색 알고리즘, 알고리즘 표기법, 선형 검색 (0) | 2022.06.25 |
---|---|
CS50 | 배열 Array (2) - 배열, 문자열과 배열, 문자열의 활용, 명령행 인자 (0) | 2022.06.23 |
CS50 | 배열 Array (1) - 컴파일링, 디버깅, 코드의 디자인 (0) | 2022.06.23 |
CS50 | C 언어 - (2) (0) | 2022.06.21 |
CS50 | C 언어 - (1) (0) | 2022.06.21 |