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

첫 문자를 대문자로 바꾸는 방법(Capitalize the First Letter of a String in Java)

by ms727 2025. 2. 6.

원본 글: https://www.baeldung.com/java-string-uppercase-first-letter

Java 표준 라이브러리에서 문자열의 모든 값에 대하여 대문자로 바꿔주는 String.toUpperCase() 함수를 제공합니다.

이 글에서는 문자열의 첫 문자만 대문자로 바꾸는지에 대한 여러 방법을 논의합니다.

1. Introduction to the Problem

예를 들어서 다음과 같은 문제를 빠르게 해결할 수 있습니다.

String INPUT = "hi there, Nice to Meet You!";

이 값이 입력으로 주어지면 다음과 같은 기댓값을 얻을 수 있을겁니다.

String EXPECTED = "Hi there, Nice to Meet You!";

첫 문자만 대문자로 바뀌었습니다. 나머지 문자들은 수정되면 안됩니다.
그리고, 빈 문자열이 들어왔을때의 기댓값도 빈 문자열이어야합니다.

String EMPTY_INPUT = "";
String EMPTY_EXPECTED = "";

2. Using the substring() Method

첫 번째 아이디어는 입력값을 두 개의 문자열로 분리합니다. 첫 문자와 나머지 문자로 분리하는겁니다.
그러면 첫 문자를 담은 문자열에 대해 toUpperCase() 함수를 적용하고 분리된 두 문자열을 다시 이어서 주어졌던 문제를 해결할 수 있습니다.

    private final String INPUT = "hi there, Nice to Meet You!";

    private final String EXPECTED = "Hi there, Nice to Meet You!";
    @Test
    public void substring_concatenate_test() {
        String output = INPUT.substring(0,1).toUpperCase() + INPUT.substring(1);

        Assertions.assertEquals(EXPECTED, output);
    }

이 케이스에서는 테스트가 성공하지만 빈 문자열로 들어온 경우 IndexOutOfBoundsException 에러를 발생할겁니다.
왜냐하면 INPUT.substring(1)에서 빈 문자열은 문자열의 길이가 '0'이기에 파라미터로 주어진 '1'에 근접할 수 없기 때문입니다.

Assertions.assertThrows(IndexOutOfBoundsException.class, () -> "".substring(1));

마찬가지로 null이 입력으로 들어온 경우에 대해서는 NullPointerException 에러가 발생할 겁니다.
그러므로 이 방법을 사용할때는 null과 빈문자열 검증 로직을 앞에 추가해줘야합니다.

3. Using the Matcher.replaceAll() Method

다른 방법으로는 정규표현식을 통해서 첫 번째 문자를 바꾸는겁니다.

replaceAll(), replaceFirst()같은 함수가 람다표현식이나 함수형을 지원하지 않아서 Java9 이전 버전에는 제공되지 않는 방법입니다.
람다 등을 통해서 첫 문자를 가져와서 toUpperCase() 함수를 통해서 대문자로 만들 예정입니다.

    @Test
    public void regex_capitalize_test() {
        String output = Pattern.compile("^.").matcher(INPUT).replaceFirst(m -> m.group().toUpperCase());
        String emptyOutput = Pattern.compile("^.").matcher("").replaceFirst(m -> m.group().toUpperCase());

        Assertions.assertEquals(EXPECTED, output);
        Assertions.assertEquals("", emptyOutput);
    }

이 방식은 빈 문자열에도 잘 동작합니다만 null에 대한 처리가 미흡합니다. 때문에 이 또한 null 검증을 추가로 작성해줘야합니다.

4. Using StringUtils From Apache Commons Lang3

Apache Commons Lang3 라이브러리에서 제공하는 capitalize() 함수를 통해 문제를 해결할 수 있습니다.

테스트를 위해 관련 의존성을 추가해줍니다.

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

이후 테스트를 작성합니다.

    @Test
    public void apache_common_capitalize_test() {
        String output = StringUtils.capitalize(INPUT);

        Assertions.assertEquals(EXPECTED, output);
    }

굉장히 간단하게 테스트가 가능합니다.
또한 이 라이브러리가 제공하는 함수는 null-safe하게 동작하고 빈 문자열에서도 잘 동작하는 이점이 있습니다

    @Test
    public void apache_common_capitalize_test() {
        String output = StringUtils.capitalize(INPUT);
        String emptyOutput = StringUtils.capitalize("");
        String nullOutput = StringUtils.capitalize(null);

        Assertions.assertEquals(EXPECTED, output);
        Assertions.assertEquals("", emptyOutput);
        Assertions.assertNull(nullOutput);
    }

5. 결론

이 글을 통해 첫번째 문자를 어떻게 대문자로 변경할 것인가에 대한 논의를 진행하였습니다.


개인적으로 글을 쓰면서 Apache Common 이 제공하는 Null-safe, 빈문자열에 대한 처리가 유용하여 이것들을 사용할 것 같지만..
기본 라이브러리만 주어지는 상황에서는 람다표현식을 사용하지 않을까합니다.