원본 글: 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, 빈문자열에 대한 처리가 유용하여 이것들을 사용할 것 같지만..
기본 라이브러리만 주어지는 상황에서는 람다표현식을 사용하지 않을까합니다.
'Baeldung번역&공부 > Java-string' 카테고리의 다른 글
문자열 리스트를 문자열로 바꾸는 방법(Convert a Comma Separated String to a List in Java) (0) | 2025.02.09 |
---|---|
공백을 지우는 여러 방법들(Remove Whitespace From a String in Java) (0) | 2025.02.07 |
날짜 검증하는 여러 방법(Check If a String Is a Valid Date in Java) (0) | 2025.02.05 |
Java에서 문자를 숫자로 치환하는 여러 방법(Check If a String Is Numeric in Java) (0) | 2025.02.05 |
문자열 분리방법(Split a String in Java) (0) | 2025.02.02 |