프로그래밍 학습
원저자: Soony(fstars@shinbiro.com)
필요에 따라 일부수정함
[들어가며]
퇴근 시간을 30분 남겨두고 어처구니 없게도 일을 다 마친바람에 여느 때처럼 웹서핑을 하다가
문득 글이 조금 쓰고 싶어졌는데 필자가 아는것은 별로 없는지라 마침 필자가 문자를 다루는
프로그램 회사에 다녔을때 배웠던 것을 혹시나 모르는 분들을 위해서 미숙하지만 이야기를
해볼까 한다.
[주의]
이 글은 정말 초보를 대상으로 작성된 글로써 필자는 이글에서 논의되는 내용의 좀더 심층적인
문제나 어투등을 문제 삼는 리플을 정중히 사양합니다. 단, 잘못된 점의 지적은 환영합니다.^^
표현의 원할함을 위해서 존칭은 생략했습니다.
[1. 멍청한 컴퓨터 문자에 눈을 뜨다]
1970년대 트랜지스터 컴퓨터를 넘어 IC 칩을 이용한 컴퓨터로 하드웨어가 발전하게 됨에 따라
당시로서는 더욱 다양한 전자기기의 정보의 교류가 필요하게된다. 그런데 실상은 알다싶이
컴퓨터는 0과 1밖에 모르는 바보였으니.. 한번 상상을 해보자.
컴퓨터가 문자를 알아먹고 문자로 표현할 줄 안다면?
데이터의 입력과 출력도 기존처럼 천공카드에 구멍뚫어서 0과 1을 표현하여 집어넣는거 보다
사람이 표현하기 쉬운 글로 입력하고 컴퓨터도 그걸 그대로 알아먹고 출력할 것이 있으면
사람이 알아보게 문자로 출력하는 ~
아~ 정말 당시로서는 꿈만 같은 이야기였다...
그래서 미국에서는 70년대 말 전자 정보에서의 문자에 관한 규격을 세우고 컴퓨터에게 문자를
가르치는 일을 맘먹기에 이른다..
그럼, 이제 컴퓨터에게 문자를 가르치는 과정을 간단히 설명해보자.
이를테면 이런거다.. 디지털, 디지털 요새 참 이 단어 많이 듣는데 컴퓨터가 알아먹는 디지털
신호는 이진수 즉, 0과 1 뿐이다. 할아버지 컴퓨터도 손주 컴퓨터도 지금 이시간 당신이 가지고
있는 컴퓨터도 모든 컴퓨터는 0과 1밖에 모른다. 아닌거 같다고?
근데 어쩌나 여러분이 늘상듣는 바이트, 비트등의 데이터 단위 그게 다 0과 1의 조합이다.
자꾸 아니라는 생각이 들어도 일단은 필자를 믿어주자.
자 중요한건 컴퓨터는 문자를 모른다!
0과 1의 조합 밖에는 아는게 없다. 그러나 사람은 모니터에 문자를 표현하고 싶다는 거다.
그럼 이제 이런 가정을 해보자
1개의 비트는 0과 1, 이 2가지를 표현할 수 있다.
이때 0은 'a', 1은 'b' 라고 정하자. (정하는 거다 - 일단 필자를 믿어주자)
사람이 키보드에서 a 라고 치면 중간에서 이를 정해진 기준표에서 조회해보고
아 이거 0이군.. 해서 0으로 바꿔서 데이터를 저장한다.
b도 마찬가지..
그럼 01101 이라고 데이터가 들어가 있는 상태에서 만약 문자 1개당 1비트다 라고 정의되어
있고 지금 저 데이터를 모니터에 문자로 뿌려라 하면 컴퓨터는 있는 그대로 01101을
보여주는게 아니고 'abbab' 라고 문자로 보여주면 되는 것이다.
이게 컴퓨터에서 비트 데이터들을 문자와 매칭시켜서 표현하는 것으로 이런식으로 알파벳의
26개 문자를 어디서나 통일성 있게 순서를 두어 표준을 정하면 우리는 원하는대로 글자로
입력하여 데이터를 입력할 수 있고 출력도 할 수 있게 되는것이다.
여기서 중요한것은 무엇? "컴퓨터는 0과1의 조합밖에 아는게 없다는거다!!"
자, 근데 앞의 예제에서 보았듯이 1비트 가지고는 표현할 수 있는게 고작 2개다..
그러나 알파벳은 일단 문자가 26개, 거기다가 대문자는 안써먹나? 그래서 2배하니
52개, 음... 거기가다 간단한 부호도 쓰니 이것두 몇개 넣자 (이런거 말이다. " !$#%^ ")
음.. 또 뭐있을까.. 아.. 이녀석 한칸띄우기나 줄 새로 시작하기 뭐 이런것두 모르겠다..
(누차 강조하지만 컴퓨터는 0과1의 조합인 바이트 흐름밖에 아는게 없으며 공백이란것두 어떤
특별한 조합에 대응시켜야 알아먹지 데이터가 끊겼다고 공백이 아니다. -_- 음.. 설명이 어렵군)
그래서 공백, 라인바꾸기, 한칸 지우기 등등의 특수문자도 몇개 넣어두자..
이렇게 저렇게 잡다하게 좀 집어넣었더니 어느덧 표현해야할 가지수가 128가지나 되었다.(많이도 넣었네..ㅡ_ㅡ)
일단 128가지를 표현해야하니 비트 묶음이 7개가 필요하다. (2의 7제곱 = 128)
즉, 7비트를 하나의 묶음으로 보고 0~127까지의 표현수중 어느것이냐만 따지면 일단 알파벳과
대충 기호들을 표현할 수 있겠다
이렇게 정의된것이 ASCII 이다..
ASCII 코드표는 여기서 확인이 가능하다.
하드웨어의 조건상 처리할 데이터 크기는 적으면 적을수록 좋은거다.
1개의 문자를 표현하는데 꼭 7비트가 필요하다면 거기까지 수용하는거고 굳이 8비트씩
다룰 이유가 없다. 따라서 ASCII 는 처음에는 7비트를 1문자씩 처리하였다.
[마침]
음.. 술을 먹은것도 아니고 너무 두서없이 쓴거 같다.. 뭔 시리즈처럼 1이라고 쓰긴 했는데
사실 2가 언제 나올지는 장담 못하겠다. 반응 않좋으면 안나올지도...ㅎㅎ
암튼 기회가 된다면 다음에는 Latin1 로 넘어가면서 8비트를 1개의 문자로 다루게 됨과 더불어
일본어를 비롯한 동아시아 문자셋 얘기를 해볼까 한다.
[들어가며]
오호 통재라~ 어찌 오늘도 할일 없이 웹서핑이란 말이냐..ㅡ_ㅡ;
지난번에 이어서 이야기를 서둘러 시작해보자.. "약주한잔하고 집필하라"는 고마운 말씀도
있었으나 회사인 관계로 약주는 생략하자.
[주의]
이 글은 정말 초보를 대상으로 작성된 글로써 필자는 이글에서 논의되는 내용의 좀더 심층적인
문제나 어투등을 문제 삼는 리플을 정중히 사양합니다. 단, 잘못된 점의 지적은 환영합니다.^^
표현의 원할함을 위해서 존칭은 생략했습니다.
[2. 문자 1개는 1Byte~]
이전글의 기억을 조금 상기시켜보자. 이진 Bit 흐름 밖에 알아먹지 못하는 컴퓨터에게 문자를
다루도록 하기 위해서 미국넘들은 ASCII Code 라는걸 기준으로 채택하였으며 이 코드표에는
총 128가지의 약속이 있어서 이를 표현하려면 7비트의 경우의 수가 필요하다고 했다.
그런데 사실 7비트는 맘에 안들기는 하다. 나누고 붙이고를 좋아하는 비트 연산의 입장에서는
짝수가 맘에 들었나보다. 그래서 우리는 1Byte = 8Bit 라고 알고 있는것처럼 기본 단위는
8비트이니 7비트의 ASCII 코드를 8비트에서도 판독이 가능하도록 조정하고 이후 모든 컴퓨터
에서는 1바이트 단위로(즉, 한번에 8Bit씩) 읽어들이게 하면 읽어들인 1바이트마다 1개의 문자를
표현할 수 있게 되는것이다.
그럼 조정은 어떻게 하느냐..
예를 들면
0100001 --> 'A' (자릿수 하나당 비트 하나씩 즉, 7비트이며 현재 십진수로는 65를
나타내고 이는 ASCII Code 에서는 대문자 A를 나타낸다)
이 7비트의 앞에 0값의 비트 하나를 더 추가한다.
00100001 --> 'A' (자릿수가 하나늘어난 8비트가 되었다. 그러나 앞에 붙은게 겨우 0이
므로 십진수로 변환하면 여전히 65의 값을 가진다. 그러므로 대문자
A를 나타낸다.)
이해가 될려나..-_-; 즉, 7비트 오리지날 ASCII 로 작성된 글을 한문자씩(7비트씩) 읽어서 그
읽은것에 0인 Bit 하나를 추가하면 8비트 단위의 ASCII 로 변환이 가능한것이다.
(사실 이거 별 필요는 없다. 요새 7비트 인코딩 전송은 특별한 경우가 아니면 사용하지 않기
때문이다. 요즘엔 한 문자는 1Byte, 즉 8Bit 라고 널리 인정되고 있기 때문이다.)
[3. 문자, 서유럽으로 확장되다]
ASCII Code는 미국넘들이 자국 내에서의 정보 통신을 위해 만든것이다. 당연히 지들 쓸것만
집어넣은 것이니 미국넘들에게는 필요없는 움라우트찍은 O (즉, 이거 "O") 라든지 것들은
ASCII Codeset 128가지 문자에는 없는것이다. 아무리 영어가 세계어라지만 독일이나 기타
유럽어를 사용하는 나라 애덜이 기왕이면 자기나라의 문자도 표현되었으면 좋겠다고 생각할
것은 당연한 일...
컴퓨터가 미국에서만 쓸거라면 상관없지만 어디 그러한가.. 이제 세계는 바야흐로 컴퓨터 세상
인것을.. -_-;
그러나 전 강좌에서도 이야기 했지만 128가지는 이미 7Bit의 경우의 수를 다채운 것이다.
만약 이보다 더 문자를 넣고 싶다면 Bit가 늘어나야한다.
다행히 기본 단위는 7비트가 아니고 8비트 이므로 맨 앞 1비트가 비어있다.
7비트는 128가지 , 그러나 8비트는 2의 8제곱이므로 256가지
즉, 비트 하나가 더 추가 됨으로서 나머지 뒤쪽 128가지의 경우를 더 적용할 수 있는 여유가
생긴것이다.
여기서 한가지 집고 넘어갈것은 그렇게 가능하면 Bit수를 줄이려고 노력하던 예전 하드웨어
시절에서 움라우트 글자나 몇개 집어넣을거면 ASCII Code 에서 부호몇개 움라우트 글자로
대체해서 128가지를 새롭게 자기들 방식으로 맞추면 되는거 아니냐 하시는 분들은 "호환성"
이라는 글자를 가슴에 집어넣어주자..-_-;
그렇다.. 호환성이다.. 위의 가정대로 만약 독일이 자기 나름대로의 새로운 글자조합 128가지를
만들었다면 이는 독일 내에서만 사용되어야 하지 미국넘이 ASCII Code 로 작성해서 보낸
문서는 오류가 나타나게 된다.
즉, ASCII Code 에서는 33번째 문자에 "!"를 할당하였는데 독일 넘들은 우린 느낌표안써! -_-;
라며 대신 거기다 움라우트 A 를 집어넣으면 어떻게 될까.
미국넘이 본문에 "A!" 라는 2글자를 전자메일로 독일에 보냈다.
A! 라는 글자는 ASCII Code 테이블에 맞추어 00100001 00010001 요렇게 2개의 바이트로
변환되고 이것이 독일쪽으로 전송된다.
받는쪽 독일 컴퓨터에도 00100001 00010001 라는 바이트는 변함이 없다.
그러나 여기서 독일쪽 컴퓨터는 이를 문자로 변환할때 ASCII Code를 사용하는게 아니고
자체 코드를 사용하여 "AA" 이라고 표현해 버린다.
이게 몬가.. 전달하려는 의미를 완전히 무시해 버린게 된것이다. -_-;
한술 더떠서 ASCII Code 와는 기본 알파벳 순서 마저 다르다면?
그래서 호환성이 필요한 것이다.
미국 표준협회에서 관장하던 ASCII Code는 어느덧 하드웨어가 발달하고 컴퓨터를 사용하는
지역이 전세계로 확장됨에 따라 ISO (국제 표준 협회) 라는 기관에서 표준 글자 코드를 관장
하게 되었다.
ISO는 기본 ASCII Code를 충분히 호환하면서 서유럽 언어까지 사용가능한 새로운 문자셋을
채택하니 이른바 ISO-8859-1/Latin1 이다.
Latin1 문자셋은 앞쪽 128 (즉, 0~127까지) 에는 기본 ASCII Code를 그대로 계승하여 호환을
유지하고 뒤쪽 128 (즉, 128~255까지) 에 움라우트 붙은 글자들과 같은 서유럽 고유의 문자들
을 배치하여 문자셋을 정의하였다.
이제부터 문서 인코딩을 서유럽어(ISO-8859-1/Latin1)으로 세트하면 미국에서 작성한 문서나
독일에서 작성한 문서나 가리지 않고 같은 내용을 표현할 수 있게 된것이다.
세월은 흘러 1980년대 초 ....
동아시아에도 컴퓨터가 제법 보급되기 시작한다.
그당시에는 가장 발달 순서가 높았던 일본넘들이 일본어를 컴퓨터로 표현하고 싶어했다..
(아마 다음 강좌나 다다음 강좌에 표현하고 싶어 할것이다. -_-;)
[마침]
뭔가 할말은 많으나 꼭 쓰다보면 논지가 흐려지는 것이 아무래도 글쓰기에는 별다른 재주가
없나보다. 그나마 태클없이 이 부족한 글을 읽어주시는 몇몇 자월분들에게 고마울 뿐이다.
[들어가며]
오호.. 하루에 2개나 올리다니 너무 열정적인 강의 아닌가..>_<
필자도 바쁠땐 바쁘다.. 오해 마시길.. 오후에 잠깐 업무가 밀려서 정신이 없었다..
이 정신 없는 마음으로 그럼 3강도 시작해보자..^^
[주의]
이 글은 정말 초보를 대상으로 작성된 글로써 필자는 이글에서 논의되는 내용의 좀더 심층적인
문제나 어투등을 문제 삼는 리플을 정중히 사양합니다. 단, 잘못된 점의 지적은 환영합니다.^^
표현의 원할함을 위해서 존칭은 생략했습니다.
[4. 문자?, 문자셋?, 인코딩?, 폰트?]
틀렸다.. 원래부터 계획을 세우고 진행한 강의도 아니고 즉흥적으로 쓰다보니 강의의 순서가
틀려져 버렸다. 초보를 위해 글을 쓴다고 하고선 "문자셋" 이나 "인코딩" 의 명확한 뜻도
전달하지 않고 강의 내용에 등장했으니 얼마나 이해가 어려우셨으랴.. -_-;
그렇다고 서적에 있는 사전적 정의를 쓰겠다는 것은 아니다.. 그러나 개념은 잡고 가야하지
않겠는가? (잡을건 잡고 가자.. 갈길이 멀어도 할건 해야하는 거다 -_-)
-- 문자?
문자를 모르시는 분이야 있겠냐만은 이분야에서 중요한것은 우리가 생각하는 문자는
Case-Sensitive (대소문자 구별 즉, 대문자 A와 소문자 a 는 다름) 하다는 거다.
전 강의에서도 이야기했지만 표현할 때 구별이 되어야 한다면 A 와 a 는 다른 것이고
그래서 영어 문자는 26개가 아니고 52개라 했다. 이러한 현상은 대부분의 라틴계 알파벳을
사용하는 언어권에 다 포함되며 일본어도 그러하다. (히라가나 와 가타가나 문제가 아니고
같은 "あ" 라 하여도 작은거와 큰게 있다. 당연히 구별한다.)
-- 문자셋?
하나의 언어권에서 사용하는 언어를 표현하기 위한 모든 문자의 모임을 문자셋(Character Set 또는 Charset) 이라한다. 영어는 일단 대소문자 통틀어 56개를 일렬로 모으면 영어 문자셋이 된다. 물론 ASCII Code에서는 이외에도 부호와 공백 등과 같은 특수 문자를 더 추가하여 ASCII Character Set 으로 확정했지만 어찌되었든 주된 내용은 표현 가능 문자들의 모임이다.
그렇다면 우리의 자랑스런 한글 문자셋은 어떻게 모으면 될까?
자음 14 + 5(5는 뭐냐고? ㄲㄸㅃㅆㅉ ^^ , ㄱ 2번 연타한다고 ㄲ 되는거 아님을 안다면 이의제기 하지말고 필자를 믿어주자) 로 19개, 모음은 10 + ㅐㅒㅔㅖㅘㅙㅚㅝㅞㅟㅢ 로 21개 ... 더 있나..?
우리나라는 대소문자가 있는것도 아니고 (한글도 작은게 있다고? 그건 소문자가 아니고 글자 폰트 크기가 작은거다. 부디 혼동하지 말자-_-) 이정도면 골라쓰겠지? 대충잡아 우리도 40개정도면 한글 문자셋이라 할 수 있겠네...?
ㅡ.,ㅡ 안타깝게도 틀렸다.. 문자셋은 하나의 글자로서 준비된 문자의 모임이어야 한다. "가" 를
표현하기 위해 키보드로는 "ㄱ +ㅏ"를 순서대로 입력하지만 우리 한글은 영어처럼 순서대로 한글자씩 불러오면 되는게 아니기 때문이다. 키보드로 "ㄱ+ㅏ" 를 순서대로 입력하면 1글자폭의 준비된 "가" 라는 글자로 표현되어야 하며 그러기 위해서 문자셋에 "가" 라는 모양이 들어있어야 하는것이다. 그럼 우리 한글 문자셋의 문자는 총 몇개나 될까 ?
"가" 부터 시작하여 "각" 을 거쳐 "꾹꾼 A꿀꿈" 등등을 지나 주루룩 ~ "

