brunch

키보드 속의 작은 마법사, 한글 오토마타 이야기

한글날을 기념하며

by 미미니

우리가 컴퓨터나 휴대폰으로 “가”라는 글자를 칠 때, 사실 눈에 보이지 않는 작은 마법사가 하나 움직입니다.

이름하여 한글 오토마타(Hangul Automata).

우리는 단순히 ‘ㄱ’과 ‘ㅏ’와 ‘ㄱ’을 눌렀을 뿐인데, 이 마법사는 그 둘을 순식간에 하나로 합쳐서 ‘가’를 만들어냅니다.


한글은 ‘쌓이는 글자’다


영어나 숫자는 그냥 나열하면 끝입니다. A 다음에 B, 그 다음에 C. 줄줄이 이어지죠. 그런데 한글은 달라요. ‘ㄱ’과 ‘ㅏ’를 나란히 놓지 않고, 위아래로 쌓아서 하나의 블록으로 만듭니다. 이건 세계 어느 문자에도 없는 방식이에요.


그래서 한글을 입력할 때는 단순히 “글자를 나열”하는 게 아니라, 조립하는 과정이 필요합니다. 마치 레고처럼요.


오토마타는 한글 조립 로봇이다


내가 키보드로 ‘ㄱ’을 치면, 오토마타는 이렇게 말합니다. “좋아, 초성은 ㄱ으로 정했어. 다음은 뭐야?”

그 다음에 ‘ㅏ’를 누르면, “중성 ㅏ 추가! 그럼 이제 ‘가’ 완성!”

그리고 만약 다음에 또 ‘ㄱ’을 치면, “음, 이번엔 받침으로 붙여서 ‘각’으로 바꿀게!”


이런 식으로 오토마타는 순간순간 글자의 조합 상태를 추적하며 우리가 원하는 글자를 만들어냅니다. 한 글자를 완성할 때마다 머릿속으로 작은 회의가 열리는 셈이죠.

‘이건 초성일까, 받침일까?’

‘새 글자를 시작해야 할까?’

그 판단을 오토마타가 대신해줍니다.


한글 오토마타사용자의 입력에 따라 한글을 조합하고 처리하는 자동화된 기계 혹은 소프트웨어 알고리즘입니다. 이는 한글의 복잡한 글자 구조를 효율적으로 처리하기 위해 상태(State)와 전이(Transition)의 개념을 이용하여 입력 문자열을 인식하고, 한글 조합을 완성하죠.


세종대왕은 알고 있었다


놀랍게도 이런 정교한 조립이 가능한 이유는 한글 자체가 논리적으로 설계된 문자이기 때문입니다. 모든 글자는 초성(첫소리) + 중성(가운뎃소리) + 종성(끝소리)으로 정확히 분해되고, 다시 조립할 수도 있죠.


세종대왕이 한글을 만들 때 “발음의 원리를 글자 구조에 담았다”라고 했는데, 그 말은 곧 오토마타로 구현하기 쉬운 문자로 만들었다는 뜻이기도 합니다. 결국 한글은 세계 최초의 프로그래머 친화형 문자라고 해도 과언이 아닙니다.


글자가 만들어지는 찰나의 순간


우리가 ‘사랑해’ 세 글자를 입력할 때, 컴퓨터 속에서는 수십 번의 조립과 분해가 일어납니다.

‘ㅅ’과 ‘ㅏ’가 만나 ‘사’가 되고,

‘ㄹ’과 ‘ㅏ’가 합쳐져 ‘라’가 되고,

그 사이에서 받침이 붙었다 떨어지기를 반복합니다.


하지만 그 모든 과정은 0.01초도 안 되는 속도로 끝납니다. 그래서 우리는 그 마법을 눈치채지 못하죠. 화면에는 그냥 “사랑해”라는 부드러운 글자만 남습니다.


오토마타의 철학


한글 오토마타는 단순한 기술이 아닙니다. 그 안에는 조합의 철학이 숨어 있습니다. 모든 글자가 제멋대로 만들어지는 게 아니라, 명확한 원리와 순서에 따라 생겨납니다.

모든 글자가 규칙에 따라 생성 가능하다는 점,
그 규칙이 논리적으로 완전하며, 인간의 발음 구조와 일치한다는 점.

한글을 만든 세종대왕이 인간의 발음 구조를 분석해

글자를 체계화했듯, 오토마타는 그 체계를 기계 언어로 옮겨 놓은 존재입니다.


컴퓨터 속에서는 어떻게 돌아갈까?


사실 유니코드에는 한글 완성형 글자 11,172자가 모두 등록되어 있습니다. 하지만 우리가 키보드로 입력하는 것은 그 완성형이 아니라 조립 부품들이에요. 그래서 오토마타(Automata)가 해야 할 일은 다음과 같습니다:

1. 사용자가 ㄱ을 입력 초성 버퍼에 저장

2. 다음에 ㅏ를 입력 중성 버퍼에 저장

3. 두 버퍼를 조합 완성형 ‘가’ 출력

4. 만약 다음 입력이 ㄱ이면 종성으로 붙여 ‘각’ 출력

5. 또 모음이 오면? 종성을 떼서 다음 글자 초성으로 넘김 ‘가가’ 완성


상태전이 그래프의 상태를 다음과 같이 가정해 보죠.

• S0 (시작): 입력이 시작되는 지점입니다.

• S10 (초성 - 홑자음):초성(예: ㄱ, ㄴ 등)이 입력된 상태를 나타냅니다.

• S11 (초성 - 쌍자음): 쌍자음(예: ㄲ, ㄸ 등)이 입력된 상태를 나타냅니다.

• S20 (중성 - 단일):중성(예: ㅏ, ㅓ 등)이 입력된 상태를 나타냅니다.

• S21 (중성 - 조합):이중 모음(예: ㅘ, ㅙ 등)이 입력된 상태를 나타냅니다.

• S30 (종성 - 단일):종성(예: ㄱ, ㄴ 등)이 입력된 상태를 나타냅니다.

• S31 (종성 - 자음군):겹받침(예: ㄳ, ㄵ 등)이 입력된 상태를 나타냅니다.


“각”은 초성 ‘ㄱ’(홑자음), 중성 ‘ㅏ’(단일 모음), 종성 ‘ㄱ’(단일 종성)으로 구성됩니다. 이를 기반으로 상태 전이를 추적하면 다음과 같습니다:


1. S0 -> S10:

• 초성 ‘ㄱ’(홑자음)이 입력되면 S0(시작)에서 S10(초성 - 홑자음)으로 전이합니다.

• 이 단계에서 ‘ㄱ’이 입력된 상태가 됩니다.

2. S10 -> S20:

• 중성 ‘ㅏ’(단일 모음)가 입력되면 S10에서 S20(중성 - 단일)으로 전이합니다.

• 이 단계에서 ‘가’라는 미완성 글자가 형성됩니다.

3. S20 -> S30:

• 종성 ‘ㄱ’(단일 종성)이 입력되면 S20에서 S30(종성 - 단일)으로 전이합니다.

• 이 단계에서 ‘각’이라는 완성된 한글 글자가 형성됩니다.


유니코드에서 한글 완성형 문자의 시작점은 U+AC00입니다. 이후 글자마다 다음 규칙으로 인덱스가 정해져요.

코드 = 0xAC00 + (초성_index × 21 × 28) + (중성_index × 28) + 종성_index

예를 들어 ‘각’의 경우:

• 초성 ㄱ index 0

• 중성 ㅏ index 0

• 종성 ㄱ index 1

이를 코드로 표현하면,

= 0xAC00 + (0×21×28) + (0×28) + 1
= 0xAC01 '각'

이 규칙 하나로 11,172개의 글자를 전부 만들어낼 수 있습니다. 한글이 얼마나 체계적이고 프로그래머 친화적인지 느껴지죠?


마무리: 자랑스러운 한글


다음번에 키보드로 한글을 입력할 때, 잠시 멈추어 생각해 보세요.


당신의 손가락 끝에서,

‘ㄱ’과 ‘ㅏ’가 만나 ‘가’가 되고,

‘ㅂ’과 ‘ㅏ’가 만나 ‘바’가 되는 그 순간

보이지 않는 한글 오토마타가 열심히 글자를 조립하고 있을 거예요.


우리가 매일 사용하는 평범한 문자 속에도 세종대왕의 논리와 엔지니어의 정교함이 함께 살아 있습니다.

keyword
작가의 이전글AI vs. 작가: 드디어 ‘공정 싸움’의 시작