본문 바로가기
프로그래밍/Golang

Go언어를 사용한 자모음 분리

by Loper Lee 2020. 7. 7.

Golang 자모음 분리

분리 코드와 각종 참조는 해당 블로그에서 발최하였습니다.

서론

한글의 자모음의 분리가 필요한 일이 있어 구글신의 힘을 빌어보고 있었다.
여러 가지 언어로 포팅된 포스트를 보았고, 이를 포팅할 생각이었다.
하지만 만드는 김에 결합 기능까지 추가해서 직접 만들어보기로 하였다.

굳이 긴 글을 읽을 필요 없이 필자의 Github 저장소에 해당 소스가 있어 바로 가져다 쓸 수 있다.

초성, 중성, 종성의 분리


한글은 초성, 중성, 종성으로 구분이 되어있다.
각각 초성 19개, 중성 21개, 종성 28개로 구성되어있다.
이를 배열에 담아보자면 아래와 같은 형태가 된다.

var (
    hangulCHO = []string{"ㄱ", "ㄲ", "ㄴ", "ㄷ", "ㄸ", "ㄹ", "ㅁ", "ㅂ", "ㅃ", "ㅅ", "ㅆ", "ㅇ", "ㅈ", "ㅉ", "ㅊ", "ㅋ", "ㅌ", "ㅍ", "ㅎ"}
    hangulJUN = []string{"ㅏ", "ㅐ", "ㅑ", "ㅒ", "ㅓ", "ㅔ", "ㅕ", "ㅖ", "ㅗ", "ㅘ", "ㅙ", "ㅚ", "ㅛ", "ㅜ", "ㅝ", "ㅞ", "ㅟ", "ㅠ", "ㅡ", "ㅢ", "ㅣ"}
    hangulJON = []string{"", "ㄱ", "ㄲ", "ㄳ", "ㄴ", "ㄵ", "ㄶ", "ㄷ", "ㄹ", "ㄺ", "ㄻ", "ㄼ", "ㄽ", "ㄾ", "ㄿ", "ㅀ", "ㅁ", "ㅂ", "ㅄ", "ㅅ", "ㅆ", "ㅇ", "ㅈ", "ㅊ", "ㅋ", "ㅌ", "ㅍ", "ㅎ"}
)

종성은 없는 경우가 존재하므로 공백을 넣어주었다.

한글을 분리하기 전 유니코드에 대해서 알아두면 이해가 더 편하다.
해당 블로그의 글이 모든 한글 유니코드 정리가 되어있어 이해가 편리하다.

  1. 종성이 변경될 때 DEX값이 1씩 증가한다.
  2. 중성이 변경될때 DEX값이 28씩 증가한다.
  3. 초성이 변경될때 DEX값이 588씩 증가한다.

즉 초성의 값 변경은 중성의 수*종성의 수 이다.

이를 이해했다면 뒤는 쉽다.

temp := c - hangulBASE // '가'의 유니코드를 빼준다.
cho := (temp / 588) // 588마다 초성이 바뀌기 때문에 이를 나눠준다.
jung := (temp - (cho * 588)) / 28 // 초성값을 빼고 종성의 변경값으로 나눠주면 중성을 구할 수 있다.
jong := temp % 28 // 1마다 변경되는 종성의 수로 mod연산을 실시한다.

예를 들어 '합'이라는 문자의 초성을 구한다고 생각해보자.
모든 계산은 소수점을 버린다.

  1. '합'의 유니코드는 54633이다.
  2. '가'의 유니코드는 44032이다.
  3. '합'-'가'의 값은 10601이다.
  4. 10601/588 = 18 이를 초성 배열에서 해당 index 값을 가져오면 'ㅎ'을 가져올 수 있다.
  5. (10601 - (18*588)) / 28 = 0 이를 중성 배열에서 해당 index 값을 가져오면 'ㅏ'을 가져올 수 있다.
  6. 10601 % 28 = 17 이를 종성 배열에서 해당 index 값을 가져오면 'ㅂ'을 가져올 수 있다.

 

초성, 중성, 종성의 분리가 완료되었다.

'프로그래밍 > Golang' 카테고리의 다른 글

Go언어를 이용한 한글의 결합  (0) 2020.09.08
Go configration 불러오기  (0) 2020.07.09
Golang 정규식을 통한 특수문자 제거  (0) 2019.12.13