한글 자모 분리·결합기

"안녕"을 "ㅇㅏㄴㄴㅕㅇ"으로 분리하거나, 자모를 다시 완성된 한글로 합쳐보세요.

한글 한 글자는 계산으로 만들어집니다

유니코드의 한글 음절 영역은 U+AC00('가')부터 U+D7A3('힣')까지 연속해서 11,172자가 놓여 있습니다. 이 숫자는 우연이 아니라 초성 19개 × 중성 21개 × 종성 28가지(받침 없음 포함)를 곱한 값입니다. 그래서 어떤 음절의 코드에서 U+AC00를 뺀 값을 s라 하면 초성 번호는 s ÷ 588의 몫, 중성 번호는 (s ÷ 28)을 21로 나눈 나머지, 종성 번호는 s를 28로 나눈 나머지가 됩니다(588 = 21 × 28). 이 도구의 분리 기능은 이 식을 그대로 구현한 것이고, 사전이나 형태소 분석은 쓰지 않습니다. 결합은 그 역연산으로, 코드 = U+AC00 + (초성 × 21 + 중성) × 28 + 종성 입니다.

영역코드 범위개수설명
완성형 음절U+AC00~U+D7A311172가~힣. 19 × 21 × 28 조합
조합용 초성 (Conjoining Jamo)U+1100~U+111219NFD로 풀릴 때 쓰이는 초성
조합용 중성U+1161~U+117521NFD로 풀릴 때 쓰이는 중성
조합용 종성U+11A8~U+11C227받침 27종 (받침 없음은 코드 없음)
호환 자모 (자음+모음)U+3131~U+316351ㄱ~ㅎ 30자 + ㅏ~ㅣ 21자. 키보드로 치는 낱자

검산된 분리 예시

글자코드s = 코드 - U+AC00(초×21+중)×28+종분리 결과NFD 코드 열
가U+AC000(0×21+0)×28+0ㄱ + ㅏ (받침 없음)U+1100 U+1161
한U+D55C10588(18×21+0)×28+4ㅎ + ㅏ + ㄴU+1112 U+1161 U+11AB
닭U+B2ED1773(3×21+0)×28+9ㄷ + ㅏ + ㄺU+1103 U+1161 U+11B0
값U+AC1218(0×21+0)×28+18ㄱ + ㅏ + ㅄU+1100 U+1161 U+11B9
읊U+C74A6986(11×21+18)×28+14ㅇ + ㅡ + ㄿU+110B U+1173 U+11B5
까U+AE4C588(1×21+0)×28+0ㄲ + ㅏ (받침 없음)U+1101 U+1161
의U+C7587000(11×21+19)×28+0ㅇ + ㅢ (받침 없음)U+110B U+1174
힣U+D7A311171(18×21+20)×28+27ㅎ + ㅣ + ㅎU+1112 U+1175 U+11C2

표의 값은 페이지를 만드는 시점에 코드로 직접 계산해 넣은 것입니다. '닭'은 받침 ㄺ이 겹받침이지만 유니코드에서는 종성 한 칸(번호 9)을 차지하므로 분리하면 ㄷ·ㅏ·ㄺ의 세 자모가 됩니다. 이 도구는 이 ㄺ을 ㄹ+ㄱ 두 자로 쪼개지 않고 한 글자로 그대로 보여 줍니다. 반면 사람이 키보드로 입력하는 순서는 ㄷ ㅏ ㄹ ㄱ으로 네 번이라, 분리 결과를 타자 기준으로 세고 싶다면 겹받침 개수를 따로 더해야 합니다. 겹받침은 11종(ㄳ ㄵ ㄶ ㄺ ㄻ ㄼ ㄽ ㄾ ㄿ ㅀ ㅄ), 겹모음은 ㅘ ㅙ ㅚ ㅝ ㅞ ㅟ ㅢ의 7종입니다.

완성형(NFC)과 조합형(NFD), 그리고 두 종류의 자모

같은 '한'이라도 저장 방식은 두 가지입니다. 완성형(NFC)은 U+D55C 하나로, 조합형(NFD)은 U+1112 U+1161 U+11AB세 코드로 저장합니다. 화면에는 똑같이 보이지만 문자열 길이는 1과 3으로 다르고, UTF-8 바이트 수도 3과 9로 다릅니다. macOS 파일 이름이 이 조합형으로 풀려 보이는 사례는 한글 자소분리 복구기에서 다룹니다.

더 헷갈리는 점은 자모 자체도 두 벌이라는 것입니다. 키보드로 치는 'ㄱ'은 호환 자모(U+3131)이고, 조합형 한글 속의 'ᄀ'은 초성 전용 조합용 자모(U+1100)입니다. 같은 자음이 쓰임에 따라 초성·종성 코드가 따로 있습니다.

자모호환 자모조합용 초성조합용 중성조합용 종성
ㄱU+3131U+1100-U+11A8
ㄴU+3134U+1102-U+11AB
ㅎU+314EU+1112-U+11C2
ㅏU+314F-U+1161-
ㅣU+3163-U+1175-

이 도구의 출력은 모두 호환 자모입니다. 그래서 눈으로 읽고 검색어나 초성 목록으로 쓰기에 적합하지만, 조합용 자모와는 코드가 다릅니다. 이 차이가 실무에서 문제가 되는 대표 사례가 있습니다. 호환 자모 낱자를 브라우저 내장 정규화로 합쳐 보려 하면 기대와 다르게 동작합니다. 직접 실행해 보면 'ㅎㅏㄴ'.normalize('NFKC')의 결과는 '하ᄂ'(코드 U+D558 U+1102)로, 'ㅎㅏ'만 '하'로 합쳐지고 마지막 ㄴ은 받침이 아니라 초성 전용 코드로 바뀌어 남습니다. 호환 자모에는 초성과 종성의 구분이 없어 정규화가 마지막 자음의 역할을 알 수 없기 때문입니다. 그래서 이 도구의 결합 기능은 정규화에 의존하지 않고 자음·모음의 순서를 읽어 초성, 중성, 종성을 직접 배정합니다. 반대로 조합용 자모 3개(U+1112 U+1161 U+11AB)는 NFC만으로 '한'이 됩니다.

결합 규칙과 모호한 입력

결합은 앞에서부터 읽으며 "자음 + 모음 (+ 자음)" 덩어리를 만듭니다. 모음 앞에 있는 자음은 초성이고, 모음 뒤 자음은 받침 후보입니다. 받침 뒤에 모음이 이어지면 받침이 다음 글자의 초성으로 넘어갑니다. 검산해 보면 'ㅇㅏㄴㄴㅕㅇ'은 '안녕', 'ㄷㅏㄹㄱㅇㅣ'은 '닭이', 'ㄷㅏㄹㄱㅣ'는 '달기'로 결합합니다. 마지막 두 예시가 입력 몇 글자 차이로 의미가 달라지는 모습입니다. 'ㄱㅏㄱㅏ'는 '가가'로 읽히며 '각'+'ㅏ'로는 읽히지 않는데, 낱자 나열만으로는 모든 경우를 구별할 수 없기 때문에 규칙은 "가능하면 다음 글자의 초성으로 넘긴다"로 정해져 있습니다. 겹모음(ㅗ+ㅏ → ㅘ)과 겹받침(ㄹ+ㄱ → ㄺ)도 자동으로 합쳐지고, 'ㄸ·ㅃ·ㅉ'처럼 받침이 될 수 없는 자음은 새 글자의 초성이 됩니다.

받침 종류별로 본 11,172자의 분포

종성은 받침 없음 1가지, 홑받침 16가지, 겹받침 11가지로 모두 28가지입니다. 종성 한 값마다 초성 19개 × 중성 21개 = 399자가 대응하므로, 아래 표처럼 각 묶음의 음절 수는 종성 가짓수에 399을 곱한 값입니다. 세 묶음을 더하면 11,172자로 전체 음절 수와 정확히 맞습니다. 받침이 있는 글자가 받침 없는 글자보다 훨씬 많다는 것을 구조에서 바로 확인할 수 있고, 이 비율은 실제 문장에서 자주 쓰이는 글자의 비율과는 무관합니다(조합 가능한 전체 칸의 비율일 뿐입니다).

종성 묶음별 음절 수 (종성 1가지당 399자)
종성 묶음종성 가짓수음절 수
받침 없음1399
홑받침166,384
겹받침114,389
합계2811,172

단어별 글자 수, 자모 수, 키 입력 수 비교

같은 단어도 무엇을 세느냐에 따라 숫자가 달라집니다. 글자 수는 음절 개수, 자모 수는 이 도구가 분리해서 보여 주는 개수(겹받침·겹모음 속 낱자를 쪼개지 않고 유니코드 단위 그대로 센 값), 키 입력 수는 두벌식 자판에서 겹받침과 겹모음을 낱자 두 번으로 치는 경우를 반영한 값입니다. 쌍자음(ㄲ, ㅆ 등)은 Shift와 함께 한 번에 치므로 한 번으로 셌습니다. 모든 값은 빌드 시 위의 분해 식으로 계산했고, 마지막 열은 각 글자의 초성만 이어 붙인 것입니다.

단어별 글자·자모·키 입력 수와 초성열
단어글자 수자모 수(도구 기준)키 입력 수(두벌식)초성열
대한민국41111ㄷㅎㅁㄱ
읽었다389ㅇㅇㄷ
괜찮아3810ㄱㅊㅇ
밝다256ㅂㄷ
웬일267ㅇㅇ
뷁135ㅂ

'뷁'은 글자 수가 1인데 자모는 3(ㅂ, ㅞ, ㄺ), 키 입력은 5번(ㅂ ㅜ ㅔ ㄹ ㄱ)입니다. 반대로 '대한민국'은 글자 4개가 자모 11개로 풀리는데, 받침 있는 글자가 3개(한, 민, 국)이고 받침 없는 글자가 1개(대)이기 때문입니다. 타자 연습 결과나 입력 속도를 비교할 때 "글자 수"와 "키 입력 수"를 구별하지 않으면 겹받침이 많은 글에서 오차가 커집니다.

쓰임별 활용 시나리오

초성 검색 색인을 만드는 개발자. 상품명 '대한민국'의 초성열은 ㄷㅎㅁㄱ입니다. 사용자가 ㄷㅎㅁㄱ까지만 쳐도 찾게 하려면 상품명에서 초성만 모은 문자열을 따로 저장하면 됩니다. 이 도구로 샘플 몇 개를 분리해 보고, 쌍자음 초성 (ㄲ, ㄸ, ㅃ, ㅆ, ㅉ)을 같은 홑자음으로 묶을지(예: '꽃'을 ㄲ으로 둘지 ㄱ으로 둘지) 서비스 정책을 먼저 정하세요. 도구는 있는 그대로 ㄲ으로 보여 줍니다.

맞춤법 수업 자료를 만드는 교사. '읽었다'를 분리하면 ㅇㅣㄺㅇㅓㅆㄷㅏ로, 받침 ㄺ과 ㅆ이 어디에 붙는지 눈으로 확인할 수 있습니다. 분리 결과를 음절 단위로 묶는 옵션을 쓰면 글자별 구성(ㅇㅣㄺ · ㅇㅓㅆ · ㄷㅏ)이 한눈에 보여 받침 학습 자료로 쓰기 좋습니다. 단, 발음 규칙(연음, 비음화 등)은 이 도구가 다루지 않으므로 철자 기준 설명에만 쓰세요.

문자열 길이 제한을 점검하는 기획자. 입력창 글자 수 제한이 '자바스크립트 문자열 길이'로 구현되어 있다면 완성형 '한'은 1, 조합형(NFD) '한'은 3으로 계산됩니다. 같은 이름이 입력 경로에 따라 제한에 걸렸다 안 걸렸다 하면 정규화 여부를 의심해 볼 만합니다. 이 도구의 분리 기능은 입력을 먼저 NFC로 맞춘 뒤 계산하므로 두 경우 결과가 같습니다.

직접 검산하는 방법

어떤 글자든 브라우저 콘솔에서 'c'.codePointAt(0) - 0xAC00 으로 s를 구하고, Math.floor(s / 588)로 초성 번호, Math.floor((s % 588) / 28)로 중성 번호, s % 28로 종성 번호를 얻은 뒤 위 표의 배열 순서에 대입하면 됩니다. 초성 순서는 ㄱ ㄲ ㄴ ㄷ ㄸ ㄹ ㅁ ㅂ ㅃ ㅅ ㅆ ㅇ ㅈ ㅉ ㅊ ㅋ ㅌ ㅍ ㅎ의 19개이며, 위 도구 코드의 배열과 같은 순서입니다. 종성 번호 0은 받침 없음이라는 점을 잊지 마세요. 역으로 글자를 만들려면 String.fromCharCode(0xAC00 + (초성 × 21 + 중성) × 28 + 종성)에 넣으면 됩니다. 예를 들어 '한'은 ㅎ(18), ㅏ(0), ㄴ(4)이므로 (18 × 21 + 0) × 28 + 4 = 10,588이고, 0xAC00은 십진수 44,032이므로 코드는 54,620, 곧 U+D55C입니다.

흔한 실수와 한계

결과 활용법

검색 자동완성이나 초성 검색을 만들 때는 분리 결과를 색인으로 쓸 수 있습니다. 다만 '값'을 ㄱㅏㅄ으로 저장했다면 사용자가 ㄱㅏㅂㅅ으로 입력하는 경우도 같은 글자로 맞춰 줘야 하므로, 이 도구의 결합 결과로 두 입력이 같은지 확인해 보세요. 초성만 필요하다면 초성 변환기를, 영문 자판으로 잘못 친 한글은 한영 오타 변환기를 이용하세요. 글자 단위 차이를 비교하려면 텍스트 비교 도구가 도움이 됩니다.

자주 묻는 질문

겹받침(닭, 값 등)도 정확히 분리되나요?

네. '닭'은 초성 ㄷ, 중성 ㅏ, 종성 ㄺ(겹받침 하나의 단위)으로 분리됩니다. 결합할 때는 겹받침을 이루는 두 자음(ㄹ, ㄱ)을 연달아 입력하면 하나의 종성으로 합쳐지며, 바로 뒤에 모음이 오면 받침의 두 번째 자음이 다음 글자의 초성이 됩니다(예: ㄷㅏㄹㄱㅣ → 달기).

이미 분리된 자모에 한글이 아닌 문자가 섞여 있으면 어떻게 되나요?

자음이나 모음으로 인식되지 않는 문자(숫자, 영문, 공백, 특수문자 등)는 결합하지 않고 입력한 위치에 그대로 남깁니다.

분리 결과를 그대로 검색어로 써도 되나요?

이 도구의 분리 결과는 호환 자모라서 일반 키보드로 친 ㅎㅏㄴ과 같은 코드입니다. 다만 조합형(NFD) 저장 문서 안에는 조합용 자모가 들어 있어 코드가 다르므로, 검색 대상 문서가 어느 쪽인지 먼저 확인해야 합니다.

쌍자음 ㄲ, ㅆ은 ㄱ+ㄱ, ㅅ+ㅅ으로 나뉘나요?

아닙니다. ㄲ·ㄸ·ㅃ·ㅆ·ㅉ은 유니코드에서 독립된 초성(또는 ㄲ·ㅆ은 종성)이므로 한 자로 분리됩니다. '꽃'은 ㄲ+ㅗ+ㅊ 세 자이고, 키보드로는 Shift를 눌러 한 번에 칩니다.

'ㄱㅅ'처럼 모음 없이 자음만 넣으면 어떻게 되나요?

결합할 모음이 없으므로 음절이 만들어지지 않고 자음이 그대로 남습니다. 결과 아래에 결합된 음절이 없다는 안내가 나옵니다.

이모지나 한자가 섞인 문장도 분리할 수 있나요?

완성형 한글 음절만 자모로 분리하고, 이모지·한자·영문·숫자·공백은 위치와 내용을 그대로 둡니다. 다만 '공백으로 구분' 옵션에서는 문자 사이에 공백이 들어가며, 연속된 공백은 하나로 합쳐집니다.

분리했다가 다시 합치면 항상 원문과 같아지나요?

대부분 같지만 보장되지는 않습니다. 낱자 나열은 모호할 수 있어서, 예를 들어 받침 뒤에 모음이 오는 연음 위치는 규칙상 다음 글자 초성으로 넘어갑니다. 또한 분리 단계에서 겹받침이 한 자로 유지되므로 결합 때 같은 겹받침으로 돌아오는지 직접 확인해 보세요.

입력한 글이 서버로 전송되나요?

변환 스크립트는 입력창의 문자열을 브라우저 안에서만 계산하며, 외부로 전송하는 코드가 없습니다.

글자 수와 자모 수는 어떻게 다르게 세나요?

'한글'은 2글자이지만 분리하면 ㅎㅏㄴㄱㅡㄹ의 6자입니다. 변환 후 결과 아래에 음절 수와 자모 수를 함께 표시해 줍니다. 겹받침은 한 자로 셉니다.