박상권의 삽질블로그

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

IT/Android-TIP (한글)

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

박상권 2016. 8. 4. 18:19

안드로이드 개발자들이 모여있는 오픈채팅방에 참여해보세요 .
Q&A 및 팁을 공유하는 방입니다..
오픈채팅방 참여


블로그를 Medium으로 옮겨서 운영하고 있습니다.
앞으로 새로운 글은 모두 미디엄 블로그를 통해서 올릴 예정입니다.
미디엄에서 다양하고 유익한 포스팅을 살펴보세요
미디엄 블로그 보기


이번에 '클린 아키텍처'를 주제로 온라인 강의를 개설하게 되었습니다 🎉
평소 오픈채팅방이나 여러 커뮤니티에서 '클린 아키텍처'와 관련된 질문들이 많았는데요. 이를 해결해줄 수 있는 마땅한 강의가 없었던것 같습니다.
평소 '클린 아키텍처' 에 대한 궁금증이나 관심이 있으셨던 분들이 수강해보시면 도움이 될것 같아요
강의 살펴보기


안드로이드뿐만아니라 아이폰,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,"은","는");


어때요?

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



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

감사합니다.

Comments