본문 바로가기
Baeldung번역&공부/Java-string

문자열에서 문자세는 여러 방법(Count Occurrences of a Char in a String)

by ms727 2025. 2. 13.

원본 글: https://www.baeldung.com/java-count-chars

String 문자열안에 존재하는 특정 문자의 숫자 갯수를 셀 방법은 많습니다.

이 글에서는 해당 방법을 다룹니다.

1. Using Core Java Lib

1.1 Imperative Approach

일부 개발자들은 Java API만을 사용하는 방식을 선호합니다.
간단하게 접근이 가능합니다.

    @Test
    public void java_core_simple_test() {
        String someString = "elephant";
        char someChar = 'e';
        int count = 0;

        for(int i = 0; i< someString.length(); ++i) {
            if(someString.charAt(i) == someChar) {
                count++;
            }
        }

        Assertions.assertEquals(2, count);
    }

1.2 Using Recursion

위보다는 직관적이지 않지만 재귀를 사용해서 확인할 수도 있습니다.

    @Test
    public void recursion_test() {
        String someString = "elephant";
        char someChar = 'e';
        int count = 0;


        Assertions.assertEquals(2, useRecursion(someString, someChar, count));
    }

1.3 Using Regular Expressions

정규 표현식으로도 가능합니다.

    @Test
    public void recursion_test() {
        String someString = "elephant";
        char someChar = 'e';
        int count = 0;


        Assertions.assertEquals(2, useRecursion(someString, someChar, count));
    }

여러 케이스에 대응하기엔 정규표현식은 복잡하게 작성할 수도 있을 것 같습니다. 딱히 좋은 방법은 아닐 수 있습니다.

1.4 Using Java8 Features

Java8에서는 이 문제를 해결하기 위한 여러 솔루션들이 있습니다.

    @Test
    public void java8_above_test() {
        String someString = "elephant";
        long count = someString.chars().filter(ch -> ch == 'e').count();
        Assertions.assertEquals(2, count);

        long count2 = someString.codePoints().filter(ch -> ch == 'e').count();
        Assertions.assertEquals(2, count2);
    }

이 방식은 깨끗하게 작성되어 좀 더 읽기 편합니다.

2. Using External Libraries

외부 라이브러리릍 통해 문제를 해결하는 방법을 알아봅니다.

2.1 Using StringUtils

Apache Common Lang3에 있는 StringUtils클래스를 사용해서 문제를 해결할 수 있습니다. 해당 클래스에서는 countMatches()함수를 제공하는데 이 함수는 기존 함수와 다르게 문자열에 대한 카운팅도 가능합니다.

implementation 'org.apache.commons:commons-lang3:3.17.0'

의존성을 추가해준 뒤, 예제를 작성합니다.

    @Test
    public void apache_common_test() {
        int count = StringUtils.countMatches("elephant", "e");

        Assertions.assertEquals(2, count);
    }

2.2 Using Guava

guava 라이브러리를 통해서도 가능합니다.

testImplementation 'com.google.guava:guava:32.1.3-jre'

의존성을 추가해준 뒤, 마찬가지로 테스트 코드를 작성해봅니다.

    @Test
    public void guava_test() {
        int count = CharMatcher.is('e').countIn("elephant");

        Assertions.assertEquals(2, count);
    }

2.3 Using Spring

Spring 프레임워크에서 제공하는 함수를 통해서 문제를 해결할 수 있습니다.
근데 이 문제를 해결하고자 Spring Framework 의존성을 추가하는건 추천하지 않습니다. 이미 존재하는 경우에 대해서 다룹니다.

    @Test
    public void spring_test() {
        int count = StringUtils.countOccurrencesOf("elephant", "e");

        Assertions.assertEquals(2, count);
    }

3. 결론

문자열에서 특정 문자의 갯수를 세는 여러 방법에 대해 확인하였습니다.

블로그 주인장 생각

저는 외부라이브러리를 쓴다면 Apache Common Lang3을 사용하고 Core로만 개발해야한다면 Stream을 이용한 방식을 사용할 것 같습니다.

개인적으로 guava는 확 와닿지 않네요.

예제: https://github.com/kkminseok/baeldung-test/blob/main/Java-String/src/test/java/manipulations/advance/CountCharTest.java