박상권의 삽질블로그

[안드로이드/JAVA]한글 받침에따라서 '을/를' 구분하기 본문

IT/Android-TIP (한글)

[안드로이드/JAVA]한글 받침에따라서 '을/를' 구분하기

박상권 2016.08.04 18:19

안드로이드뿐만아니라 아이폰,PC에서 서비스를 사용할때 'xxx을(를)' 혹은 'xxx이(가)' 로 표시되는 메세지를 많이 보셨을겁니다.



이는 한글의 받침때문에 일어나는 한국어만의 문제입니다.

받침이 있느냐 없느냐에 따라 뒤에 붙는 글자가 '을/를', '이/가','은/는'이 되기 때문입니다.


서비스를 개발하면서 변수로 사용되는 이름 혹은 단어가 어떤게 올지 모르지 개발자 입장에서는 위와 같이 대응하는 방법이 제일 편하고 쉽습니다.


하지만 좀더 깔끔한 문장을 만들기위해서는 받침의 유무에따라서 뒤에붙는 글자를 판단하고 싶은경우가 있습니다.

'박상권을(를) 좋아합니다' 보다는 '박상권을 좋아합니다' 라고 쓰여있는 문장이 좀더 깔끔한 문장으로 보여질것입니다.

해당 변수의 한글단어에 따라서 뒤에 붙는 조사를 판단하는 방법에 대해서 포스팅 해보겠습니다.








1. 종성 가져오기


한글은 실제코드에서는 유니코드로 구성되어있습니다.

19개의 초성, 21개의 중성, 28개의 중성의 조합으로 한글이 만들어 집니다.


(사진출처: http://blog.finsternis.me/380)



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


한글 유니코드값을 초성/중성/종성으로 나누는 방법과 반대로 초성/중성/종성을 조합해서 유니코드를 만드는 방법은 인터넷에 검색해보시면 정말 많이 나와있습니다.

http://hanpsy.tistory.com/2

http://dream.ahboom.net/entry/%ED%95%9C%EA%B8%80-%EC%9C%A0%EB%8B%88%EC%BD%94%EB%93%9C-%EC%9E%90%EC%86%8C-%EB%B6%84%EB%A6%AC-%EB%B0%A9%EB%B2%95

http://divestudy.tistory.com/8




사실 결론적으로 아래 수식만 알고 계시면됩니다.


한글 유니코드 조합하기

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


유니코드 분해하기

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

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

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




여기서 우리는 종성인덱스 값을 가져올 수 있습니다.


이를 안드로이드의 코드로 구현해본다면 아래와 같습니다.

char lastName = name.charAt(name.length() - 1);
int index= (lastName - 0xAC00) % 28;

찾고자하는 값의 마지막 글자를 가져온뒤, 이 글자의 종성 인덱스 값을 찾아옵니다.








2. 받침포함여부 가져오기


위의 종성테이블에서 보시면 아시겠지만 받침이 없는경우는 종성 인덱스가 0으로 구성되어 있습니다.

그러므로 1번에서 가져온 종성인덱스가 0이상일 경우는 받침이 있는경우이며 그렇지 않은경우는 받침이 없는 경우입니다.

우리는 이 경우를 판단해서 해당 단어 뒤에 '을/를', '이/가','은/는' 을 붙여주면 되는것입니다.




최종 만들어질 함수의 내용은 아래와 같은 방식으로 만들어 집니다.






사용하실때는 아래와 같이 사용해주시면 됩니다.


String name="박상권";

String name1=KoreanUtil.getComleteWordByJongsung(name,"을","를");
String name2=KoreanUtil.getComleteWordByJongsung(name,"이","가");
String name3=KoreanUtil.getComleteWordByJongsung(name,"은","는");


어때요?

한글이 가지고 있는 매력덕분에 유니코드도 공부하고 깔끔한 문장도 만들수 있게 되셨죠?



이 방법을 사용하셔서 이(가), 은(는) 같은 문장보다는 좀더 깔끔한 문장으로 사용자에게 서비스를 제공하셨으면 좋겠습니다.

감사합니다.

3 Comments
  • BlogIcon 나모찾기 2017.05.04 14:49 신고 앞의 단어가 한글로 끝날 경우에는 받침여부만 확인하면 되지만 영어나 숫자가 오는 경우라면 어떻게 처리해야 할까요?

    KoreanUtil.getComleteWordByJongsung("한미 FTA","을","를");
    의 결과가 "한미 FTA를"이 되어야 할 것 같은데,
    메소드의 결과는 "한미 FTA"만 덜렁 나오게 되니 실제 코드로 적용하기는 어려울 것 같네요.

    http://blog.naver.com/blue8943/220173252481
  • BlogIcon 허늬 2017.11.01 10:01 신고 전 알파벳은 일단 무시하기로 했고, 숫자인 경우에는 1, 3, 6, 7, 8, 0은 받침 있는 문자로, 그 외에는 받침 없는 문자로 처리하는 코드를 넣어서 해결했습니다.
  • BlogIcon 허늬 2017.11.01 10:02 신고 참고로 위 예제 함수로는 '으로'에 대한 처리가 불완전하더라구요. '으로/로'의 구분에 있어서, 기본적으로는 '을/를', '은/는', '이/가'와
    거의 동일하지만, 종성이 ㄹ로 오는 경우에는 '으로'가 아닌 '로'를 붙여야 합니다.
댓글쓰기 폼