IT 웹개발/Java

[Java] 자바 한글 조사 연결 (을/를,이/가,은/는,로/으로) 해주는 함수

펌킨고구마 2022. 4. 7. 14:49
728x90
반응형

출처 : https://okky.kr/article/549842

 

OKKY | Java 한글 조사 연결 (을/를,이/가,은/는,로/으로) 해주는 함수 만들어 봤습니다.

한글 문장에 변수를 치환하다 보면 단어에 따라 조사가 바뀌어야 하는 경우가 많습니다. XX를(을) 하다 뭐 이렇게 표현하곤 하는데요... 예전에 프로젝트 하다가... 모바일에서 글을 보니 좀 지저

okky.kr

 

 * 한글 조사 연결 (을/를,이/가,은/는,로/으로)
 1. 종성에 받침이 있는 경우 '을/이/은/으로/과'
 2. 종성에 받침이 없는 경우 '를/가/는/로/와'
 3. '로/으로'의 경우 종성의 받침이 'ㄹ' 인경우 '로'

 

1개의 한글은 초성 + 중성 + 종성의 조합으로 유니코드값이 만들어짐.

 

한글 유니코드 조합하기

= 0xAC00(처음 한글 시작값) + (초성 인덱스 x 21 x 28 ) + (중성 인덱스 x 28) + 종성 인덱스

 

유니코드 분해하기

초성 인덱스 = ((한글 유니코드값 - 0xAC00) / 28) / 21

중성 인덱스 = ((한글 유니코드값 - 0xAC00) / 28) % 21

종성 인덱스 = (한글 유니코드값 - 0xAC00) % 28

 

 

/**
	 * 한글 조사 연결 (을/를,이/가,은/는,로/으로)
	 * 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(getPostWord(name,"으로","로"));
		System.out.println(getPostWord(name,"을","를"));
		System.out.println(getPostWord(name,"이","가"));
		System.out.println(getPostWord(name,"은","는"));
		System.out.println(getPostWord(name,"과","와"));


		name = "카카오톡";
		System.out.println(getPostWord(name,"으로","로"));
		System.out.println(getPostWord(name,"을","를"));
		System.out.println(getPostWord(name,"이","가"));
		System.out.println(getPostWord(name,"은","는"));
		System.out.println(getPostWord(name,"과","와"));

		name = "구글";
		System.out.println(getPostWord(name,"으로","로"));
		System.out.println(getPostWord(name,"을","를"));
		System.out.println(getPostWord(name,"이","가"));
		System.out.println(getPostWord(name,"은","는"));
		System.out.println(getPostWord(name,"과","와"));

		name = "문화포털";
		System.out.println(getPostWord(name,"으로","로"));
		System.out.println(getPostWord(name,"을","를"));
		System.out.println(getPostWord(name,"이","가"));
		System.out.println(getPostWord(name,"은","는"));
		System.out.println(getPostWord(name,"과","와"));

 

결과화면 : 

 

 

 

 

728x90
반응형
LIST