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 JamoU+1100–U+11FF조합용 자모 (초성·중성·종성 구분)ᄀ(U+1100), ᅡ(U+1161), ᆨ(U+11A8)
Hangul Compatibility JamoU+3130–U+318F호환용 자모 (독립 표기)ㄱ(U+3131), ㅏ(U+314F)
Hangul SyllablesU+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 JamoJamo (초성)Jamo (종성)
rU+3131U+1100U+11A8
R (Shift+r)U+3132U+1101U+11A9
sU+3134U+1102U+11AB
eU+3137U+1103U+11AE
E (Shift+e)U+3138U+1104— (종성 없음)
fU+3139U+1105U+11AF
aU+3141U+1106U+11B7
qU+3142U+1107U+11B8
Q (Shift+q)U+3143U+1108— (종성 없음)
tU+3145U+1109U+11BA
T (Shift+t)U+3146U+110AU+11BB
dU+3147U+110BU+11BC
wU+3148U+110CU+11BD
W (Shift+w)U+3149U+110D— (종성 없음)
cU+314AU+110EU+11BE
zU+314BU+110FU+11BF
xU+314CU+1110U+11C0
vU+314DU+1111U+11C1
gU+314EU+1112U+11C2

참고: ㄸ, ㅃ, ㅉ은 초성으로만 사용되고 종성으로는 사용되지 않는다.

2.3 2벌식 키 → 유니코드 모음 매핑

영문 키한글Compatibility JamoJamo (중성)
kU+314FU+1161
oU+3150U+1162
iU+3151U+1163
O (Shift+o)U+3152U+1164
jU+3153U+1165
pU+3154U+1166
uU+3155U+1167
P (Shift+p)U+3156U+1168
hU+3157U+1169
hkU+3158U+116A
hoU+3159U+116B
hlU+315AU+116C
yU+315BU+116D
nU+315CU+116E
njU+315DU+116F
npU+315EU+1170
nlU+315FU+1171
bU+3160U+1172
mU+3161U+1173
mlU+3162U+1174
lU+3163U+1175

겹모음 입력: ㅘ, ㅙ, ㅚ, ㅝ, ㅞ, ㅟ, ㅢ는 두 키 시퀀스로 입력한다. 예: h(ㅗ) + k(ㅏ) → ㅘ


3. 키 → 자모 매핑 (2벌식 공통 구조)

3.1 자음 벌 (초성/종성 공용 키)

왼손 영역에 자음을 배치한다. 키 하나초성으로 쓰일 때와 종성으로 쓰일 때 같은 인덱스가 아닐 수 있다(겹받침: 종성 ㄳ, ㄵ 등은 초성 19개와 1:1이 아님). 아래는 초성 인덱스(L) 기준 매핑 예이다.

영문 키기본 자음Shift+키(쌍자음)초성 L
r0, 1
R1
s2
e3, 4
f5
a6
q7, 8
t9, 10
d11
w12, 13
c14
z15
x16
v17
g18

종성(T) 은 같은 자음 키를 쓰되, 받침으로 유효한 종성만 허용한다. 종성 28가지(0=없음, 1~27) 중 일부는 겹받침(ㄳ, ㄵ, ㄶ, ㄺ, ㄻ, ㄼ, ㄽ, ㄾ, ㄿ, ㅀ, ㅄ 등)으로, 두 키 시퀀스 또는 종성 전용 조합으로 입력한다. 한글 조합 규칙(겹모음·겹받침) 참고.

3.2 모음 벌 (중성)

오른손 영역에 모음을 배치한다. 단모음은 키 하나, 겹모음두 모음 키 연속 입력으로 조합한다.

영문 키기본 모음Shift 등중성 V
k0, 1
i2, 3
j4, 5
u6, 7
h8
y12
n13
b17
m18
l20

겹모음: ㅗ+ㅏ→ㅘ(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. 종성→초성 변환표 사용.

상태 전이·commit 조건은 한글 입력기 구현한글 조합 원리를 참고한다.