1. 개요

Java 표준 라이브러리는 문자열의 모든 문자를 대문자로 변환할 수 있는 String.toUpperCase() 메서드를 제공합니다.

이 예제에서는 주어진 문자열의 첫 번째 문자를 대문자로만 변환하는 방법을 배웁니다.

2. 문제 소개

예를 들어 이 문제를 빠르게 설명할 수 있습니다. 입력 문자열이 있다고 가정해 보겠습니다.

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

이 INPUT 문자열 이 주어지면 예상 결과는 다음과 같습니다.

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

보시다시피 첫 번째 문자 ' h '만 ' H ' 로 변경 되기를 원합니다 . 그러나 나머지 문자는 수정하면 안 됩니다.

물론 입력 문자열이 비어 있으면 결과도 빈 문자열이어야 합니다.

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

이 예제에서는 문제에 대한 몇 가지 솔루션을 다룰 것입니다. 단순화를 위해 단위 테스트 어설션을 사용하여 솔루션이 예상대로 작동하는지 확인합니다.

3. substring() 메서드 사용

문제를 해결하는 첫 번째 아이디어는 입력 문자열을 두 개의 하위 문자열로 나누는 것입니다. 예를 들어, INPUT 문자열을 " h "와 " i there, Nice ... 로 분할할 수 있습니다 . ". 즉, 첫 번째 부분 문자열에는 첫 번째 문자만 포함되고 다른 부분 문자열에는 문자열의 나머지 문자가 포함됩니다.

그런 다음 첫 번째 부분 문자열에 toUpperCase() 메서드를 적용하고 두 번째 부분 문자열을 연결하여 문제를 해결할 수 있습니다 .

Java의 String 클래스의 substring() 메서드는 두 개의 하위 문자열을 얻는 데 도움이 될 수 있습니다.

  • INPUT.substring(0, 1) – 첫 번째 문자를 포함하는 부분 문자열 1
  • INPUT.substring(1) – 나머지 문자를 포함하는 부분 문자열 2

이제 솔루션이 작동하는지 테스트를 작성해 보겠습니다.

String output = INPUT.substring(0, 1).toUpperCase() + INPUT.substring(1);
assertEquals(EXPECTED, output);

테스트를 실행하면 통과합니다. 그러나 입력이 빈 문자열인 경우 이 접근 방식은 IndexOutOfBoundsException 을 발생 시킵니다. 이는 INPUT.substring(1) 을 호출할 때 end-index( 1 )가 빈 문자열의 길이( 0 ) 보다 크기 때문입니다 .

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

또한 입력 문자열이 null 인 경우 이 접근 방식은 NullPointerException 을 throw 합니다.

따라서 부분 문자열 접근 방식을 사용하기 전에 입력 문자열이 null 또는 비어 있지 않은지 확인하고 확인해야 합니다 .

4. Matcher.replaceAll() 메서드 사용

문제를 해결하기 위한 또 다른 아이디어는 정규식 (" ^. ")을 사용하여 첫 번째 문자를 일치시키고 일치된 그룹을 대문자로 변환하는 것입니다.

Java 9 이전에는 쉬운 작업이 아니었습니다. 이는 replaceAll()replaceFirst( )와 같은 Matcher 의 대체 메소드 가 Function 객체 또는 람다 표현식 대체 자를 지원하지 않기 때문 입니다. 그러나 이것은 Java 9에서 변경되었습니다.

Java 9부터 Matcher 의 대체 메소드 는 대체자로 Function 객체를 지원합니다. 즉, 일치하는 문자 시퀀스를 처리하고 대체를 수행하는 함수를 사용할 수 있습니다. 물론 문제를 해결 하려면 일치하는 문자에 대해 toUpperCase() 메서드를 호출하기만 하면 됩니다.

String output = Pattern.compile("^.").matcher(INPUT).replaceFirst(m -> m.group().toUpperCase());
assertEquals(EXPECTED, output);

실행하면 테스트가 통과합니다.

정규식이 일치하지 않으면 교체가 발생하지 않습니다. 따라서 이 솔루션은 빈 입력 문자열 에서도 작동합니다.

String emptyOutput = Pattern.compile("^.").matcher(EMPTY_INPUT).replaceFirst(m -> m.group().toUpperCase());
assertEquals(EMPTY_EXPECTED, emptyOutput);

입력 문자열이 null 이면 이 솔루션 에서도 NullPointerException 이 발생한다는 점을 언급할 가치가 있습니다. 따라서 사용하기 전에 null 검사 를 수행해야 합니다.

5. Apache Commons Lang 3에서 StringUtils 사용하기

Apache Commons Lang3 는 인기 있는 라이브러리입니다. 많은 편리한 유틸리티 클래스와 함께 제공되며 표준 Java 라이브러리의 기능을 확장합니다.

그것의 StringUtils 클래스는 우리의 문제를 직접적으로 해결 하는 capitalize() 메소드를 제공합니다.

라이브러리를 사용하려면 먼저 Maven 의존성 을 추가합니다 .

<dependency>
    <groupId>org.apache.commons</groupId>
    <artifactId>commons-lang3</artifactId>
    <version>3.12.0</version>
</dependency>

그런 다음 평소와 같이 작동 방식을 확인하기 위해 테스트를 생성해 보겠습니다.

String output = StringUtils.capitalize(INPUT);
assertEquals(EXPECTED, output);

테스트를 실행하면 통과합니다. 보시다시피, 단순히 StringUtils.capitalize(INPUT)를 호출합니다. 그러면 도서관이 우리를 대신해 일을 합니다.

StringUtils.capitalize() 메서드는 null-safe하고 빈 입력 문자열에서도 작동 한다는 점을 언급할 가치가 있습니다 .

String emptyOutput = StringUtils.capitalize(EMPTY_INPUT);
assertEquals(EMPTY_EXPECTED, emptyOutput);
String nullOutput = StringUtils.capitalize(null);
assertNull(nullOutput);

6. 결론

이 기사에서는 주어진 문자열의 첫 번째 문자를 대문자로 변환하는 방법을 배웠습니다.

항상 그렇듯이 기사에 사용된 전체 코드는 GitHub에서 사용할 수 있습니다 .

Generic footer banner