본문 바로가기
Programming/JavaScript

한글의 한 글자를 초성 중성 종성 나누는 방법 | Algorithm | JavaScript

by 혀코 2020. 9. 7.

안녕하세요. 혀코입니다. 

이번 시간에는 한글의 한 글자를 초성 중성 종성으로 나눠 배열로 저장하는 방법을 알아보겠습니다.

 

우선 문자의 유니코드 번호를 구하는 방법을 알아야합니다.

문자의 유니코드 번호를 구하는 방법은 charCodeAt() 메소드를 사용합니다. 

유니코드 번호로 부터 문자를 표시하는 방법은 String.fromCharCode(num) 함수를 사용합니다.

자음에 해당하는 문자를 확인해 보기위해 ㄱ의 유니코드 번호를 확인해보면 12593이며, ㅎ의 유니코드 번호는 12622 이므로, for loop을 이용해서 ㄱ과 ㅎ 사이의 자음을 모두 표시해 보면 다음과 같습니다.

"ㄱ".charCodeAt();

// 12593

"ㅎ".charCodeAt();

// 12622

for(let i = 12593; i <= 12622; i++) {
  console.log(String.fromCharCode(i));
}

// ㄱ
// ㄲ
// ㄳ
// ㄴ
// ㄵ
// ㄶ
// ㄷ
// ㄹ
// ㄺ
// ㄻ
// ㄼ
// ㄽ
// ㄾ
// ㄿ
// ㅀ
// ㅁ
// ㅂ
// ㅃ
// ㅄ
// ㅅ
// ㅆ
// ㅇ
// ㅈ
// ㅉ
// ㅊ
// ㅋ
// ㅌ
// ㅍ
// ㅎ

 

이 중에서 초성으로 사용 가능한 자음은 키보드에서 확인 가능한 19개 문자 입니다.

ㄱ, ㄲ, ㄴ, ㄷ, ㄸ, ㄹ, ㅁ, ㅂ, ㅃ, ㅅ, ㅆ, ㅇ, ㅈ, ㅉ, ㅊ, ㅋ, ㅌ, ㅍ, ㅎ

이번에는 모음을 확인해 보기위해, ㅏ와 ㅣ사이의 문자를 출력해 보겠습니다.

"ㅏ".charCodeAt();

// 12623

"ㅣ".charCodeAt();

// 12643

for(let i = 12623; i <= 12643; i++) {
  console.log(String.fromCharCode(i);
}

// ㅏ
// ㅐ
// ㅑ
// ㅒ
// ㅓ
// ㅔ
// ㅕ
// ㅖ
// ㅗ
// ㅘ
// ㅙ
// ㅚ
// ㅛ
// ㅜ
// ㅝ
// ㅞ
// ㅟ
// ㅠ
// ㅡ
// ㅢ
// ㅣ

 

중성의 구성은 위와같이 확인할 수 있습니다.

종성은 '가'와 '개' 사이의 있는 문자를 출력하면 종성이 없는 경우를 포함해서 28개의 문자가 출력되는 것을 확인할 수 있습니다. 

"가".charCodeAt();

// 44032

"개".charCodeAt();

// 44060

for(let i = 44032; i <= 44060; i++) {
  console.log(String.fromCharCode(i));
}

// 가
// 각
// 갂
// 갃
// 간
// 갅
// 갆
// 갇
// 갈
// 갉
// 갊
// 갋
// 갌
// 갍
// 갎
// 갏
// 감
// 갑
// 값
// 갓
// 갔
// 강
// 갖
// 갗
// 갘
// 같
// 갚
// 갛
// 개

 

키보드에서 확인할 수 있는 초성 그리고 위에서 확인한 종성을 수동으로 배열에 추가시켜주고, 중성은 for loop을 통해서 배열에 추가시켜 주었습니다. 그리고 글자의 초성의 주기 중성의 주기를 알아보면 다음과 같습니다.

// 초성 총 19개
const firstChar = ['ㄱ','ㄲ','ㄴ','ㄷ','ㄸ','ㄹ','ㅁ','ㅂ','ㅃ','ㅅ','ㅆ','ㅇ','ㅈ','ㅉ','ㅊ','ㅋ','ㅌ','ㅍ','ㅎ'];
// 중성 총 21개
const middleChar = [];
// 종성 총 28개
const lastChar = ['','ㄱ','ㄲ','ㄳ','ㄴ','ㄵ','ㄶ','ㄷ','ㄹ','ㄺ','ㄻ','ㄼ','ㄽ','ㄾ','ㄿ','ㅀ','ㅁ','ㅂ','ㅄ','ㅅ','ㅆ','ㅇ','ㅈ','ㅊ','ㅋ','ㅌ','ㅍ','ㅎ'];

for(let i = 12623; i <= 12643; i++) {
  middleChar.push(String.fromCharCode(i));
}

console.log(middleChar);

// ["ㅏ","ㅐ","ㅑ","ㅒ","ㅓ","ㅔ","ㅕ","ㅖ","ㅗ","ㅘ","ㅙ","ㅚ","ㅛ","ㅜ","ㅝ","ㅞ","ㅟ","ㅠ","ㅡ","ㅢ","ㅣ"];

// 초성의 주기 구하기
"가".charCodeAt();

// 44032

"까".charCodeAt();

// 44620

"까".charCodeAt()-"가".charCodeAt();
// 588 // 초성의 주기

// 중성의 주기 구하기
'가'.charCodeAt();

// 44032

'개'.charCodeAt();

// 44060

'개'.charCodeAt() - '가'.charCodeAt();

// 28 // 중성의 주기

 

이 자료를 바탕으로 글자를 하나 받아서 함수를 작성해 보겠습니다.

function convertArray(char) {
  const firstChar = ['ㄱ','ㄲ','ㄴ','ㄷ','ㄸ','ㄹ','ㅁ','ㅂ','ㅃ','ㅅ','ㅆ','ㅇ','ㅈ','ㅉ','ㅊ','ㅋ','ㅌ','ㅍ','ㅎ'];
  const middleChar = [];
  const lastChar = ['','ㄱ','ㄲ','ㄳ','ㄴ','ㄵ','ㄶ','ㄷ','ㄹ','ㄺ','ㄻ','ㄼ','ㄽ','ㄾ','ㄿ','ㅀ','ㅁ','ㅂ','ㅄ','ㅅ','ㅆ','ㅇ','ㅈ','ㅊ','ㅋ','ㅌ','ㅍ','ㅎ'];

  for(let i = 12623; i <= 12643; i++) {
    middleChar.push(String.fromCharCode(i));
  }
  
  console.log(firstChar);
  console.log(middleChar);
  console.log(lastChar);
  
  const base = char.charCodeAt() - '가'.charCodeAt();
  
  const firstCharPeriod = parseInt('까'.charCodeAt()-'가'.charCodeAt()); // 초성의 주기
  const middleCharPeriod = parseInt('개'.charCodeAt()-'가'.charCodeAt()); // 중성의 주기
  
  let chosung = firstChar[parseInt(base / firstCharPeriod)];
  let joongsung = middleChar[parseInt((base - (firstCharPeriod * parseInt(base / firstCharPeriod))) / middleCharPeriod)];
  let jongsung = lastChar[parseInt(base % 28)];
  
  return [chosung, joongsung, jongsung];
}

convertArray("짱");

// ["ㅉ", "ㅏ", "ㅇ"]

 

 

이렇게 한글의 하나의 글자를 초성 중성 종성으로 나눠 배열로 저장하는 방법을 알아봤습니다.

유용하셨다면, 공감과 구독 부탁 드립니다.

감사합니다. :)

댓글