Korean Foundations: Hangul, Sound, and Sentence Architecture
Understand the system first: letters become syllable blocks, particles assign roles, and endings complete the message.
Korean becomes easier when you stop treating it as a list of phrases and start seeing it as a layered language system. Hangul letters form syllable blocks. Nouns receive particles that declare their roles. Predicates close the sentence and carry tense, politeness, mood, and speaker attitude.
This foundation article connects those layers into one map. Each TypeScript model is a precise structural analogy: it records components, constraints, and output without pretending that code itself generates natural Korean. Read the language evidence first, then use the model to inspect how the parts relate.
Build Korean from letters to syllable blocks
Hangul is a designed writing system. Learn the letters, understand their sound roles, then assemble them into readable Korean syllables.
Basic consonants
Click a consonant to use it as the initial sound in the Syllable Builder.
Tense consonants
These sounds are produced with greater muscular tension, not simply by doubling the duration.
Hangul is an engineered alphabetic system
Hangul, written 한글, is an alphabetic writing system. Its basic units are consonant and vowel letters called jamo. These letters are not written in a simple horizontal chain. They are arranged into square-looking syllable blocks.
For example, 한 contains the initial consonant ㅎ, the vowel ㅏ, and the final consonant ㄴ. The block 글 contains ㄱ, ㅡ, and ㄹ. Together they form 한글.
The visible block is one syllable unit, but its internal structure remains analyzable. This is the first key idea of Korean writing: one displayed block can contain several smaller sound components.
Hangul — the Korean alphabet and writing system. The name itself is built from two syllable blocks: 한 and 글.
Hangul / the Korean writing system
// A structural model: components + rendered syllable.
type Initial = "ㅎ" | "ㄱ";
type Medial = "ㅏ" | "ㅡ";
type Final = "ㄴ" | "ㄹ";
type SyllableSpec<
I extends Initial,
M extends Medial,
F extends Final,
Surface extends string,
> = {
initial: I;
medial: M;
final: F;
surface: Surface;
};
type Han =
SyllableSpec<"ㅎ", "ㅏ", "ㄴ", "한">;
type Geul =
SyllableSpec<"ㄱ", "ㅡ", "ㄹ", "글">;
type Hangeul =
readonly [Han, Geul];The model records composition and surface form separately. Unicode composition produces the displayed block; simple string concatenation of jamo would not be equivalent to a precomposed Hangul syllable.
Vowels control the sound center and block layout
Every Korean syllable requires a vowel. The vowel is the sound center of the block and also influences its visual layout. Vertical vowels such as ㅏ, ㅓ, and ㅣ are commonly placed to the right of the initial consonant. Horizontal vowels such as ㅗ, ㅜ, and ㅡ are commonly placed below it.
Start with six high-value vowels: ㅏ a, ㅓ eo, ㅗ o, ㅜ u, ㅡ eu, and ㅣ i. For Vietnamese learners, useful approximations are a, ơ, ô, u, ư, and i. These hints are orientation tools, not exact replacements for Korean pronunciation.
Six core Korean vowels
type VerticalVowel =
| "ㅏ"
| "ㅓ"
| "ㅣ";
type HorizontalVowel =
| "ㅗ"
| "ㅜ"
| "ㅡ";
type CoreVowel =
| VerticalVowel
| HorizontalVowel;
type VowelLayout<
V extends CoreVowel,
> =
V extends VerticalVowel
? "initial-left / vowel-right"
: "initial-top / vowel-bottom";
type LayoutOfA =
VowelLayout<"ㅏ">;
type LayoutOfU =
VowelLayout<"ㅜ">;An initial ㅇ is silent before a vowel, as in 아. In final position, the same letter represents the sound ng, as in 강.
Consonants change according to position and tension
Korean consonants cannot be mapped perfectly to English or Vietnamese letters. Several basic consonants sit between familiar categories: ㄱ may sound between g and k, ㄷ between d and t, and ㅂ between b and p. ㄹ varies between an r-like and l-like sound depending on position.
Korean also distinguishes plain, aspirated, and tense consonants. Compare ㄱ, ㅋ, and ㄲ; or ㄷ, ㅌ, and ㄸ. These are not just spelling variants. They differ in airflow, tension, and timing.
Use romanization only as temporary scaffolding. The stable target is the Hangul letter plus real listening evidence.
Plain, aspirated, and tense consonant series
type Place =
| "velar"
| "alveolar"
| "bilabial";
type Manner =
| "plain"
| "aspirated"
| "tense";
type ConsonantSeries = {
velar: {
plain: "ㄱ";
aspirated: "ㅋ";
tense: "ㄲ";
};
alveolar: {
plain: "ㄷ";
aspirated: "ㅌ";
tense: "ㄸ";
};
bilabial: {
plain: "ㅂ";
aspirated: "ㅍ";
tense: "ㅃ";
};
};
type PickConsonant<
P extends Place,
M extends Manner,
> = ConsonantSeries[P][M];The categories model contrast, not exact pronunciation. Sound realization still depends on position and neighboring sounds.
A syllable block has required and optional slots
A standard Hangul syllable block contains an initial consonant (초성), a medial vowel (중성), and optionally a final consonant (종성, often called 받침 in learning contexts).
가 contains initial ㄱ and medial ㅏ. 한 adds final ㄴ. If a spoken syllable begins with a vowel, the written initial slot is filled by silent ㅇ, as in 아.
The block is therefore not a random drawing. It is a compact layout with defined slots. The Syllable Builder in KN Origin Lab exposes those slots directly.
Korea — two syllable blocks
type FinalSlot =
string | null;
type SyllableBlock<
Initial extends string,
Medial extends string,
Final extends FinalSlot,
Surface extends string,
> = {
slots: readonly [
Initial,
Medial,
Final,
];
surface: Surface;
};
type Han =
SyllableBlock<
"ㅎ",
"ㅏ",
"ㄴ",
"한"
>;
type Guk =
SyllableBlock<
"ㄱ",
"ㅜ",
"ㄱ",
"국"
>;
type Hanguk = {
blocks: readonly [
Han,
Guk,
];
surface: "한국";
};Read Korean by syllable blocks, then refine the real pronunciation through sound rules and listening. Written 국 and its spoken realization are related but not always mechanically identical in every context.
한 exposes three functional slots: initial, medial, and final.Particles assign grammatical roles to noun phrases
Korean attaches particles after nouns and noun phrases. A particle does not usually carry the main lexical meaning. Instead, it labels how that noun phrase participates in the sentence.
Core beginner markers include 은/는 for topic, 이/가 for subject, 을/를 for object, 에 for time or destination, and 에서 for the location of an action.
This role-tagging system gives Korean more flexibility than a language that depends only on position. Word order still matters, but particles provide explicit local evidence about function.
Particle — a grammatical marker attached to a noun phrase to express topic, subject, object, location, direction, comparison, and other relations.
I drink coffee.
type ParticleRole = {
"는": "topic";
"를": "object";
};
type TaggedNoun<
Stem extends string,
Marker extends keyof ParticleRole,
> = {
stem: Stem;
marker: Marker;
role: ParticleRole[Marker];
surface:
`${Stem}${Marker}`;
};
type Topic =
TaggedNoun<"저", "는">;
type ObjectPhrase =
TaggedNoun<"커피", "를">;
type Sentence = {
topic: Topic;
object: ObjectPhrase;
predicate: "마십니다";
surface:
"저는 커피를 마십니다.";
};The particle is modeled as a role-bearing field rather than decorative text. 저는 establishes the topic; 커피를 identifies the object.
The predicate is the sentence's final control point
A basic Korean clause usually develops toward a final predicate. Topic, subject, object, time, place, and manner may appear before it; the predicate normally arrives last.
A useful beginner frame is topic/subject + complements + predicate. The predicate may be an action verb, a descriptive verb, or a noun predicate built with the copula 이다.
Do not decide the full meaning too early. Korean endings attached to the final predicate can change tense, politeness, question status, certainty, or attitude. Reading to the end is therefore a structural skill, not just a habit.
I study Korean.
type TopicPhrase = {
surface: "저는";
role: "topic";
};
type ObjectPhrase = {
surface: "한국어를";
role: "object";
};
type Predicate = {
surface: "공부합니다";
position: "final";
};
type ClauseOrder = readonly [
TopicPhrase,
ObjectPhrase,
Predicate,
];
type Sentence = {
order: ClauseOrder;
surface:
"저는 한국어를 공부합니다.";
};The final predicate 공부합니다 supplies the central event and formal-polite ending. Earlier phrases provide participants and context.
Topic and subject are separate information roles
은/는 and 이/가 are often translated into languages that do not preserve their distinction. That translation can hide the real system.
은/는 frames what the discourse is about, often adding contrast or continuity. 이/가 identifies the grammatical subject, especially when introducing, selecting, or questioning a specific participant.
A topic may also contain or contrast with a subject inside a larger sentence. Therefore, do not memorize a single English or Vietnamese equivalent. Learn the information role each marker creates.
As for me, I am a student.
type TopicMarker =
| "은"
| "는";
type SubjectMarker =
| "이"
| "가";
type TopicPhrase<
Surface extends string,
> = {
surface: Surface;
informationRole: "topic-frame";
};
type SubjectPhrase<
Surface extends string,
> = {
surface: Surface;
grammaticalRole: "subject";
};
type SelfIntroduction = {
topic:
TopicPhrase<"저는">;
predicate:
"학생입니다";
surface:
"저는 학생입니다.";
};저는 establishes the frame 'as for me'. The noun predicate then identifies the speaker as a student.
Who came?
type InterrogativeSubject = {
stem: "누구";
marker: "가";
surface: "누가";
role:
"requested-subject";
};
type Question = {
subject:
InterrogativeSubject;
predicate:
"왔어요";
surface:
"누가 왔어요?";
};The question requests the identity of a specific subject, so 가 is natural.
Sentence endings encode interaction as well as grammar
Korean sentence endings do more than finish a clause. They can express tense, sentence type, formality, politeness, certainty, softness, command, suggestion, and emotion.
For noun predicates, 입니다 is formal-polite. 이에요/예요 is polite and conversational. The choice between 이에요 and 예요 depends on whether the preceding noun has a final consonant.
Because interactional meaning is concentrated near the end, changing only the ending can change how the entire sentence relates the speaker to the listener.
Formal-polite and conversational-polite noun predicates
type NounEnding =
| "입니다"
| "이에요"
| "예요";
type NounPredicate<
Noun extends string,
Ending extends NounEnding,
Surface extends string,
> = {
noun: Noun;
ending: Ending;
surface: Surface;
};
type FormalStudent =
NounPredicate<
"학생",
"입니다",
"학생입니다"
>;
type PoliteStudent =
NounPredicate<
"학생",
"이에요",
"학생이에요"
>;
type PoliteDoctor =
NounPredicate<
"의사",
"예요",
"의사예요"
>;학생 ends with a final consonant, so conversational speech uses 이에요. 의사 ends in a vowel, so it uses 예요.
Build first sentences from reusable structural patterns
Once the writing, role, order, and ending systems are visible, beginner sentences become reusable patterns rather than isolated phrases.
Useful starting frames include A은/는 B입니다 for formal identification, A이/가 있어요 for existence, A을/를 먹어요 for an object-action clause, and A에 가요 for movement toward a destination.
Korean frequently omits a subject that is recoverable from context. Therefore 한국어를 공부해요 can be a complete natural sentence even though no explicit word for I, you, or another person appears.
I am Vietnamese.
type TopicPhrase = {
stem: "저";
marker: "는";
surface: "저는";
};
type NounPredicate = {
noun: "베트남 사람";
ending: "입니다";
surface:
"베트남 사람입니다";
};
type SelfIntroduction = {
topic:
TopicPhrase;
predicate:
NounPredicate;
surface:
"저는 베트남 사람입니다.";
};The sentence combines a topic phrase and a formal noun predicate. Each component has a distinct structural responsibility.
I study Korean. / Korean is being studied, depending on context.
type OmittedSubject = {
surface: null;
recoverableFrom:
"context";
};
type ObjectPhrase = {
stem: "한국어";
marker: "를";
surface:
"한국어를";
};
type ContextualSentence = {
subject:
OmittedSubject;
object:
ObjectPhrase;
predicate:
"공부해요";
surface:
"한국어를 공부해요.";
};Subject omission is licensed by context. The sentence is structurally complete because the predicate and object are explicit and the missing participant is pragmatically recoverable.