Adventure Time - Finn 3
본문 바로가기
프론트

JavaScript 한국어 조사 자동 선택 함수

by hyun9_9 2026. 2. 10.

한국어는 받침 유무에 따라 조사가 달라지는 교착어입니다. 프로그래밍에서 한국어 텍스트를 다룰 때 조사를 자동으로 선택하는 함수가 필요합니다. 이번 포스트에서는 krParticle 함수를 소개합니다.

krParticle - 한국어 조사 자동 선택

krParticle 함수는 단어의 받침 유무를 판단하여 적절한 조사를 자동으로 선택합니다.

const krParticle = (str, particle) => {
	const last_char = str[str.length-1];
  const is_under = (last_char.charCodeAt(0) - 0xAC00) % 28 != 0;
	switch(particle) {
		case '은':
		case '는':
			return is_under ? '은' : '는';
		case '이':
		case '가':
			return is_under ? '이' : '가';
		case '을':
		case '를':
			return is_under ? '을' : '를';
		case '와':
		case '과':
			return is_under ? '과' : '와';
		case '로':
		case '으로':
			return is_under ? '으로' : '로';
		default:
			return particle;
	}
}

기본 원리

한국어에서:

  • 받침이 있으면: "은", "이", "을", "과", "으로" 사용
  • 받침이 없으면: "는", "가", "를", "와", "로" 사용

예시:

  • "사과" (받침 없음) → "사과", "사과", "사과"
  • "책" (받침 있음) → "책", "책", "책"

기본 사용법

// 은/는
krParticle('사과', '은/는'); 
// "는" (받침 없음)

krParticle('책', '은/는'); 
// "은" (받침 있음)

// 이/가
krParticle('사과', '이/가'); 
// "가"

krParticle('책', '이/가'); 
// "이"

// 을/를
krParticle('사과', '을/를'); 
// "를"

krParticle('책', '을/를'); 
// "을"

// 와/과
krParticle('학교', '와/과'); 
// "와" (받침 없음)

krParticle('도서관', '와/과'); 
// "과" (받침 있음)

// 로/으로
krParticle('집', '로/으로'); 
// "으로" (받침 있음)

krParticle('학교', '로/으로'); 
// "로" (받침 없음)

실전 활용 예시

1. 동적 메시지 생성

// 사용자 이름에 맞는 조사 선택
const userName = '홍길동';
const particle = krParticle(userName, '이/가');
const message = `${userName}${particle} 로그인했습니다.`;
// "홍길동이 로그인했습니다."

const userName2 = '김철수';
const particle2 = krParticle(userName2, '이/가');
const message2 = `${userName2}${particle2} 로그인했습니다.`;
// "김철수가 로그인했습니다."

2. 알림 메시지 생성

const createNotification = (itemName, action) => {
  const particle = krParticle(itemName, '이/가');
  return `${itemName}${particle} ${action}되었습니다.`;
};

createNotification('주문', '완료');
// "주문이 완료되었습니다."

createNotification('상품', '등록');
// "상품이 등록되었습니다."

createNotification('사과', '삭제');
// "사과가 삭제되었습니다."

3. 문장 자동 생성

const generateSentence = (subject, verb) => {
  const particle = krParticle(subject, '이/가');
  return `${subject}${particle} ${verb}.`;
};

generateSentence('사과', '맛있다');
// "사과가 맛있다."

generateSentence('책', '재미있다');
// "책이 재미있다."

4. 다중 조사 처리

const createComplexMessage = (item) => {
  const particle1 = krParticle(item, '이/가');
  const particle2 = krParticle(item, '을/를');
  return `${item}${particle1} 선택되었고, ${item}${particle2} 장바구니에 추가되었습니다.`;
};

createComplexMessage('사과');
// "사과가 선택되었고, 사과를 장바구니에 추가되었습니다."

createComplexMessage('책');
// "책이 선택되었고, 책을 장바구니에 추가되었습니다."

5. 그리드 셀 포맷터

// 그리드에서 상품명과 조사 조합
{
  name: 'product_name',
  formatter: ({value, row}) => {
    const particle = krParticle(value, '이/가');
    return `${value}${particle} 재고가 부족합니다.`;
  }
}

6. 검색 결과 메시지

const formatSearchResult = (keyword, count) => {
  const particle = krParticle(keyword, '을/를');
  return `"${keyword}"${particle} 검색한 결과 ${count}개가 발견되었습니다.`;
};

formatSearchResult('사과', 5);
// ""사과"를 검색한 결과 5개가 발견되었습니다."

formatSearchResult('책', 3);
// ""책"을 검색한 결과 3개가 발견되었습니다."

7. 에러 메시지

const createErrorMessage = (itemName) => {
  const particle = krParticle(itemName, '이/가');
  return `${itemName}${particle} 존재하지 않습니다.`;
};

createErrorMessage('사용자');
// "사용자가 존재하지 않습니다."

createErrorMessage('파일');
// "파일이 존재하지 않습니다."

고급 활용 패턴

1. 조사 선택 헬퍼 함수

const withParticle = (word, particleType) => {
  return word + krParticle(word, particleType);
};

withParticle('사과', '이/가');
// "사과가"

withParticle('책', '이/가');
// "책이"

2. 문장 템플릿

const sentenceTemplates = {
  login: (name) => {
    const particle = krParticle(name, '이/가');
    return `${name}${particle} 로그인했습니다.`;
  },
  delete: (item) => {
    const particle = krParticle(item, '을/를');
    return `${item}${particle} 삭제하시겠습니까?`;
  },
  success: (item) => {
    const particle = krParticle(item, '이/가');
    return `${item}${particle} 성공적으로 처리되었습니다.`;
  }
};

sentenceTemplates.login('홍길동');
// "홍길동이 로그인했습니다."

sentenceTemplates.delete('파일');
// "파일을 삭제하시겠습니까?"

3. 다국어 지원 확장

const getParticle = (word, particleType, language = 'ko') => {
  if (language === 'ko') {
    return krParticle(word, particleType);
  }
  // 다른 언어는 조사가 없으므로 빈 문자열 반환
  return '';
};

const createMessage = (word, action, lang = 'ko') => {
  const particle = getParticle(word, '이/가', lang);
  return lang === 'ko' 
    ? `${word}${particle} ${action}되었습니다.`
    : `${word} has been ${action}.`;
};

주의사항

1. 복합어 처리

// 복합어는 마지막 글자 기준
krParticle('사과나무', '이/가');
// "가" (마지막 글자 "무"는 받침 없음)

krParticle('책장', '이/가');
// "이" (마지막 글자 "장"은 받침 있음)

2. 숫자나 영문 처리

// 숫자나 영문은 받침이 없다고 간주
krParticle('123', '이/가');
// "가"

krParticle('ABC', '이/가');
// "가"

마무리

krParticle 함수를 활용하면 한국어 애플리케이션에서 자연스러운 문장을 자동으로 생성할 수 있습니다. 특히 사용자에게 보여주는 메시지, 알림, 에러 메시지 등에서 매우 유용합니다.

'프론트' 카테고리의 다른 글

TypeScript 기초 타입 정리  (0) 2026.04.11
타입스크립트를 사용하는 이유  (0) 2026.04.11
JavaScript 유틸리티 함수 - deepClone  (0) 2026.02.09
JavaScript 숫자 포맷팅  (0) 2026.02.06
JavaScript 날짜/시간 처리 함수  (0) 2026.02.06