한글의 초성·중성·종성

Hangul jamo composition

한글 음절 하나는 초성(첫자음)·중성(모음)·종성(받침, 선택)이 정해진 규칙으로 합쳐진 결과물입니다. 유니코드도 이 규칙을 그대로 산술식으로 담고 있습니다.

다른 이름: 자모 조합Hangul syllable block초중종성
···
html
<div class="stage">
  <div class="jamo-row">
    <span class="jamo" id="j1">ㅎ</span>
    <span class="jamo" id="j2">ㅏ</span>
    <span class="jamo" id="j3">ㄴ</span>
  </div>
  <div class="syllable" id="syl">한</div>
  <div class="formula" id="formula">0xAC00 + (18×21+0)×28+4 = 한</div>
</div>
css
.stage{display:grid;gap:10px;justify-items:center}
.jamo-row{display:flex;gap:10px;height:9vmin;align-items:center}
.jamo{font:700 6vmin/1 -apple-system,system-ui,"Apple SD Gothic Neo",sans-serif;color:var(--accent-2);transition:opacity .5s ease, transform .5s ease}
.jamo.merged{opacity:0;transform:translateY(14px) scale(.5)}
.syllable{font:800 15vmin/1 -apple-system,system-ui,"Apple SD Gothic Neo",sans-serif;color:var(--fg);opacity:0;transform:scale(.6);transition:opacity .5s ease, transform .5s ease}
.syllable.show{opacity:1;transform:scale(1)}
.formula{font:10px ui-monospace,Menlo,monospace;color:var(--muted);text-align:center;min-height:14px}
js
const CHO = ['ㄱ','ㄲ','ㄴ','ㄷ','ㄸ','ㄹ','ㅁ','ㅂ','ㅃ','ㅅ','ㅆ','ㅇ','ㅈ','ㅉ','ㅊ','ㅋ','ㅌ','ㅍ','ㅎ'];
const JUNG = ['ㅏ','ㅐ','ㅑ','ㅒ','ㅓ','ㅔ','ㅕ','ㅖ','ㅗ','ㅘ','ㅙ','ㅚ','ㅛ','ㅜ','ㅝ','ㅞ','ㅟ','ㅠ','ㅡ','ㅢ','ㅣ'];
const JONG = ['','ㄱ','ㄲ','ㄳ','ㄴ','ㄵ','ㄶ','ㄷ','ㄹ','ㄺ','ㄻ','ㄼ','ㄽ','ㄾ','ㄿ','ㅀ','ㅁ','ㅂ','ㅄ','ㅅ','ㅆ','ㅇ','ㅈ','ㅊ','ㅋ','ㅌ','ㅍ','ㅎ'];
const words = [
  { cho: 'ㅎ', jung: 'ㅏ', jong: 'ㄴ' },
  { cho: 'ㄱ', jung: 'ㅡ', jong: '' },
  { cho: 'ㅅ', jung: 'ㅐ', jong: 'ㄱ' },
];
function compose(w){
  const ci = CHO.indexOf(w.cho), vi = JUNG.indexOf(w.jung), fi = Math.max(JONG.indexOf(w.jong), 0);
  const code = 0xAC00 + (ci * 21 + vi) * 28 + fi;
  return { char: String.fromCharCode(code), code, ci, vi, fi };
}
const j1 = document.getElementById('j1');
const j2 = document.getElementById('j2');
const j3 = document.getElementById('j3');
const syl = document.getElementById('syl');
const formula = document.getElementById('formula');
let i = 0;
function step(){
  const w = words[i % words.length];
  const r = compose(w);
  j1.textContent = w.cho; j2.textContent = w.jung; j3.textContent = w.jong || '·';
  j1.classList.remove('merged'); j2.classList.remove('merged'); j3.classList.remove('merged');
  syl.classList.remove('show');
  syl.textContent = r.char;
  formula.textContent = '0xAC00 + (' + r.ci + '×21+' + r.vi + ')×28+' + r.fi + ' = ' + r.char;
  setTimeout(function(){
    j1.classList.add('merged'); j2.classList.add('merged'); j3.classList.add('merged');
    syl.classList.add('show');
  }, 700);
  i++;
}
step();
setInterval(step, 2400);

세종대왕이 창제한 훈민정음은 자음과 모음을 각각 독립된 낱자로 만들고, 이를 초성(첫소리)·중성(가운뎃소리)·종성(끝소리, 받침)으로 묶어 한 음절 크기의 네모난 블록으로 조합하도록 설계했습니다. 알파벳처럼 낱자를 옆으로 죽 늘어놓는 대신, 한 음절 안에서 위아래·좌우로 쌓아 하나의 글자처럼 보이게 만드는 게 한글만의 구조입니다.

이 조합 규칙은 완성형 유니코드(U+AC00~U+D7A3, 11,172자)에도 그대로 들어 있습니다. 초성 19개(ㄱ~ㅎ), 중성 21개(ㅏ~ㅣ), 종성 28개(받침 없음 포함)의 조합 인덱스를 알면 `0xAC00 + (초성인덱스 × 21 + 중성인덱스) × 28 + 종성인덱스` 공식으로 정확한 코드포인트를 계산할 수 있습니다. 반대로 어떤 음절이든 이 공식을 거꾸로 풀면 세 자모로 분해됩니다.

이 산술 구조 덕분에 한글은 자모 단위 검색(초성 검색 "ㄱㅅㅎ" → "감사합니다"), 두벌식/세벌식 입력기, 자모 분해 애니메이션 같은 프로그래밍적 처리가 다른 문자 체계보다 수월합니다. 데모는 "한"을 초성 ㅎ·중성 ㅏ·종성 ㄴ으로 분해했다가 공식으로 다시 조합하는 과정을 실제로 계산해서 보여줍니다.

언제 쓰나

한글 자모 검색, 입력기 로직, 폰트 렌더링 디버깅처럼 음절을 프로그래밍적으로 다뤄야 할 때 이 공식을 직접 씁니다.