basscraft
2k
2019-02-15 17:03:27
7
2748

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,"과","와"));


결과

네이버로
네이버를
네이버가
네이버는
네이버와
카카오톡으로
카카오톡을
카카오톡이
카카오톡은
카카오톡과
구글로
구글을
구글이
구글은
구글과
문화포털로
문화포털을
문화포털이
문화포털은
문화포털과


허접한 코드 몇 줄 이지만 한 분이라도 도움이 도시길

27
15
  • 댓글 7

  • 나도아빠다
    2k
    2019-02-15 19:26:36

    오오 감사합니다..!

    0
  • 간고등어코치
    392
    2019-02-15 19:33:30

    이 글는 추천를 받을만한 글가 맞습니다.

    3
  • cubefps
    174
    2019-02-19 15:54:39

    왜 이걸 아무도 만들지 않지? 라는 의문 속에 살다가 드디어 이걸 본...

    추천드립니다.

    0
  • 프리만세
    922
    2019-02-21 17:09:20 작성 2019-02-21 17:09:31 수정됨

    좋은글 추천!

    0
  • Hide_D
    147
    2019-02-21 23:44:42 작성 2019-02-21 23:46:59 수정됨

    https://github.com/coxcore/postposition

    이쪽은 비슷한 기능을 하는 자바스크립트인데, 비교해볼만한 게 있어서 가져와봤습니다.

    0
  • 플래니타
    381
    2019-02-22 10:53:18

    우왕 멋지네요. 

    0
  • 얻으민
    856
    2019-03-01 23:04:00

    자바스크립트(node.js) 버전



    const getPostWord = (str, firstVal, secondVal) => {
        try {
            let lastStr = str[str.length-1].charCodeAt(0);
            // 한글의 제일 처음과 끝의 범위밖일 경우는 오류
            if(lastStr < 0xAC00 || lastStr > 0xD7A3) {
                return str;
            }
            let lastCharIndex = (lastStr - 0xAC00) % 28;
            // 종성인덱스가 0이상일 경우는 받침이 있는경우이며 그렇지 않은경우는 받침이 없는 경우
            if(lastCharIndex > 0) {
                // 받침이 있는경우
    			// 조사가 '로'인경우 'ㄹ'받침으로 끝나는 경우는 '로' 나머지 경우는 '으로'
                if(firstVal === "으로" && lastCharIndex === 8)
                    str += secondVal;
                else
                    str += firstVal;
            } else {
                // 받침이 없는 경우
                str += secondVal;
            }
        } catch(e) {
            console.error(e);
        }
    
        return str;
    }
    
    let name;
    name = "네이버";
    console.log(getPostWord(name, "으로", "로"));
    console.log(getPostWord(name, "을", "를"));
    console.log(getPostWord(name, "이", "가"));
    console.log(getPostWord(name, "은", "는"));
    console.log(getPostWord(name, "과", "와"));
    
    name = "카카오톡";
    console.log(getPostWord(name, "으로", "로"));
    console.log(getPostWord(name, "을", "를"));
    console.log(getPostWord(name, "이", "가"));
    console.log(getPostWord(name, "은", "는"));
    console.log(getPostWord(name, "과", "와"));
    
    name = "구글";
    console.log(getPostWord(name, "으로", "로"));
    console.log(getPostWord(name, "을", "를"));
    console.log(getPostWord(name, "이", "가"));
    console.log(getPostWord(name, "은", "는"));
    console.log(getPostWord(name, "과", "와"));
    
    name = "문화포털";
    console.log(getPostWord(name, "으로", "로"));
    console.log(getPostWord(name, "을", "를"));
    console.log(getPostWord(name, "이", "가"));
    console.log(getPostWord(name, "은", "는"));
    console.log(getPostWord(name, "과", "와"));


    1
  • 로그인을 하시면 댓글을 등록할 수 있습니다.