STILLCODING

STILL CODING / NOTES

탁음·요음·외래어를 외우지 않고 '만들게' 하기 — 149개 표기를 7가지 규칙으로

JH Kim

히라가나와 가타카나 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이 있는지를 확인하는 테스트가 있습니다.

한계

예시 단어에서 확인된 것과 남은 것

src/data/extendedKana.ts에는 ヂャズ를 “재즈(구표기)”, ヅケ를 “절임(구표기)”으로 적은 항목이 있습니다. 이 설명이 데이터에 있다는 사실과 일본어 표기로 정확하다는 판단은 구별해야 합니다. ヅケ의 “구표기” 분류는 아직 근거를 확인하지 못했으므로 이 글에서도 맞는 설명으로 채택하지 않습니다.

문화청의 외래어 표기 자료는 일반적인 외래어 표기의 기준을 제공합니다. 초급자에게 현재 표기를 가르치려면 이 기준과 실제 용례를 대조해야 합니다. 저장소의 ヂャズ를 설명 없이 대표 예시로 제시하는 것은 피하고, 현대 표기와 역사적 표기를 구별하는 설명이 먼저 필요합니다.

ミョウバン은 표기가 틀린 예시로 묶을 필요가 없습니다. 문부과학성의 초등학교 과학 자료에도 같은 표기가 나옵니다. 표기의 정확성과 한국어 초급 학습자에게 익숙한 어휘인지는 별개입니다.

リャク는 문화청의 상용한자 음훈 색인에 있는 略의 읽기입니다. 이 색인은 용례로 略称, 計略, 侵略을 들고 있습니다. 읽기의 근거는 확인되지만, 데이터의 “약칭”이라는 뜻풀이와 단독 단어로서의 적절성은 추가 어휘 검토 대상으로 남겨 둡니다.