컴퓨터의 작동 원리는 프로그래밍을 하는데 꼭 알아야 하는 것은 아니지만 프로그램이 어떻게 컴퓨터를 작동시키는지와 밀접하게 연관되어 있고 몇몇 프로그래밍의 기본 개념을 이해하는데 도움을 줍니다.

컴퓨터는 전자계산기

최초의 컴퓨터는 수학식을 계산하는 도구였습니다. 지금은 컴퓨터로 영화도 보고 게임도 하고 뉴스도 읽을 수 있죠. 하지만 이 기능들은 계산기의 기능을 확장한 것입니다.

키보드로 키를 입력하거나, 마우스를 움직이거나 터치스크린을 터치하는 등의 사람의 동작을 컴퓨터가 처리할 수 있게 전기신호로 변환하는 장치를 입력장치라고 합니다. 반대로 전기신호를 사람이 이해할 수 있게 빛(화면), 소리 등으로 변환하는 장치를 출력장치라고 합니다. 이 신호는 숫자로 나타내어질 수 있고, 컴퓨터는 입력장치를 통해 입력받은 값을 연산하여 출력장치에 전달합니다.

이처럼 현대의 컴퓨터도 여전히 숫자들을 바탕으로 하여 정보를 처리하고 계산하는 장치라는 것을 이해하고 컴퓨터가 어떻게 수를 계산하는지 알아봅시다.

아래 내용에 전혀 흥미가 없으신 분들은 컴퓨터가 2진수 계산을 하는 장치라는 것만 알고 넘어가도 됩니다.

컴퓨터와 2진 신호 체계

흔히들 컴퓨터는 0과 1밖에 모른다고 하죠. 컴퓨터의 중앙처리장치인 CPU가 0과 1로만 계산을 하기 때문입니다. 그런데 CPU는 숫자 0과 숫자 1을 어떻게 구별할까요?

사실 CPU는 숫자 0도, 숫자 1도 모릅니다. CPU에는 모든 신호가 전기로 전달되는데 이 때 전압이 일정한 기준보다 높은 경우 이것을 1, 전압이 일정한 기준 보다 낮은 경우 이것을 0으로 사람들이 표현한 것입니다.

CPU는 <전압이 충분히 높음>과 <전압이 충분하지 않음>의 두가지 신호로 된 2진법을 사용합니다. 혹시 여기서 2진법, 10진법에 대해 잘 모르시는 분들은 따로 검색을 통해서 기본 개념을 익히시고 계속 읽어 주세요.

여기서 "전압이 충분함"이 어떤 기준인지, 왜 높고 낮음 두가지로만 구별하는지(10단계의 전압을 구별하면 10진법을 사용할 수 있을텐데 말이죠!)를 이해하려면 CPU의 구성품인 트랜지스터가 무엇인지 알아야 합니다.

트랜지스터와 논리연산

트랜지스터는 CPU를 구성하는 구성품으로 전기 신호의 흐름에 관여하게 됩니다. CPU에는 트랜지스터가 수십억개가 모여있으며 제작기술이 발달함에 따라 그 수가 늘어나고 있죠. (초창기의 컴퓨터의 CPU는 수천개의 트랜지스터로 구성되어 있었음)

CPU 구성에 사용되는 npn 트랜지스터는 아래와 같이 구성되어 있습니다.

트랜지스터에는 전류가 흐를 수 있는 다리가 3개(이미터, 베이스, 컬렉터) 있으며 베이스에 전압이 일정 수준 이상(0.6볼트 이상) 이면 컬렉터로 들어온 전류가 이미터로 전달될 수 있고 그렇지 않으면 컬렉터에서 이미터로 전류가 흐르지 않게 하는 장치입니다. 즉 베이스에 특정한 전압 이상의 전류가 통하고 있는지 아닌지를 통해 이미터에 CPU에 0, 1의 신호를 주게 되는 것입니다.

트랜지스터의 이러한 특성을 이용하면 '논리 게이트'라는 것을 만들 수 있습니다.

 논리 게이트

 구조

 설명

 AND GATE

 

A와 B에 모두 전압이 있어야
Out에 전류가 흐름

 OR GATE

 

A나 B에 중에 한 곳이라도 전압이 있으면
Out에 전류가 흐름

위 표는 트랜지스터로 어떻게 논리 게이트를 구성하는지 보여주기 위한 2가지 예제일 뿐이고 트랜지스터들을 연결하는 방법에 따라 아래와 같은 다양한 논리 게이트를 만들 수 있습니다.

Symbol에서 왼쪽이 입력신호, 오른쪽이 출력신호이며, Truth Table에서 왼쪽 A 혹은 A, B가 입력 값, 오른쪽 X가 출력값을 나타냅니다. 예를 들어, AND 게이트의 경우 X로 1 신호를 보내기 위해서는 (A, B)가 각각 (1, 1)이 되어야 하며, 나머지 (0, 0), (1, 0), (0, 1)인 경우는 0 신호를 보내게 됩니다.

논리 게이트를 또다시 모아모아 계산을 할 수있는 칩을 만들 수 있습니다. 아래는 두자리 2진수 두개의 합을 구하는 칩 구성입니다.

이 칩은 0과 1을 입력받는 부분이 4개, 0과 1을 출력하는 부분이 3개로, 4가지 입력부에 두자리 2진수 2개를 나란히 입력하면 그 합이 출력됩니다. 입력부에 스위치를 연결하고 출력부에 전구를 연결하면 각각 스위치를 켜고 끔에 따라 전구에 불이 들어오는 순서가 달라지겠죠.

위 칩에서 알 수 있는 중요한 점들!!

1. 입력값인 1011이 순서대로 하나씩 1, 0, 1, 1이 들어가는 것이 아니라 1011이 동시에 쑥 들어가서 오른쪽으로 값이 101이 동시에 쑥 나온다는 것

2. 결국 2진수 1011(10진수로는 11)를 입력으면 101(10진수로 5)를 출력하고 있다는 것입니다. 즉, 규칙을 이해하고 사용하는 것이 요구된다는 점이죠,

3. 출력값 101은 숫자 101이 아니라 세개의 출력선에 전류가 흐르고 있는지 아닌지를 나타낸다는 점! 출력으로 나온 전류를 다시 다른 칩에 넣어 변환하여 모니터나 프린터같은 출력장치에서 그 값을 활용할 수 있습니다.

이런식으로 논리 게이트를 구성하여 CPU를 설계하게 됩니다(정확히는 CPU의 연산부분을 이런식으로 설계).

정리

입력장치, 연산장치, 출력장치와 더불어 또 한가지 중요한 장치가 저장장치인데요, 컴퓨터의 저장장치는 0과 1의 전기 신호를 기록해 두었다가 전류가 흐르면 이전에 기록해놓았던 2진 전기 신호들을 재현하는 장치입니다.

결론적으로 컴퓨터는 0과 1의 전기 신호를 처리하는 장치, 프로그램은 0과 1들의 전기 신호들를 저장장치에 기록해 놓은 것이며 프로그래머는 0과 1들의 전기 신호들을 기록하는 사람들이라고 할 수 있습니다.

그러면 프로그래머들은 프로그래밍을 할 때 0과 1을 써넣는 작업을 하나요? 처음에는 진짜 그랬습니다. 하지만 프로그래밍 언어를 통해 0과 1을 직접 써넣을 필요가 없어졌습니다.

다음글에서는 프로그래밍 언어의 발달 과정을 알아 보겠습니다.

컴퓨터 프로그램은 어떠한 문제를 해결하기 위해서 컴퓨터가 해야 할 일들을 작성해 놓은 코드들의 모음입니다.

여기서 '문제의 해결'이라는 것은 다른말로 '목적의 달성'이라고 생각할 수도 있습니다. 전역일 계산기 프로그램은 남은 복무 기간를 표시하는 것이 프로그램의 목적이 되고 게임의 경우 사용자에게 즐거움을 주는 것이 목적이 됩니다.

프로그램이 해결할 문제/목적이 정해지면, 이를 달성하기 위한 구체적인 과정이 논리적으로 계획되어야 하는데, 이 구체적인 실행 계획을 알고리즘이라고 합니다. 전역일 계산기를 예로들면:

  1. 입대날짜를 입력받음
  2. 복무기간을 입력받음
  3. 남은 기간 계산 (남은 기간 = 입대날짜+복무기간-오늘날짜)
  4. 남은 기간 화면에 표시

이 정도면 컴퓨터가 실행할 수 있을 것 같습니다. 이제 각각 항목을 코드로 작성(코딩)하면 프로그램이 됩니다.

게임을 만드는 것은 훨씬 복잡한 알고리즘을 필요로 합니다. 비행기 슈팅 게임을 만들 때 실제 게임의 진행 방식을 생각해 봅시다.

  1. 배경을 화면에 그림
  2. 플레이어 비행기를 화면에 그림
  3. 적 비행기를 화면에 그림
  4. 적비행기 총알을 만들고 화면에 그림
  5. 0.05초 기다림
  6. 방향키 입력이 있으면 플레이어 비행기를 그 방향으로 한칸 움직임
  7. 발사키 입력이 있으면 플레이어 비행기에서 총알을 만들고 화면에 그림
  8. 게임 종료키 입력이 있으면 게임 메뉴 화면으로 돌아감
  9. 적 비행기 움직임
  10. 총알들을 움직임
  11. 배경을 움직임
  12. 총알들 충돌확인 후 할 일(플레이어가 적군 총알에 맞는 경우 플레이어 생명 감소, 적군총알이 내 총알에 맞는 경우 둘다 사라짐 등등)
  13. 비행기들 충돌확인 후 할 일(플레이어의 생명 감소 등)
  14. 처음으로 돌아감

이런식으로 굉장히 구체적으로 계획을 세워야 합니다. 이마저도 간단하게 작성된 것이고 실제로 게임을 만들기 위해서는 더욱 구체적인 세부 사항들까지 생각해야 합니다.(적 비행기의 출현, 이동경로, 점수의 계산, 총알이 몇 개까지 나갈지 등등등)

이렇게 만든 알고리즘을 코드로 작성하면 아래와 같은 게임이 됩니다. 아래는 C언어로 작성한 비행기 게임입니다.

프로그래밍을 한다는 것은 1. 컴퓨터가 처리할 수 있는 알고리즘을 만들고, 2. 그 알고리즘을 코드로 작성하는 것입니다.

알고리즘을 잘 만들기 위해서는 목적과 기능을 구체적, 논리적으로 쪼개고 정리하는 방법을 연습해야 하고, 코드를 작성하기 위해서는 자바스크립트, 자바, C, C++, C#, 파이썬 등의 프로그래밍 언어의 문법과 사용법을 익혀야 합니다.

이 강의 시리즈에서는 프로그래밍을 전혀 모르는 사람들을 대상으로 프로그래밍에 대한 일반적인 지식과 자바스크립트를 사용하여 코딩을 하는 방법을 알아보겠습니다.

+ Recent posts