컴퓨터를 만듭시다. 어때요~ 참 쉽죠? (2)

나빌레라의 이미지

#2. 코드

사람들이 소통하고 싶어하는 욕구는 어쩌면 본능일지도 모른다. 내 의견을 어떤 수단을 통해서 다른 사람에게 전달하는 것이다. 말은 소리란 수단을 통해서 소통하는 것이고, 책이나 글은 시각이란 수단을 통해서 소통하는 것이다.

사랑하는 사람들 사이에서는 소리나 시각없이 손을 꼭 잡는 것 만으로도 소통이 되기도 한다. 이 경우에는 촉각이라는 수단으로 소통한것이다.

이런 인간의 기본적인 소통 수단은 결정적으로 시간과 공간에 제약을 받는다는 단점이 있다. 아무리 부르고 싶고 보고 싶어도 이억만리 바다 건너에 있다면 부를 수도 볼 수도 없다. 그럴려면 시간을 들여서 보고 싶은 사람이 있는 곳으로 가야 한다. 그래서 사람들은 소통을 위해 통신이라는 수단을 만들어냈다. 물론 위와 같은 낭만적인 이유에서 보다는 군사적인 이유에서 통신 수단은 발달했지만 기본적으로 사람은 공간과 시간의 제약을 넘어서 소통하고 싶어한다는 사실은 분명하다.

통신 수단의 발달사를 보면 옛날에 봉화대에서 부터 시작해서 연기를 이용한 신호 등등 많은 내용들이 나온다. 나는 이런 이야기들은 건너 뛰고 전기를 이용한 통신 수단에 대해서만 이야기 하겠다.

전기를 이용한 통신 수단이라면 쉽게 생각해서 전기줄을 이어 양 끝단에 연결해 놓고 양 단에서 통신을 하는 것이다. 일단 무선 통신은 생각하지 말자. 무선 통신은 그 자체만으로도 너무 복잡하다. 가장 간단한 유선 통신을 구성해 보자.

두 사람이 있다. 한 사람은 A 쪽의 전구와 스위치를 보고 있고 다른 사람은 B 쪽의 전구와 스위치를 보고 있다. A쪽에서 스위치를 누르면 B쪽 전구에 불이 켜지고 B쪽에서도 스위치를 눌러 A쪽에 불을 켜 응답한다. 놀랍게도 우리는 방금 최초의 소통을 이루었다!

하지만 단순히 이쪽에서 불을 켜고 저쪽에서 응답을 불을 켜는 것만으로는 진정한 소통을 할 수 없다. 아주 단순한 의미만 전달 할 수 있기 때문이다. 그래서 서로간에 약속을 정한다. 불을 한 번 켰다 끄면 "안녕?"이고, 두 번 연속 껏다 켜면 "밥 먹었어?"이고, 세 번 연속 껏다 켜면 "사랑해" 이런식으로 계속 약속을 만들어 놓는 것이다. 충분히 의사 소통이 가능하다. 다만 문제는 세상의 모든 단어에 대해서 깜박이는 횟수를 겹치지 않게 모두 연결해 줘야 한다는 것이다.

예를 들어 다섯 번 깜박이는 것이 "뭐 먹었어?"인데 짜장면이란 단어가 137번 깜박이는 것이라면 137번 깜박이는 것을 마무리 할 때까지 기다리면서 깜박거리는 횟수를 세야 한다. 새로운 단어가 생겨나면 거기에 맞춰 깜빡임의 횟수를 또 지정해야 한다. 약속해 놓은 단어는 무한정 늘어난다.

효과적으로 이 문제를 해결할 방법을 찾아야 한다. 그래서 사람들은 숫자에 문자를 대입하고 숫자를 이진수로 표시하는 방법을 사용하기로 했다. 숫자와 문자를 일대일로 연결해 놓은 표를 흔히 코드라고 부른다. 그런 코드의 대표적인 것이 아스키 코드다.

위 그림은 아스키 코드표다. 숫자와 영문자 대문자, 영문자 소문자 및 여러 특수 문자와 터미널 제어 문자들이 숫자와 일대일로 대응되어 있다. 이제 사람들은 "Hello"라는 단어에 맞춰 전등을 깜박이는게 아니라 'H', 'e', 'l', 'l', 'o'라는 각 문자에 대응된 숫자 만큼 전등을 깜박이면 된다.

H를 표현하기 위해서 전등을 72번 깜박이느냐? 그건 아니다. 이진수를 전등으로 표현하기 위한 방법을 고안해 내면 된다. 가장 쉽게 생각 할 수 있는 것이 전등이 꺼지면 0이고 켜지면 1이라고 약속하는 것이다. 하지만 이렇게 약속하면 10000001 처럼 0이 계속 되거나 10011111001011 같이 같은 수가 반복 될때 몇 번이나 반복되었는지를 알 수 없게 된다. 그래서 이를 해결하기 위해 각 숫자 마다 1초씩 할당한다. 일초 동안 전등이 켜지고 3초간 꺼져 있다가 다시 1초간 켜지면 10001이다. 이 처럼 시간을 기준으로 이진수 표기를 결정하는 것을 시분할 기법이라고 한다.

위 그림은 ‘e’를 표기하기 위해 8초간 전등을 깜박인것을 표현한 그래프다. 알파벳 ‘e’는 0110 0101이다. 첫 1초는 전등을 꺼놨다가 다음 2초간 전등을 켜고 다시 다음 2초간 전등을 끄고, 일초 켜고 일초 끄고 일초 켜면 0110 0101을 전달한 것이다.

아스키 코드는 한 글자를 표시하기 위해 8자리의 이진수를 사용한다. 컴퓨터 세상에서 한 자리의 이진수는 1비트라고 하고 8자리의 이진수는 8비트, 8비트를 1바이트라고 한다. 이 책을 읽는 분이라면 아마 다 아실것이다. 앞으로는 많이 쓰는 비트, 바이트라는 용어를 사용하도록 하겠다.

앞에서 1비트를 1초로 구분하는 시분할 기법을 사용한다고 했으므로 아스키 코드에서 글자 하나를 표기하는데는 8초가 걸린다. Hello는 다섯 글자다. 그래서 Hello를 전달하는데 총 40초가 걸린다. 좀 긴것 같다. 스위치를 누르는 사람도 전등을 보는 사람도 약간은 지루하다. 물론 시분할 기법에서 신호 해석을 사람이 아니라 기계가 한다면 한 비트를 표현하는데 아주 짧은 시간을 배정할 수도 있다. 하지만 지금은 일단 인간이 하고 있으므로 지루한것이 사실이다.

약간 다른 방법을 사용해 보도록 하자. 이번에는 0을 표현할 때도 불을 켜고 1을 표현할 때도 불을 켜자. 다만 0을 표현할 때는 충분히 짧게 켜고, 1을 표현할 때는 충분히 길게 켜자. 여기서 '충분히'라는 말은 이 둘을 구분할 수 있을 정도의 시간이면 된다는 뜻이다. 인간이 구분하기에 0은 대충 0.2초, 1은 0.5초 정도면 될것이다. 만약 기계가 구분한다면 이보다 아주 많이 짧아도 될것이다.

위와 같은 그래프가 그려지게 될 것이다. 이 같은 방법으로 0과 1을 구분하는 것을 주파순 분할 기법이라고 한다. 주파수 분할 기법은 전등이 꺼지는 것은 비트가 바뀜을 의미하는 것이고 전등이 켜져 있는 시간으로 0과 1을 결정한다.

똑같은 아스키 코드를 표현하지만 그것을 표현하는 방법으로 시분할 기법, 주파수 분할 기법. 이렇게 한 개 이상의 표현 방법이 존재할 수 있다. 여기에서는 두 가지만 예를 들었지만 실제로 사용하는 신호 전달 기법은 훨씬 다양하고 많다.

코드 역시 아스키 코드 뿐만 아니라 유니코드, 한글 완성형/조합형 코드 등 매우 많은 종류가 존재한다. 내가 코드를 만들어 사용할 수도 있다. 하지만 나 혼자만 사용하는 코드일 뿐 다른 사람들은 그것이 뭔지 모르니 내가 혼자 만든 코드는 그다지 유용하지 않다.

여기서 중요한 것을 알 수 있다. 코드나 전송 방식이나 모두 소통 당사자 간에 약속이 되어 있어야 한다는 것이다. 다시 본질적인 소통으로 돌아가자.

말로 소통을 한다는 것은 소통 당사자가 둘 다 알아들을 수 있는 언어로 소통한다는 의미다. 나는 한국어를 거의 완벽하게 알아 들을 수 있고 영어를 조금 어설프게 알아들을 수 있다. 이런 나에게 누군가가 러시아어로 대화를 시도한다면 나와 그 사람은 소통할 수 없다. 알아들을 수 없기 때문이다. 우여곡절 끝에 나에게 러시아어로 떠드는 사람과 사랑에 빠져서 우리는 서로 손을 잡고 눈빛을 보며 소통을 한다. 사랑하기에 인종과 국적과 언어를 초월한 소통이 가능하다. 하지만 나를 사랑하는 어떤 외계인이 그 사랑을 표현하기 위해서 자신의 혓바닥을 내밀어 눈구멍을 찌른다면 나는 무서워 도망가고 말 것이다. 혓바닥으로 눈구멍을 찌르는 행위가 외계인에게는 지극한 사랑의 표현일 지라도 나는 그것을 모르기 때문에 도망가고 만다. 외계인은 서로 약속되지 않은 소통을 시도해서 사랑을 잃고 말았다.

다소 헛소리에 가까운 말이지만 소통의 전제 조건은 서로 약속된 수단을 사용해야 한다는 것이다. 통신에서도 마찬가지로 서로 약속되어 같은 체계를 사용하는 코드와 전송 방법을 사용해야 한다.

그 약속된 방법을 사용하는 수단으로 이진수를 사용했고 이 이진수를 표현하는 방법으로 디지털을 사용했다. 또 디지털 정보를 실어 나르는 수단으로 전기 신호를 사용했다.

디지털이라는 추상적인 개념에 대한 이야기가 어느새 코드라는 꽤 구체적인 이야기로까지 이어졌다. 소통하고 싶어하는 사람들의 욕구는 디지털 기술을 계속 발전시킨다. 앞으로 이어질 이야기에서도 디지털 기술의 발전은 계속된다.

댓글

gurugio의 이미지


좋은 내용 잘 봤습니다.
한가지 의견은 기준 클럭에 대한 개념을 조금 설명한다면
왜 초단위 계산이 필요한지에 대한 설명이 될것 같습니다.

계속 강좌보면서 건의사항을 내면 담에 책 내실때 한권얻을수... ;-)

----
섬기며 사랑하면 더 행복해집니다.
몸에 좋은 칼슘이 듬뿍담긴 OS 프로젝트 - 칼슘OS http://asmlove.co.kr/wiki/wiki.php/gurugio

나빌레라의 이미지

gurugio님 감사합니다....^^

ㅎㅎ 계속해서 건의 사항을 주신다면 책 한권 쯤이야 기꺼이...(근데 이거 출판이나 가능할랑가요?^^)

더불어 오류 지적까지 해 주신다면야 더할 나위없이 감사하겠습니다~

----------------------
얇은 사 하이얀 고깔은 고이 접어서 나빌레라

----------------------
얇은 사 하이얀 고깔은 고이 접어서 나빌레라

klenui의 이미지

재밌네요..

언급하신 "주파수분할기법"은 NEC 호환 리모콘에서 지금도 사용하고 있는 시그널 방식으로 알고 있습니다.(국내 리모콘은 거의 다 해당되죠..)

"파인만의 엉뚱 발랄한 컴퓨터 강의" (http://www.hanb.co.kr/look.php?isbn=89-7914-383-4) 라는 책을 봤는데,
책 내용은 좋은데, 보면서 일반인이 이걸보면 이해하겠냐.. 싶더군요..
전공이 컴인 사람은 다 아는 내용보는 거라 재미없고, 일반인은 뭔소린지 모르겠다라면.. 도무지 독자는 누가 될런지...라고 생각했던 기억이 납니다. 물론 파인만은 대학신입생 대상으로 강의를 했었던 거지요.. 윗 책은 강의를 그냥 책으로 엮은거고..
지금까지 올리신 내용은 모두 무난하다고 생각되니, 앞으로 어느정도 쉽게 다가올 책을 쓰실런지 기대됩니다.

근데 책 한권 얻을려면 어떻게 해야 하나요..? ^^;

나빌레라의 이미지

ㅋㅋㅋ 저도 쉽게 쓴다고 쓰고는 있으나 지난 번 책도 저는 아주 쉽게 썼다고 생각하고 썼었죠..
(그러나 몇몇 서평에 보면 "어려운 설명" 이라는 문장이 보이더군요..-_-)

이번에도 과연 읽는 사람들은 어떻게 느낄지 참 알 수 없습니다..^^

계속해서 강좌에 관심가져 주시고, 틀린 설명이나 문장을 발견하시자 마자 지체없이 댓글을 남겨주시고
좀더 쉽게 설명할 수 있는 아이디어를 주신다면
나중에 혹시라도 출판이 되었을 때 책 한권이야 기꺼이 선물해 드리겠습니다..^^

----------------------
얇은 사 하이얀 고깔은 고이 접어서 나빌레라

----------------------
얇은 사 하이얀 고깔은 고이 접어서 나빌레라

sungeuns의 이미지

학교에서 배운것을 이런식으로 다시보니까 재미있네요ㅎㅎ

학교에서 다루지 않은 부분도 많아서 흥미도있고 도움도 많이됩니다~감사합니다~

근데 궁금한게 있는데 주파수 분할 기법은 모르쯔 부호와 관련이 있는건가요? 모르쯔 부호도 ㅡ . 이렇게 표시하던거 같던데 ㅎㅎ

아 그리고 사진이 안나오는데 왜그런건지혹시 아시나요~? ㅠㅠ 강의 재미있는데 사진이 안나와서 아쉽네요 ㅠㅠ 무슨문제인지 모르겟네..ㅠㅠ

dg의 이미지

'시분할', '주파수분할'을 저런 의미로 사용하는것은 처음 보네요.
나빌레라님이 새로 정의하신 건가요?

나빌레라의 이미지

개념상 그렇다는 건데,

잘못된건가요?

통신 전공한 사람한테 검사 받고 쓴건데..

잘못된거라면 지적 부탁드립니다.

----------------------
얇은 사 하이얀 고깔은 고이 접어서 나빌레라

----------------------
얇은 사 하이얀 고깔은 고이 접어서 나빌레라

dg의 이미지

나빌레라님이 '시분할 기법'이라고 한것은 Unipolar encoding이고 시분할이라고 얘기하지는 않습니다.
'시분할' 이라는 말이 쓰이는 통신 용어로는 시분할다중화(TDM), 시분할다중접속(TDMA)등이 있고 찾아보시면 나빌레라님이 쓰신 '시분할'의 의미와 다르다는 것을 알수 있을것입니다.
만약 각 비트에 1초씩 할당했다고 '시분할'이라고 하신다면 같은 논리로 거의 모든 디지털 통신이 다 '시분할'이라 할수 있습니다.

주파수분할다중화(FDM)는 서로 주파수 범위가 겹치지 않는 여러 신호를 같은 매질(medium)을 통해서 동시에 보내는 것입니다.
예를들면 지상파나 케이블 TV에서 주파수분할다중화를 이용하여 여러 채널을 동시에 전송합니다.
짧으면 0, 길면 1로 표현하는것과는 아무런 관계가 없습니다.

나빌레라의 이미지

아~ 그렇군요.

dg님 덕에 또 새로운 공부를 했습니다.

정말 감사드립니다...^^

앞으로도 이런 지적 계속 부탁 드립니다.

----------------------
얇은 사 하이얀 고깔은 고이 접어서 나빌레라

----------------------
얇은 사 하이얀 고깔은 고이 접어서 나빌레라

jo1413의 이미지

한 편의 성장 소설 보는것 같습니다 :D

------------------------------------------------------------
Get busy living, or get busy dying.

------------------------------------------------------------
Get busy living, or get busy dying.

kimback100의 이미지

완전 생초보

강좌를 보는것만으로도 즐거워집니다....

완전 생초보

ubtaptt의 이미지

목차
컴퓨터를 만듭시다. 어때요~ 참 쉽죠? (0) : http://kldp.org/node/109764
컴퓨터를 만듭시다. 어때요~ 참 쉽죠? (1) : http://kldp.org/node/109814
컴퓨터를 만듭시다. 어때요~ 참 쉽죠? (2) : http://kldp.org/node/109901
컴퓨터를 만듭시다. 어때요~ 참 쉽죠? (3) : http://kldp.org/node/110005
컴퓨터를 만듭시다. 어때요~ 참 쉽죠? (4) : http://kldp.org/node/110137
컴퓨터를 만듭시다. 어때요~ 참 쉽죠? (5) : http://kldp.org/node/110214
컴퓨터를 만듭시다. 어때요~ 참 쉽죠? (6) : http://kldp.org/node/110311
컴퓨터를 만듭시다. 어때요~ 참 쉽죠? (7) : http://kldp.org/node/110440
컴퓨터를 만듭시다. 어때요~ 참 쉽죠? (8) : http://kldp.org/node/110515
컴퓨터를 만듭시다. 어때요~ 참 쉽죠? (9) : http://kldp.org/node/110602
컴퓨터를 만듭시다. 어때요~ 참 쉽죠? (10) : http://kldp.org/node/110670
컴퓨터를 만듭시다. 어때요~ 참 쉽죠? (11) : http://kldp.org/node/110850
컴퓨터를 만듭시다. 어때요~ 참 쉽죠? (12) : http://kldp.org/node/111015
컴퓨터를 만듭시다. 어때요~ 참 쉽죠? (13) : http://kldp.org/node/111192
컴퓨터를 만듭시다. 어때요~ 참 쉽죠? (14) : http://kldp.org/node/111678
컴퓨터를 만듭시다. 어때요~ 참 쉽죠? (15) : http://kldp.org/node/112152
컴퓨터를 만듭시다. 어때요~ 참 쉽죠? (16) : http://kldp.org/node/112552
컴퓨터를 만듭시다. 어때요~ 참 쉽죠? (17) : http://kldp.org/node/112832
컴퓨터를 만듭시다. 어때요~ 참 쉽죠? (18) : http://kldp.org/node/113385
컴퓨터를 만듭시다. 어때요~ 참 쉽죠? (19) : http://kldp.org/node/113754
컴퓨터를 만듭시다. 어때요~ 참 쉽죠? (20) : http://kldp.org/node/113854
컴퓨터를 만듭시다. 어때요~ 참 쉽죠? (21) : http://kldp.org/node/113950
컴퓨터를 만듭시다. 어때요~ 참 쉽죠? (22) : http://kldp.org/node/114146
컴퓨터를 만듭시다. 어때요~ 참 쉽죠? (23) : http://kldp.org/node/114407
컴퓨터를 만듭시다. 어때요~ 참 쉽죠? (24) : http://kldp.org/node/114537
컴퓨터를 만듭시다. 어때요~ 참 쉽죠? (25) : http://kldp.org/node/114666
컴퓨터를 만듭시다. 어때요~ 참 쉽죠? (26) : http://kldp.org/node/114667

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.