Java 한글 조사 연결 (을/를,이/가,은/는,로/으로) 해주는 함수 만들어 봤습니다.
한글 문장에 변수를 치환하다 보면 단어에 따라 조사가 바뀌어야 하는 경우가 많습니다.
XX를(을) 하다
뭐 이렇게 표현하곤 하는데요...
예전에 프로젝트 하다가... 모바일에서 글을 보니 좀 지저분해 보여서 한번 만들어 봤습니다.
원리는 단어의 종성에 받침 유무에 따라 바뀌는 것 이더라구요
https://opensrc.tistory.com/176
그때 작성했던 포스트 입니다. 그동안 비공개로 뒀다가 오늘 다른 프로잭트에 쓸일이 있어서 사용하면서 공개로 바꿨네요.
기본적인 원리에 대해 참고 했던 게시글이 있었는데 오늘 확인해 보니 포스트가 삭제 된 것 같습니다.
물론 제가 처음 만든 것은 아니고 다른 분 소스를 참고 한 것이고
소스안에 참고한 곳의 링크도 함께 올렸습니다.
좀 어설퍼서 더 깔끔하게 만들고 싶지만 딱히 시간도 없고...
더 좋은 방법이 떠오르지가 않네요.
/**
* 한글 조사 연결 (을/를,이/가,은/는,로/으로)
* 1. 종성에 받침이 있는 경우 '을/이/은/으로/과'
* 2. 종성에 받침이 없는 경우 '를/가/는/로/와'
* 3. '로/으로'의 경우 종성의 받침이 'ㄹ' 인경우 '로'
* 참고 1 : http://gun0912.tistory.com/65 (소스 참고)
* 참고 2 : http://www.klgoodnews.org/board/bbs/board.php?bo_table=korean&wr_id=247 (조사 원리 참고)
* @param name
* @param firstValue
* @param secondValue
* @return
*/
public static String getPostWord(String str, String firstVal, String secondVal) {
try {
char laststr = str.charAt(str.length() - 1);
// 한글의 제일 처음과 끝의 범위밖일 경우는 오류
if (laststr < 0xAC00 || laststr > 0xD7A3) {
return str;
}
int lastCharIndex = (laststr - 0xAC00) % 28;
// 종성인덱스가 0이상일 경우는 받침이 있는경우이며 그렇지 않은경우는 받침이 없는 경우
if(lastCharIndex > 0) {
// 받침이 있는경우
// 조사가 '로'인경우 'ㄹ'받침으로 끝나는 경우는 '로' 나머지 경우는 '으로'
if(firstVal.equals("으로") && lastCharIndex == 8) {
str += secondVal;
} else {
str += firstVal;
}
} else {
// 받침이 없는 경우
str += secondVal;
}
} catch (Exception e) {
//e.printStackTrace();
}
return str;
}
사용법과 결과 입니다.
String name;
name = "네이버";
System.out.println(StringUtils.getPostWord(name,"으로","로"));
System.out.println(StringUtils.getPostWord(name,"을","를"));
System.out.println(StringUtils.getPostWord(name,"이","가"));
System.out.println(StringUtils.getPostWord(name,"은","는"));
System.out.println(StringUtils.getPostWord(name,"과","와"));
name = "카카오톡";
System.out.println(StringUtils.getPostWord(name,"으로","로"));
System.out.println(StringUtils.getPostWord(name,"을","를"));
System.out.println(StringUtils.getPostWord(name,"이","가"));
System.out.println(StringUtils.getPostWord(name,"은","는"));
System.out.println(StringUtils.getPostWord(name,"과","와"));
name = "구글";
System.out.println(StringUtils.getPostWord(name,"으로","로"));
System.out.println(StringUtils.getPostWord(name,"을","를"));
System.out.println(StringUtils.getPostWord(name,"이","가"));
System.out.println(StringUtils.getPostWord(name,"은","는"));
System.out.println(StringUtils.getPostWord(name,"과","와"));
name = "문화포털";
System.out.println(StringUtils.getPostWord(name,"으로","로"));
System.out.println(StringUtils.getPostWord(name,"을","를"));
System.out.println(StringUtils.getPostWord(name,"이","가"));
System.out.println(StringUtils.getPostWord(name,"은","는"));
System.out.println(StringUtils.getPostWord(name,"과","와"));
결과
네이버로
네이버를
네이버가
네이버는
네이버와
카카오톡으로
카카오톡을
카카오톡이
카카오톡은
카카오톡과
구글로
구글을
구글이
구글은
구글과
문화포털로
문화포털을
문화포털이
문화포털은
문화포털과
허접한 코드 몇 줄 이지만 한 분이라도 도움이 도시길