히라가나와 가타카나 46자를 익히면 다음 벽이 나옵니다. が, ぱ, きゃ, っ, ー, ファ… 처음 46자와 비슷하게 생겼는데 소리가 다른 글자들입니다. 가나 공방은 이것을 위한 세 번째 코스인 확장 가나를 2026년 9월 7일에 추가했습니다. 모두 149개 표기, 42개 행입니다.
이 코스의 데이터는 원글자, 조립식, 규칙을 한 묶음으로 만듭니다. 화면도 그 묶음을 읽어 학습 단계를 구성합니다.
기초 46자와는 학습이 다르다
기초 코스는 글자 모양과 연상 그림, 소리를 묶어 보여 줍니다. 확장 코스는 이미 배운 글자에 무엇을 더하거나 바꾸는지 보여 줍니다.
- が는 새로운 글자가 아니라 か에 점 두 개를 찍은 것입니다.
- きゃ는 き 옆에 작은 ゃ를 붙인 한 박자짜리 소리입니다.
- ファ는 フ에 작은 ァ를 붙여 외래어 소리를 낸 것입니다.
커밋 eed907c의 제목은 “teach extended kana as derivation rules”입니다. 해당 변경에서는 연상 중심의 연습을 원글자 비교 → 쓰기 → 규칙만 보고 쓰기 → 단어 듣고 쓰기 단계로 바꿨습니다. 이는 코드 변경의 설명이며, 실제 학습 효과를 측정한 결과는 아닙니다.
일곱 가지 규칙
확장 표기를 일곱 종류(KanaDerivationKind)로 나누고, 종류마다 한 줄 규칙을 답니다.
| 종류 | 규칙(화면에 보이는 문장) | 조립식 예 |
|---|---|---|
| 탁음 | 원글자에 탁점(゛)을 찍으면 울림소리로 바뀝니다 | か + ゛ → が |
| 반탁음 | は/ハ행에 반탁점(゜)을 찍으면 p 소리가 됩니다 | は + ゜ → ぱ |
| 요음 | i단 글자 + 작은 ゃゅょ를 한 박으로 읽습니다 | き + ゃ → きゃ |
| 촉음 | 작은 っ/ッ는 다음 자음을 한 박 멈추게 합니다 | つ를 작게 → っ |
| 발음(ん) | ん/ン은 음절 끝의 비음입니다. 단어 속에서 익히세요 | 음절 끝 ん |
| 장음 | ー는 바로 앞 모음을 한 박 늘립니다 | 앞 모음 + ー |
| 외래어 | 기본 가타카나에 작은 모음을 붙여 외래어 소리를 만듭니다 | フ + ァ → ファ |
조립식을 데이터에서 계산한다
글자마다 “か + ゛ → が” 같은 조립식을 손으로 적지 않았습니다. 글자 데이터에는 가나, 로마자, 한글 발음, 예시 단어 정도만 적고, 원글자와 조립식은 코드가 만들어 냅니다.
function glyph(spec: CharSpec, kind: KanaDerivationKind): KanaCharacter {
const [kana, romaji, korean, exampleWord, exampleMeaning, pairKana] = spec;
const bases = basesOf(kana, kind); // 원글자를 계산
return {
kana, romaji, korean, exampleWord, exampleMeaning, pairKana,
mnemonicPresentation: "glyph", // 연상 그림 대신 글자 그대로
derivation: { kind, bases, formula: formulaOf(kind, bases, kana), rule: RULES[kind] },
};
}
원글자 계산은 표기의 종류에 따라 다릅니다. 탁음과 반탁음은 유니코드 정규화로 풉니다. が를 NFD(분해형)로 바꾸면 か + 결합 탁점(U+3099)이 되므로, 결합 기호를 지우고 다시 합치면 원글자가 나옵니다.
if (kind === "dakuten" || kind === "handakuten") {
const stripped = kana.normalize("NFD").replace(/゙|゚/g, "").normalize("NFC");
return [stripped || kana]; // が → か, ぱ → は
}
요음과 외래어는 두 글자로 이루어진 문자열을 그대로 쪼갭니다(きゃ → ["き", "ゃ"]). ヴ처럼 한 글자로 된 것만 예외로 ウ에서 온다고 적어 두었습니다. 촉음은 つ(가타카나는 ツ)에서 옵니다.
조립식은 한 함수에서 생성하므로 글자마다 같은 문장을 따로 적지 않아도 됩니다. 화면은 derivation 필드를 읽습니다. 원본 단어나 분류가 잘못 들어가면 자동 생성된 정보도 잘못될 수 있으므로, 생성 규칙 검사와 어휘 검토는 따로 필요합니다.
학습 단계도 규칙에 맞춘다
기초 코스와 확장 코스는 4단계라는 틀은 같지만 내용이 다릅니다.
| 단계 | 기초 46자 | 확장 가나 |
|---|---|---|
| 1 | 연상 보기 (그림·소리·모양) | 규칙 보기 (원글자와 무엇이 달라졌는지) |
| 2 | 보고 쓰기 | 보고 쓰기 |
| 3 | 옅게 쓰기 | 규칙만 보고 쓰기 (점·작은 글자의 자리만 떠올리며) |
| 4 | 기억 쓰기 | 단어 듣고 쓰기 |
세 번째 단계는 안내선의 불투명도를 0.08로 낮추고 규칙을 보고 쓰게 합니다. 마지막 단계는 단어를 듣고 표기를 쓰는 연습입니다. 화면 구성이 달라졌다는 것은 코드로 확인할 수 있지만, 학습자가 규칙을 더 잘 기억하는지는 별도의 피드백이 필요합니다.
글자 데이터에는 히라가나와 가타카나 짝(pairKana)도 들어 있어서 が와 ガ를 같은 규칙 안에서 오갈 수 있습니다.
홈 화면에서도 규칙으로 묶는다
42개 행은 section으로 묶습니다. 행마다 section을 두고, 홈 화면은 연속한 같은 구간끼리 묶어 보여 줍니다.
function groupRowsBySection(rows: KanaRow[]) {
const groups: { title: string; rows: KanaRow[] }[] = [];
for (const row of rows) {
const title = row.section ?? "";
const last = groups[groups.length - 1];
if (last && last.title === title) last.rows.push(row);
else groups.push({ title, rows: [row] });
}
return groups;
}
구간은 탁음·반탁음(히라가나/가타카나 각각 5행), 요음(히라가나 11행 + 가타카나 11행), 박자(촉음·받침·장음), 외래어(7행)입니다. 이 구간 이름이 곧 학습해야 할 규칙의 이름이기도 합니다.
진행 상황은 따로 센다
확장 가나의 진도는 히라가나·가타카나와 섞이지 않습니다. 테스트가 이것을 확인합니다.
const updated = updateScriptProgress(emptyProgress(), "extended", (current) => ({
...current,
completedCharacters: { "h-ga": ["が"] },
}));
expect(getScriptProgress(updated, "extended").completedCharacters["h-ga"]).toEqual(["が"]);
expect(getScriptProgress(updated, "hiragana").completedCharacters).toEqual({});
기초 46자의 개수가 바뀌지 않는 것(히라가나 10행 46자, 가타카나 10행 46자)도 테스트로 지킵니다. 기존 코스의 문자 수가 바뀌면 테스트가 실패합니다. 모든 확장 글자에 derivation이 있는지, 모든 행에 section이 있는지를 확인하는 테스트가 있습니다.
한계
- 예시 단어의 품질은 사람이 확인해야 합니다. 일부 칸(예: 구표기나 드문 단어)은 학습자에게 오히려 헷갈릴 수 있습니다.
- 발음이 같은 글자의 구별. じ와 ぢ, ず와 づ는 소리가 같아서 발음만으로는 구별되지 않습니다. 가나 입력 공방의 정답은 키(
ji/di)로 두 표기를 구별합니다. 입력 연습 글은 아직 초안이라 공개 링크는 함께 발행할 때 추가해야 합니다. - 연상 그림이 없습니다. 규칙으로 배우기로 했으므로 그림 도움은 없습니다. 규칙이 잘 와닿지 않는 학습자에게는 약점일 수 있습니다.
예시 단어에서 확인된 것과 남은 것
src/data/extendedKana.ts에는 ヂャズ를 “재즈(구표기)”, ヅケ를 “절임(구표기)”으로 적은 항목이 있습니다. 이 설명이 데이터에 있다는 사실과 일본어 표기로 정확하다는 판단은 구별해야 합니다. ヅケ의 “구표기” 분류는 아직 근거를 확인하지 못했으므로 이 글에서도 맞는 설명으로 채택하지 않습니다.
문화청의 외래어 표기 자료는 일반적인 외래어 표기의 기준을 제공합니다. 초급자에게 현재 표기를 가르치려면 이 기준과 실제 용례를 대조해야 합니다. 저장소의 ヂャズ를 설명 없이 대표 예시로 제시하는 것은 피하고, 현대 표기와 역사적 표기를 구별하는 설명이 먼저 필요합니다.
ミョウバン은 표기가 틀린 예시로 묶을 필요가 없습니다. 문부과학성의 초등학교 과학 자료에도 같은 표기가 나옵니다. 표기의 정확성과 한국어 초급 학습자에게 익숙한 어휘인지는 별개입니다.
リャク는 문화청의 상용한자 음훈 색인에 있는 略의 읽기입니다. 이 색인은 용례로 略称, 計略, 侵略을 들고 있습니다. 읽기의 근거는 확인되지만, 데이터의 “약칭”이라는 뜻풀이와 단독 단어로서의 적절성은 추가 어휘 검토 대상으로 남겨 둡니다.