본문 바로가기
FullStack/21. Java

[Java] 초성 추출하기

by nakanara 2021. 1. 29.
반응형

단어가 입력된 시점에서 초성을 추출하여 별도 컬럼에 저장하였다가 함께 조회하기 위해 초성 추출 코드 작성

`한`이라는 글자를 표현하기 위해서는 글자마다의 Index 판단

초성 `ㅎ` 의 경우 18번째 
중성 `ㅏ` 의 경우 0번째
종성 `ㄴ` 의 경우 4번째

값을 더하여 ((18*588) + (0 * 28) + 4) + 44032 = 54620 값 생성
`한` 이라는 글자는 54620으로 `한`으로 표현

- 588: 중성 21자 * 종성 28자 = 588
- 44032 = 한글 시작 값
@Test
public void getKeyword(){

  String keyword = "무궁화 꽃이 피었습니다.1234567890!@#$%^&*(){}|:<>?걔걕걖걗걘걙걚걛걜걝걞걟걠걡걢걣걤걥걦걧걨걩걪걫걬걭걮걯";

  for(int i=0; i < keyword.length();i++) {

    String k = keyword.substring(i, i+1);
    System.out.println(k + "//=" + getInitialSound(k));
  }
}

/**
  * 초성 추출, 중성, 종성 구하는 방법 추가
  * @param text
  * @return
  */
public String getInitialSound(String text) {

  // 초성 19자
  final String[] initialChs = {
    "ㄱ", "ㄲ", "ㄴ", "ㄷ", "ㄸ",
    "ㄹ", "ㅁ", "ㅂ", "ㅃ", "ㅅ",
    "ㅆ", "ㅇ", "ㅈ", "ㅉ", "ㅊ",
    "ㅋ", "ㅌ", "ㅍ", "ㅎ"
  };

  // 중성 21자
  final String[] medialChs = {
    "ㅏ", "ㅐ", "ㅑ", "ㅒ", "ㅓ",
    "ㅔ", "ㅕ", "ㅖ", "ㅗ", "ㅘ",
    "ㅙ", "ㅚ", "ㅛ", "ㅜ", "ㅝ",
    "ㅞ", "ㅟ", "ㅠ", "ㅡ", "ㅢ",
    "ㅣ"
  };

  // 종성 없는 경우 포함하여 28자
  final String[] finalChs = {
    " ",  "ㄱ", "ㄲ", "ㄳ", "ㄴ",
    "ㄵ", "ㄶ", "ㄷ", "ㄹ", "ㄺ",
    "ㄻ", "ㄼ", "ㄽ", "ㄾ", "ㄿ",
    "ㅀ", "ㅁ", "ㅂ", "ㅄ", "ㅅ",
    "ㅆ", "ㅇ", "ㅈ", "ㅊ", "ㅋ",
    "ㅌ", "ㅍ", "ㅎ"
  };

  // 19: 초성
  // 21: 중성
  // 28: 종성
  if(text.length() > 0) {
    char chName = text.charAt(0);
    if(chName >= 0xAC00 && chName <= 0xD7A3) {  // 0xAC00(가) ~ 0xD7A3(힣)

      int uniVal = chName - 0xAC00;
      int initialCh = ((uniVal) / (21 * 28)); // 초성 index
      System.out.println(initialChs[initialCh]);

      // 중성
      int medialCh = ((uniVal % (28 * 21)) / 28);
      System.out.println(medialChs[medialCh]);

      // 종성
      int finalCh = ((uniVal % 28));
      System.out.println(finalChs[finalCh]);

      return initialChs[initialCh];
    } else {
      return ""+chName;
    }
  }

  return "";
}

참고

반응형