Convert Camel Case to Snake Case in Java
1. 개요
카멜 케이스(Camel Case)와 스네이크 케이스(Snake Case)는 프로그래밍에서 자주 사용되는 두 가지 명명 규칙입니다. 카멜 케이스는 새 단어의 시작을 나타내기 위해 대문자를 사용하며 (camelCaseExample), 스네이크 케이스는 단어 사이를 언더스코어로 구분합니다 (snakecaseexample).
이 튜토리얼에서는 자바에서 이러한 변환을 구현하는 방법을 살펴보겠습니다.
2. 변환 이해하기
카멜 케이스 문자열을 스네이크 케이스 문자열로 변환할 때, 우리는 다음을 수행해야 합니다:
- 단어 사이의 경계를 식별하기
- 각 경계에 언더스코어(
*_
) 삽입하기 - 모든 문자를 소문자로 만들기
예를 들어:
- 입력: “convertCamelCase”
- 출력: “convertcamelcase”
이와 관련하여, 이 변환을 달성하는 방법을 살펴보겠습니다.
3. 수동 접근법 사용하기
가장 간단한 방법은 문자열의 문자를 반복하며 대문자를 만나면 언더스코어를 추가하는 것입니다:
public¨NBSP;static String convertCamelCaseToSnake(String input) {
StringBuilder result = new StringBuilder();
for (char c : input.toCharArray()) {
if (Character.isUpperCase(c)) {
result.append("_").append(Character.toLowerCase(c));
} else {
result.append(c);
}
}
return result.toString();
}
이 메서드에서 우리가 하는 작업을 살펴보겠습니다:
- 문자열의 각 문자를 반복하기
- 대문자가 나타날 때, 언더스코어를 추가하고 소문자로 변환하기
- 다른 모든 문자는 직접 추가하기
마지막으로, 우리의 구현을 테스트해 보겠습니다:
@Test
public void whenConvertNormalCamelCase_thenGetCorrectSnakeCase() {
String input = "convertCamelCase";
String expected = "convert_camel_case";
Assertions.assertEquals(expected, CamelToSnakeCaseConverter.convertCamelCaseToSnake(input));
}
@Test
public void whenConvertNotNormalCamelCase_thenGetCorrectSnakeCase() {
String input = "convertCCamelCase";
String expected = "convert_c_camel_case";
Assertions.assertEquals(expected, CamelToSnakeCaseConverter.convertCamelCaseToSnake(input));
}
@Test
public void whenConvertAlreadySnakeCase_thenGetUnchangedSnakeCase() {
String input = "snake_case";
String expected = "snake_case";
Assertions.assertEquals(expected, CamelToSnakeCaseConverter.convertCamelCaseToSnake(input));
}
@Test
public void whenConvertAllLowerCaseString_thenGetUnchangedString() {
String input = "snakecase";
String expected = "snakecase";
Assertions.assertEquals(expected, CamelToSnakeCaseConverter.convertCamelCaseToSnake(input));
}
@Test
public void whenConvertOtherEdgeCases_thenGetCorrectSnakeCases() {
// 빈 문자열
Assertions.assertEquals("", CamelToSnakeCaseConverter.convertCamelCaseToSnake(""));
// 특수 문자
String input = "sn@keCase#";
String expected = "sn@ke_case#";
Assertions.assertEquals(expected, CamelToSnakeCaseConverter.convertCamelCaseToSnake(input));
}
4. 정규 표현식 사용하기
또한, 정규 표현식은 대문자에 대한 패턴을 정의하고 이를 교체함으로써 작업을 간소화합니다:
public static String convertCamelCaseToSnakeRegex(String input) {
return input
.replaceAll("([A-Z])(?=[A-Z])", "$1_")
.replaceAll("([a-z])([A-Z])", "$1_$2")
.toLowerCase();
}
작동 방식은 다음과 같습니다:
replaceAll("([A-Z])(?=[A-Z])", "$1_")
메서드는 인접한 대문자 사이에 언더스코어를 추가합니다.replaceAll("([a-z])([A-Z])", "$1_$2")
메서드는 소문자 뒤에 오는 대문자 앞에 언더스코어를 추가합니다.- 마지막으로, 전체 결과를 소문자로 변환합니다.
이 방법을 검증해 보겠습니다:
@Test
public void whenConvertNormalCamelCase_thenGetCorrectSnakeCase() {
String input = "convertCamelCase";
String expected = "convert_camel_case";
Assertions.assertEquals(expected, CamelToSnakeCaseConverter.convertCamelCaseToSnakeRegex(input));
}
@Test
public void whenConvertNotNormalCamelCase_thenGetCorrectSnakeCase() {
String input = "convertCCamelCase";
String expected = "convert_c_camel_case";
Assertions.assertEquals(expected, CamelToSnakeCaseConverter.convertCamelCaseToSnakeRegex(input));
}
@Test
public void whenConvertAlreadySnakeCase_thenGetUnchangedSnakeCase() {
String input = "snake_case";
String expected = "snake_case";
Assertions.assertEquals(expected, CamelToSnakeCaseConverter.convertCamelCaseToSnakeRegex(input));
}
@Test
public void whenConvertAllLowerCaseString_thenGetUnchangedString() {
String input = "snakecase";
String expected = "snakecase";
Assertions.assertEquals(expected, CamelToSnakeCaseConverter.convertCamelCaseToSnakeRegex(input));
}
@Test
public void whenConvertOtherEdgeCases_thenGetCorrectSnakeCases() {
// 빈 문자열
Assertions.assertEquals("", CamelToSnakeCaseConverter.convertCamelCaseToSnakeRegex(""));
// 특수 문자
String input = "sn@keCase#";
String expected = "sn@ke_case#";
Assertions.assertEquals(expected, CamelToSnakeCaseConverter.convertCamelCaseToSnakeRegex(input));
}
5. 엣지 케이스 처리
카멜 케이스 문자열을 스네이크 케이스로 변환할 때는 다음과 같은 다양한 엣지 케이스를 처리하는 것이 중요합니다:
- 빈 문자열: 함수가 빈 문자열을 반환하는지 확인
- 모든 소문자 문자열: 입력은 변하지 않아야 함
- 이미 스네이크 케이스인 문자열: 함수가 이러한 문자열을 변경하지 않도록 확인
- 특수 문자: 변경되지 않아야 함
6. 결론
결론적으로, 우리는 자바에서 카멜 케이스를 스네이크 케이스로 변환하는 두 가지 접근 방식을 탐구했습니다: 반복을 사용한 수동 접근법과 정규 표현식을 활용한 간결한 방법.
이 튜토리얼의 예제 코드는 GitHub에서 확인할 수 있습니다.