티스토리 뷰

한자 오필 입력기


- 개발하게 된 동기

학교에서 중국어를 배우는데, 왜이렇게 중국어가 재밌는지. 휴대폰으로 한자를 입력할 방법을 찾다가 다섯가지 획만으로 모든 한자를 입력하는 입력기를 알게되어 설치하게 되었다.


이 방법을 컴퓨터 에서도 쓰고 싶어서 PC판 오필입력기를 찾는데, 도통 나오질 않고 겨우 찾은 프로그램은 이미 휴대폰 자판에 익숙해진 나에게 너무 불편했다. 획 자판이 일렬로 나열되어 있었고 검색 결과 밑에 우리나라 한자 음이 표기 되면 좋겠다라는 생각에 그럴바에 직접 만들어 버리지 뭐, 하면서 시작하게 된것이 C언어를 배워야 하는 대 프로젝트로 커지고 말았다.


- 오필입력이란?

간단히 말해, 한자의 획을 다섯가지로 구분하여 획 수 대로 입력하는 방법.

예를 들어, "열 십 十"같은 한자의 경우 가로획, 세로획 두가지 획이 있으므로 해당하는 획 버튼을 순서대로 누른다.


여기서 중요한 점은 획순을 지켜야 한다는 것이다.

자세한 사항은 필자가 위키백과에 정리해 두었다.


위키백과 "오필화수입법": https://ko.wikipedia.org/wiki/%EC%98%A4%ED%95%84%ED%99%94%EC%88%98%EC%9E%85%EB%B2%95


위키에도 나와있듯이, 이 입력법의 장점은 한자의 모양만 알고 있으면 입력할 수 있는것 이지만, 한자 획순의 규칙을 알아야 하고, 규칙을 알고 있다 하더라도 대부분의 한자들은 규칙대로 입력하기 힘들다. 특히 "벚 우 友"와 "반할 반 反"자는 이 입력법으로 입력하려고 하면 처음 쓰는 사람에게는 혼란을 야기 하기 쉽다. 맨 첫번째 획만 다르고 나머지는 다 똑같다.


그럼에도 불구하고 난 이 입력법이 너무 좋다. 너무 매력적 이기 때문이다.




- 프로그램으로 구현하기 까지


이를 프로그램으로 구현하기 위해서는, 어떤 한자에 대한 획 정보를 담고있는 표가 필요한데, 직접 만들기는 뭐하고 인터넷을 검색하던 도중에 아니나 다를까, 이미 누군가 파싱하기 쉽도록 만들어 두었다.


획 테이블: https://code.google.com/archive/p/ibus-t9/issues/3


이 개발자는 이미 한참전에 개발을 멈춤것 같다. 완성이 된것인지는 자세히 알아보지 않아서 모르지만 좋은 자료다!


이제 이 테이블을 가지고 해야하는 일은 테이블 검색이다. 세상에나. 이 테이블에는 20000개는 넘는 한자데이터들이 있다. 지금까지 이렇게 많은 데이터는 다뤄 본적이 없어서 막막했지만 사전처럼 일정한 규칙이 있었기에 적당한 알고리즘이 있을거라고 생각했다. 찾은 알고리즘은 바로 "이분법적 검색(binary search)" 이다. 정렬되어있는 데이터셋에서 매우 강력한 힘을 발휘한다. 한번 루프를 돌 때 마다 검색의 범위가 반으로 줄기 때문에 속도가 미친듯이 빠르다.


물론 정렬이 되어있어야 하고, 어떤 방식으로 정렬이 되어있는지 알아야 한다는 문제가 있다.


그래서 두 가지의 데이터 베이스를 만들었다.

첫번째 데이터 베이스는 획수의 길이를 고려하여, 짧은것이 우선순위가 높은 정렬이고, 두번째 데이터 베이스는 길이는 고려치 않고 획의 종류로만 정렬한 데이터 이다.


첫번째와 두번째 테이블을 가지고 검색했을때, 다른 이점이 있는데 획수를 고려했을때의 결과는 획수를 고려했기 때문에 획수대로 검색할 수 있다는 것이고, 그 때문에 획수는 같은데 비슷한 한자들을 나열할 수 있다.

두번째 테이블 같은 경우는 같은 부수를 가지는 한자들을 많이 찾을 수 있다. 예를 들어 삼수변을 검색했다면 삼수변을 부수로 두는 한자들이 나올것이다. 만약, 첫번째 테이블에서 삼수변을 찾으면 3획짜리 한자들이 나올것이다.


둘중 하나를 골라 하나만 쓰기에는 좀 그래서 각 테이블에서 5개씩 검색하여 둘다 보여주기로 결정했다.


그 다음 GUI를 만들고 모바일 입력기 처럼 버튼을 만들어 획을 입력하도록 하고 검색한 결과를 열개의 버튼에 순서대로 표시하여 해당 버튼을 누르면 그 한자가 커서에 나오도록 했다.


그 다음에 검색결과에 우리나라 한자 음이 나오면 좋겠다 싶어서 이번에는 그에 대한 데이터베이스를 찾다가 Unihan이라는 것을 알게 되었다.


Unihan: http://unicode.org/charts/unihan.html


이 프로젝트는 한중일 한자의 대한 데이터를 수집하여 현재 zip파일 형태로 데이터 베이스를 제공하고 있다. 한중일의 한자들중 같은 한자이나, 모양이 다른 한자들에 대해서도 모두 정리해 두었고 일본어 발음, 중국어 발음, 한국어 발음, 광둥어 발음등 발음에 대한 정보도 모두 들어있고 영어로 뜻 또한 들어있다.

데이터 베이스 중에서도 Unihan_Readings.txt 라는 파일에 kHangul이라는 속성에 한국어 한자 발음에 대한 정보가 들어있다. 이 데이타 베이스도 용량이 방대하기 때문에 이분법적 검색 알고리즘을 사용했다.(거의 만능)


이제 기본적인 틀은 모두 갖추었으나, 사용하는데 너무 불편하다. 그 이유는 마우스로 일일이 눌러야 하기 때문이다. 그래서 키보드 입력을 지원해 보기로 했으나, 자바로 개발했기에 컴퓨터 자체의 키보드 입력을 받는데 문제가 있다. 그래서 전역 키보드 후킹을 해야하는데 네이티브 라이브러리를 이용해야 한다.


물론 오픈소스로 네이티브 키보드 후킹 라이브러리가 존재하나, 진짜 내가 원하는 기능이 없었다. 바로 키보드 입력을 '취소'시켜버리는 것이다. 이거 하나때문에 내가 직접 키보드 후킹을 만들어야지, 라고 생각했다. 사실 엄청 좋은 기능이지만, 이를 구현하려면 배울게 하나둘이 아니었다.


일단 가장 기본중의 기본 언어인 C를 선택하였고 dll을 만들어야 했다.

키보드 후킹을 하기위해서는, 프로세스마다 dll을 inject하여 jvm에 알려주어야 하는데 처음에는 다 무슨 소린지 알아듯질 못했다.


프로세스간 메모리 공간이 불리되어 thread-safe한 객체일 지라도 한 프로세스 내에서만 유효하다는 것, 핸들은 한 쓰레드 내에서만 유효 하다는것, 포인터와 이중 포인터의 개념, 이름있는 파이프, 구조체, jni의 사용 등 배우고 이해해야 하는것이 많았고 두 세번 갈아 엎어서 완성했다.


실제로 사용하면서도 문제가 있었는데, 키보드 입력 취소가 목적이었던 터라 자바에서 함수를 빨리 return 해주지 않으면 dll에서 계속 기다리고 있는 탓에(그것도 KeyboardProc에서) 시스템의 입력 전체가 맛이 가는 부작용이 있었다. 물론 이 문제는 프로그래밍 하면서 게속 유념해야 할 것이다. 그래서 딜레이가 생기는 일 이라면 자바에서 쓰레드를 생성해서 이벤트 함수는 빨리 리턴해 주고 후에 작업을 해 주어야 한다.


- 완성



'프로그래밍 > 한자 오필 입력기' 카테고리의 다른 글

한자 오필 입력기 기능 추가  (0) 2016.08.10
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday