2벌식 알고리즘
KS X 5002/5003, 키 매핑, 쌍자음·겹모음 입력, 상태 전이
2벌식은 한글 자모를 두 벌(자음 벌·모음 벌)로 나누어 쿼티 자판에 배치하는 방식이다. 같은 키가 초성이 될 수도 종성이 될 수도 있어, 현재 조합 상태(초성만 / 초성+중성 / 초성+중성+종성)에 따라 키를 해석하는 상태 의존 알고리즘이 필요하다. 아래는 KS X 5002/5003 기준 2벌식 알고리즘 요약이다.
1. KS X 5002·KS X 5003
- KS X 5002: 대한민국 “정보처리용 건반 배열” 표준(1982년 KS C 5715로 제정, 2007년 KS X 5002로 개정). 고정된 배치로 영문 26자와 한글 낱자 26자(기본 자모 24자 + ㅐ, ㅔ)의 자리를 규정한다.
- 겹홀소리 2자(ㅖ, ㅒ) 와 된닿소리 5자(ㄲ, ㄸ, ㅃ, ㅆ, ㅉ) 는 표준에서 같은 자리 권장이지만, “다른 낱자를 조합하여 입력할 수 있도록” 글쇠 자리·입력 방법을 고정하지 않았다. 따라서 Shift+키 또는 같은 키 두 번 등 구현이 다양하다.
- KS X 5003(1991년): 86글쇠·103글쇠에 따른 배열표를 제시한다. 실제 IME는 KS X 5002/5003을 참고하되, 벌별·제조사별로 세부 배열이 다를 수 있으므로 구현 시 표준 문서를 확인한다.
2. 키 → 유니코드 매핑
2.1 유니코드 한글 블록
한글 자모는 유니코드에서 세 가지 블록으로 표현된다:
| 블록 | 범위 | 용도 | 예시 |
|---|---|---|---|
| Hangul Jamo | U+1100–U+11FF | 조합용 자모 (초성·중성·종성 구분) | ᄀ(U+1100), ᅡ(U+1161), ᆨ(U+11A8) |
| Hangul Compatibility Jamo | U+3130–U+318F | 호환용 자모 (독립 표기) | ㄱ(U+3131), ㅏ(U+314F) |
| Hangul Syllables | U+AC00–U+D7AF | 완성형 음절 | 가(U+AC00), 각(U+AC01) |
IME의 유니코드 사용 방식:
- preedit(조합 중): 일부 IME는 Hangul Jamo(U+1100–U+11FF)를 사용하고, 일부는 Compatibility Jamo(U+3130–U+318F) 또는 완성형(U+AC00–)을 사용한다.
- commit(확정): 대부분 완성형 음절(U+AC00–U+D7AF)을 사용한다. 단, 받침 없이 초성만 commit할 때는 Compatibility Jamo를 쓰는 IME도 있다.
2.2 2벌식 키 → 유니코드 자음 매핑
| 영문 키 | 한글 | Compatibility Jamo | Jamo (초성) | Jamo (종성) |
|---|---|---|---|---|
| r | ㄱ | U+3131 | U+1100 | U+11A8 |
| R (Shift+r) | ㄲ | U+3132 | U+1101 | U+11A9 |
| s | ㄴ | U+3134 | U+1102 | U+11AB |
| e | ㄷ | U+3137 | U+1103 | U+11AE |
| E (Shift+e) | ㄸ | U+3138 | U+1104 | — (종성 없음) |
| f | ㄹ | U+3139 | U+1105 | U+11AF |
| a | ㅁ | U+3141 | U+1106 | U+11B7 |
| q | ㅂ | U+3142 | U+1107 | U+11B8 |
| Q (Shift+q) | ㅃ | U+3143 | U+1108 | — (종성 없음) |
| t | ㅅ | U+3145 | U+1109 | U+11BA |
| T (Shift+t) | ㅆ | U+3146 | U+110A | U+11BB |
| d | ㅇ | U+3147 | U+110B | U+11BC |
| w | ㅈ | U+3148 | U+110C | U+11BD |
| W (Shift+w) | ㅉ | U+3149 | U+110D | — (종성 없음) |
| c | ㅊ | U+314A | U+110E | U+11BE |
| z | ㅋ | U+314B | U+110F | U+11BF |
| x | ㅌ | U+314C | U+1110 | U+11C0 |
| v | ㅍ | U+314D | U+1111 | U+11C1 |
| g | ㅎ | U+314E | U+1112 | U+11C2 |
참고: ㄸ, ㅃ, ㅉ은 초성으로만 사용되고 종성으로는 사용되지 않는다.
2.3 2벌식 키 → 유니코드 모음 매핑
| 영문 키 | 한글 | Compatibility Jamo | Jamo (중성) |
|---|---|---|---|
| k | ㅏ | U+314F | U+1161 |
| o | ㅐ | U+3150 | U+1162 |
| i | ㅑ | U+3151 | U+1163 |
| O (Shift+o) | ㅒ | U+3152 | U+1164 |
| j | ㅓ | U+3153 | U+1165 |
| p | ㅔ | U+3154 | U+1166 |
| u | ㅕ | U+3155 | U+1167 |
| P (Shift+p) | ㅖ | U+3156 | U+1168 |
| h | ㅗ | U+3157 | U+1169 |
| hk | ㅘ | U+3158 | U+116A |
| ho | ㅙ | U+3159 | U+116B |
| hl | ㅚ | U+315A | U+116C |
| y | ㅛ | U+315B | U+116D |
| n | ㅜ | U+315C | U+116E |
| nj | ㅝ | U+315D | U+116F |
| np | ㅞ | U+315E | U+1170 |
| nl | ㅟ | U+315F | U+1171 |
| b | ㅠ | U+3160 | U+1172 |
| m | ㅡ | U+3161 | U+1173 |
| ml | ㅢ | U+3162 | U+1174 |
| l | ㅣ | U+3163 | U+1175 |
겹모음 입력: ㅘ, ㅙ, ㅚ, ㅝ, ㅞ, ㅟ, ㅢ는 두 키 시퀀스로 입력한다. 예: h(ㅗ) + k(ㅏ) → ㅘ
3. 키 → 자모 매핑 (2벌식 공통 구조)
3.1 자음 벌 (초성/종성 공용 키)
왼손 영역에 자음을 배치한다. 키 하나가 초성으로 쓰일 때와 종성으로 쓰일 때 같은 인덱스가 아닐 수 있다(겹받침: 종성 ㄳ, ㄵ 등은 초성 19개와 1:1이 아님). 아래는 초성 인덱스(L) 기준 매핑 예이다.
| 영문 키 | 기본 자음 | Shift+키(쌍자음) | 초성 L |
|---|---|---|---|
| r | ㄱ | ㄲ | 0, 1 |
| R | ㄲ | — | 1 |
| s | ㄴ | — | 2 |
| e | ㄷ | ㄸ | 3, 4 |
| f | ㄹ | — | 5 |
| a | ㅁ | — | 6 |
| q | ㅂ | ㅃ | 7, 8 |
| t | ㅅ | ㅆ | 9, 10 |
| d | ㅇ | — | 11 |
| w | ㅈ | ㅉ | 12, 13 |
| c | ㅊ | — | 14 |
| z | ㅋ | — | 15 |
| x | ㅌ | — | 16 |
| v | ㅍ | — | 17 |
| g | ㅎ | — | 18 |
종성(T) 은 같은 자음 키를 쓰되, 받침으로 유효한 종성만 허용한다. 종성 28가지(0=없음, 1~27) 중 일부는 겹받침(ㄳ, ㄵ, ㄶ, ㄺ, ㄻ, ㄼ, ㄽ, ㄾ, ㄿ, ㅀ, ㅄ 등)으로, 두 키 시퀀스 또는 종성 전용 조합으로 입력한다. 한글 조합 규칙(겹모음·겹받침) 참고.
3.2 모음 벌 (중성)
오른손 영역에 모음을 배치한다. 단모음은 키 하나, 겹모음은 두 모음 키 연속 입력으로 조합한다.
| 영문 키 | 기본 모음 | Shift 등 | 중성 V |
|---|---|---|---|
| k | ㅏ | ㅐ | 0, 1 |
| i | ㅑ | ㅒ | 2, 3 |
| j | ㅓ | ㅔ | 4, 5 |
| u | ㅕ | ㅖ | 6, 7 |
| h | ㅗ | — | 8 |
| y | ㅛ | — | 12 |
| n | ㅜ | — | 13 |
| b | ㅠ | — | 17 |
| m | ㅡ | — | 18 |
| l | ㅣ | — | 20 |
겹모음: ㅗ+ㅏ→ㅘ(V=9), ㅗ+ㅐ→ㅙ(10), ㅗ+ㅣ→ㅚ(11), ㅜ+ㅓ→ㅝ(14), ㅜ+ㅔ→ㅞ(15), ㅜ+ㅣ→ㅟ(16), ㅡ+ㅣ→ㅢ(19). 한글 조합 규칙에 시퀀스→V 인덱스 표가 있다.
4. 상태 의존 해석 (같은 키, 다른 역할)
2벌식에서는 현재 상태에 따라 같은 자음 키가 초성 또는 종성으로 해석된다.
| 현재 상태 | 자음 키 입력 | 해석 |
|---|---|---|
| 초성만 (L만 있음) | 같은 키 | 쌍자음(ㄱ→ㄲ) 또는 새 초성(구현에 따라) |
| 초성만 | 다른 키 | 새 초성으로 교체 또는 commit 후 새 초성 |
| 초성+중성 (L,V) | 자음 키 | 종성 후보. 받침으로 유효하면 T 설정 → (L,V,T). 유효하지 않으면 commit 후 새 초성. |
| 초성+중성+종성 (L,V,T) | 자음 키 | 겹받침 시도 또는 commit 후 새 초성 |
모음 키는 “초성만”일 때는 중성 추가(→ L,V), “초성+중성” 또는 “초성+중성+종성”일 때는 겹모음 시도 또는 commit + 새 (L,V) 시작(종성→다음 초성 변환). 한글 입력기 구현의 전이 규칙과 동일하다.
5. 쌍자음 입력 규칙
- Shift+자음 키: 해당 쌍자음(ㄲ, ㄸ, ㅃ, ㅆ, ㅉ). L 인덱스 1, 4, 8, 10, 13.
- 같은 키 두 번: 일부 IME는 “ㄱ” 두 번 → “ㄲ”으로 처리한다. 구현 정책에 따름.
6. 겹모음 입력 규칙 (요약)
첫 모음 ㅗ(8), ㅜ(13), ㅡ(18) 뒤에 두 번째 모음을 넣으면 겹모음으로 인식한다.
- ㅗ + ㅏ → ㅘ(9), ㅗ + ㅐ → ㅙ(10), ㅗ + ㅣ → ㅚ(11)
- ㅜ + ㅓ → ㅝ(14), ㅜ + ㅔ → ㅞ(15), ㅜ + ㅣ → ㅟ(16)
- ㅡ + ㅣ → ㅢ(19)
“초성+중성” 상태에서 첫 모음이 ㅗ/ㅜ/ㅡ가 아닌데 또 모음 키가 오면, 현재 음절 commit + 새 (L,V) 로 처리한다(새 L은 종성→초성 변환).
7. 종성 → 다음 글자 초성 변환
“초성+중성+종성” 상태에서 모음을 입력하면, 현재 음절을 commit한 뒤 다음 음절을 시작한다. 이때 종성 T를 다음 음절의 초성 L으로 바꿔야 한다.
- 단받침: T=1(ㄱ) → 다음 L=0(ㄱ), T=5(ㄹ) → 다음 L=5(ㄹ). 대부분 T와 같은 키의 초성이 다음 L이 된다.
- 겹받침: T=3(ㄳ) → 다음 L=9(ㅅ) 등, 종성 한 글자가 다음 초성 한 글자로만 대응되지 않고, 첫째/둘째 자음 규칙이 있다. 한글 조합 규칙에 종성→초성 변환표를 둔다.
8. 완성형 계산 (동일)
S = 0xAC00 + (L × 588) + (V × 28) + T
L, V, T는 한글 조합 원리의 인덱스와 동일하다. 2벌식은 키→(L,V,T) 변환 방식만 다르고, 완성형 공식은 3벌식과 같다.
9. 알고리즘 요약 (의사코드)
- keyToChoseong(key, shift) → L (0~18). 자음 벌 키 + Shift → 초성 인덱스.
- keyToJungseong(key, shift) → V (0~20). 모음 벌 키 + Shift 또는 이전 V + 현재 키 → 겹모음 V.
- keyToJongseong(key) → T (1~27). 자음 벌 키를 종성으로 해석할 때만 사용. 받침 불가 조합이면 사용하지 않고 commit 후 초성으로 처리.
- jongseongToChoseong(T) → 다음 음절의 L. 종성→초성 변환표 사용.