<날개셋> 한글 입력기는 사용자가 어떤 글쇠를 눌러서 만들어 낸 입력 단위를 ‘날개셋문자’라는 계층으로 추상화해서 표현한다. 영문 같은 간단한 글쇠배열이라면 A~Z까지 입력하는 문자 자체가 그대로 입력 단위이겠지만, 한글 입력은 그 이상의 계층이 또 필요하기 때문이다.
먼 옛날 1.x 시절에는 <날개셋> 한글 입력기는 그냥 조합형이라는 1 또는 2 multibyte 기반이었으며, 기본 입력 단위의 크기는 16비트였다. 그 16비트 숫자가 한글 자모라면 그건 한글을 조합하는 입력이고, 그렇지 않으면 조합을 만들지 않는 비한글 입력이니 아주 단순한 구조였다.
그 시절에도 특정 성분을 바로 지우고 앞뒤로 빼내는 ‘특수글쇠’라는 개념이 있었지만 그건 일반 자리에는 배당이 가능하지 않았고 Ctrl 조합에다가만 따로 배당할 수 있었다. 지금 생각해 보면 정말 원시적이고 미개하기 그지없었다.
그 뒤 2.x에 와서는 입력 단위의 크기가 32비트로 확장되었고 초중종성 성분의 크기도 5비트에서 8비트로 커졌다. 덕분에 옛한글과 간단한 가상 낱자도 표현할 수 있게 됐다. 입력 단위는 문자 아니면 특수글쇠(비문자)라는 이분법적인 구분이 생겼다. 하지만 여전히 내부 체계는 1.x와 별 다를 바 없을 정도로 빈약했다.
뭔가 지금과 같은 체계가 잡힌 것은 3.x에 온 뒤부터이다. 문자 코드는 완전히 유니코드 기반으로 바뀌었고, 날개셋문자라는 명칭이 정립됐으며 그 크기도 64비트로 넉넉하게 커졌다.
같은 문자도 한글과 비한글이라는 구분이 생겼다. 한글을 조합하는 데 쓰이는 ㅏ와, 단순히 있는 그대로 입력시키는 U+1161짜리 문자인 ‘ㅏ’를 구분할 수 있게 됐다는 뜻이다.
게다가 종전에는 글쇠배열의 벌식 정보가 글쇠배열 전체에 일괄적으로 적용되는 속성이었던 반면, 3.x부터는 각각의 날개셋문자가 자체적으로 두벌/세벌 정보를 갖게 했다. 도깨비불 현상은 두벌 속성을 지닌 날개셋문자 종성에다가 역시 두벌식 속성을 가진 중성이 결합할 때에만 일어난다. 따라서 한 글쇠배열에 세벌식으로 동작하는 글자(가령, ㅃ, ㅉ, ㄸ)와 두벌식으로 동작하는 글자(가령, ㅂ, ㅈ, ㄷ)가 자연스럽게 공존 가능하다.
3.x에서는 한글의 경우 여러 성분을 한꺼번에 배당해서 입력하는 것도 가능해졌다. 초성+중성 내지 중성+종성 같은 것 말이다. 그리고 자주 쓰이지는 않지만 굳이 한글 자모를 실제로 입력하지 않고도 오토마타의 내부 상태를 강제로 바꾸는 ‘상태 전이’라는 날개셋문자 타입도 추가했다.
그래서 ‘일반 문자, 한글 세벌식, 한글 두벌식, 특수글쇠, 상태 전이’ 이렇게 5종류의 날개셋문자 타입이 정립됐다. 카테고리를 더 나누자면 ‘한글, 비한글, 비문자’ 정도로 요약된다. 그리고 backspace와 한자(후보) 변환은 특수글쇠의 일종인 형태로 개념이 세워졌다.
이 정도면 버전 1~2 시절에 비하면 엄청난 발전을 이룬 것이었다.
그 뒤 날개셋문자에 타입이 또 추가될 일은 거의 없었다. 그러다가 2010년, 5.65 버전에서 다중 입력과 관련된 새로운 타입이 세 종류가 더 추가됐는데, 이것은 모두 나름대로 의미가 있는 것들이었다.
첫째, ‘다중 문자’이다. 기존의 ‘일반 문자’는 문자 하나의 유니코드 포인트 번호를 갖고 있으므로 일종의 UTF-32 스타일이다. 그러나 다중 문자는 UTF-16 방식으로 표현된 유니코드 문자를 최대 6바이트까지 저장하고 있는다.
일반 문자는 숫자 하나로 표현된다는 대표성이 있으며, 최종 변환이나 글쇠 치환등 각종 치환의 영향을 받는다. 그러나 다중 문자는 다수 개의 유니코드 포인트로 표현되는 합자, 옛한글, ‘000’ 같은 문자를 간편하게 표현할 수 있으며, 입력기 내부에서 다른 치환의 영향을 받지 않고 언제나 1~3개의 문자를 있는 그대로 입력하는 역할만 한다. 그러므로 존재의 의미가 충분하다고 볼 수 있다.
둘째, <날개셋> 한글 입력기가 복수 개의 한글 자모를 입력할 수 있다는 점에 착안하여, 그 자모들이 한 글자가 아니라 두 글자에 걸쳐서 입력되게 하는 날개셋문자가 추가되었다. 즉, 초+중+종이 아니라 종부터 입력한 뒤 음절을 끊고 초+중을 입력하는 놈, 그리고 중+종을 입력한 뒤 음절을 끊고 초성을 나중에 입력하는 놈 두 종류가 있다. 얘는 도깨비불과는 무관하므로 세벌식의 파생형이다.
덕분에 2010년대부터는 <날개셋> 한글 입력기가 제공하는 날개셋문자 타입은 8종류로 늘었는데.. 2012년, 버전 6.7에서는 잘 알다시피 두벌식에도 파생형이 하나 추가되었다. 바로 ‘종성 두벌식’ 되시겠다.
C++에서 new operator와 operator new가 서로 다른 용어이듯이, ‘종성 두벌식’과 ‘두벌식 종성’은 <날개셋> 한글 입력기의 내부에서 의미가 다른 개념이다.
지금까지 <날개셋> 한글 입력기가 제공한 두벌식 방식의 날개셋문자는 ‘초성 두벌식’이었다. 종성이 도깨비불 현상을 통해 다음 글자로 넘어갔을 때 초성으로 승격이 됐기 때문이다. 그러나 종성 두벌식은 다음 글자로 넘어갔을 때도 종성이 계속 유지된다.
순서를 바꿔서 ‘두벌식 종성’이라고 하면, 타입이 ‘초성 두벌식’이든 ‘종성 두벌식’이든 무관하게 어쨌든 두벌식이고 종성에 nonzero 값이 있는 날개셋문자를 가리킨다. “두벌식 종성과 두벌식 중성이 만나야 도깨비불 현상이 일어난다. 그런데 그 종성의 타입이 ‘초성 두벌식’이냐 ‘종성 두벌식’이냐에 따라 그 종성은 다음 글자에서 각각 초성이나 종성으로 등록된다.” 이렇게 관계가 정리된다.
세벌식과 두벌식에 대해 각각 이런 파생형 타입을 고안해 낸 것은 개인적으로 굉장히 뜻깊은 업적이라고 생각된다. 전에는 가능하지 않았던 한글 입력기의 새로운 기능이 추가된 것이기 때문이다. 특수글쇠 내지 타자 입력 순서 계산 같은 부수적인 기능들까지 중성 두벌식의 컨셉과 맞춰서 정확하게 동작하도록 로직을 강화하는 작업은 7.x대 중반 버전까지 내부적으로 계속되었다.
그리고 현재까지 <날개셋> 한글 입력기에 마지막으로 추가된 날개셋문자 타입은 바로 2015년 초, 7.9 버전에서 추가된 “글쇠 입력”이다. 비한글과 한글에 이어 ‘비문자’ 분야에도 타입이 또 추가된 것이다.
A라는 글쇠에다가 B를 누르는 날개셋문자를 추가한다면, A를 누른 것 자체는 <날개셋> 한글 입력기가 가로채어지며 응용 프로그램으로 전달되지 않는다. 그러나 이로 인해 B를 누른 동작이 인위로 생성되며, 이것은 <날개셋> 한글 입력기가 처리하지 않고 언제나 응용 프로그램으로 가는 것이 보장된다.
이 기능을 이용하면 간단한 단축키 조작을 할 수도 있고 영문과 숫자의 경우 IME가 아니라 키보드 직통으로 응용 프로그램으로 전달할 수도 있다.
키보드 입력을 생성하는 것 자체를 별도의 날개셋문자 타입으로 독립시키겠다는 생각을 어떻게 하게 됐나 정말 신기하다. 이 타입은 한글 입력과 관계가 있는 게 아니므로 굳이 ‘기본 입력기’가 아니라 ‘빈 입력기’에서도 제약 없이 사용할 수 있다.
이런 긴 과정을 거쳐서 <날개셋> 한글 입력기에는 현재 한글 세벌식 3종류, 두벌식 2종류, 비한글 문자 2종류, 비문자 3종류 이렇게 총 10종류의 날개셋문자 타입이 존재한다. 3.0 시절에 비해 정확하게 두 배로 증가한 것이다.
<날개셋> 한글 입력기의 구현체에 대해 논하자면 1.0때 처음부터 개발되어 온 에디터(since 2000), 2.5 과도기를 거쳐서 3.02때부터 개발된 외부 모듈(since 2004), 그리고 5.3 때부터 등장하여 최근에 많이 발전한 입력 패드(since 2009) 세 종류가 있으며 이들은 특징이 제각각이다.
그런 구현체의 종류 이상으로 <날개셋> 한글 입력기가 입력 단위로 받아들이는 날개셋문자의 타입도 종류가 다양하며 제각각 내력이 있다. 과연 미래에 제11째 타입이 등장할 일이 있을지 궁금해진다.
Posted by 사무엘