본문 바로가기

[JavaScript] 자바스크립트에서 한글 조사(-이/-가, -을/-를, -은/-는, -와/-과) 구분하기

코딩 중 앞에 오는 단어에 맞는 조사(-이/-가, -을/-를 등)를 텍스트로 나타내는 작업이 필요해서 알아보다가 공부한 내용을 정리해서 포스팅해본다.

 

코드 구현에 앞서 먼저 조사들이 어떤 기준으로 구분되는 지를 알아보자.

 

📖 구분 기준 

직관적으로 쉽게 구분이 가능한데, 

앞 음절에 받침이 있으면 '-이/-을/-은/-과',

받침이 없고 모음으로 끝나면 '-가/-를/-는/-와'가 된다. 

 

예1) 귤 맛있다. / 귤 맛있다. 

예2) 사과 맛있다. / 사과 맛있다.

 

📖 자바스크립트에서의 한글

자바스크립트에서 한글을 구분하는 방법 중에서, 여기서는 유니코드를 통한 구분법을 사용한다. 

한글에 해당하는 유니코드표를 확인해보면 다음과 같다.

가  각  갂  갃  간  갅  갆  갇  갈  갉  갊  갋  갌  갍  갎  갏 감  갑  값  갓  갔  강  갖  갗  갘  같  갚  갛

개  객  갞  갟 갠  갡  갢  갣  갤  갥  갦  갧  갨  갩  갪  갫  갬  갭  갮  갯  갰  갱  갲  갳  갴  갵  갶  갷

갸  갹  갺  갻  갼  갽  갾  갿 걀  걁  걂  걃  걄  걅  걆  걇  걈  걉  걊  걋  걌  걍  걎  걏  걐  걑  걒  걓

걔  걕  걖  걗  걘  걙  걚  걛  걜  걝  걞  걟 걠  걡  걢  걣  걤  걥  걦  걧  걨  걩  걪  걫  걬  걭  걮  걯

....

 

이렇게 쭉 나열해서 보면 받침이 없는 글자부터 시작해, 모든 받침을 한번씩 순회하고 28번만에 받침이 없는 다음 모음 글자로 돌아돈다. 즉, 구하려는 현재 글자값에서 한글이 시작되는 부분을 뺀 후, 이를 28로 나누어 그 나머지를 보면 받침이 있는지 없는지, 그리고 있다면 어느 받침을 가졌는지도 파악할 수 있다. 

 

자바스크립트에서 charCodeAt()을 통해 한글의 유니코드 값을 찾을 수 있는데, 이는 유니코드 중에서도 UTF-16 방식을 사용한다. UTF-16에서 한글의 범위는 [ AC00 ~ D7AF ] 이다. 

시작값인 AC00을 10진수 숫자로 계산해보면 (16^3)*10+(16^2)*12+16*0+0 = 44032 가 나온다.

 

이제 이걸 코드로 정리해보자. 

 

📖 코드 구현

아래 코드는 입력값 name의 다음으로 올 조사를 '을'과 '를' 중에 해당하는 것을 name과 함께 반환하는 함수를 나타낸 코드이다. 

function checkName(name){
    //name의 마지막 음절의 유니코드(UTF-16) 
    const charCode = name.charCodeAt(name.length - 1);
    
    //유니코드의 한글 범위 내에서 해당 코드의 받침 확인
    const consonantCode = (charCode - 44032) % 28;
    
    if(consonantCode === 0){
        //0이면 받침 없음 -> 를
        return `${name}를`;
    }
    //1이상이면 받침 있음 -> 을
    return `${name}을`;
}

charCodeAt()에 대해선 여기에서 확인할 수 있다. 

 


참고 사이트

UTF-16 https://ko.wikipedia.org/wiki/UTF-16

유니코드표 http://titus.uni-frankfurt.de/unicode/unitestx.htm

코드 http://yoonbumtae.com/?p=3677