Convert Camel Case to Snake Case in Java

1. 개요

카멜 케이스(Camel Case)와 스네이크 케이스(Snake Case)는 프로그래밍에서 자주 사용되는 두 가지 명명 규칙입니다. 카멜 케이스는 새 단어의 시작을 나타내기 위해 대문자를 사용하며 (camelCaseExample), 스네이크 케이스는 단어 사이를 언더스코어로 구분합니다 (snakecaseexample).

이 튜토리얼에서는 자바에서 이러한 변환을 구현하는 방법을 살펴보겠습니다.

2. 변환 이해하기

카멜 케이스 문자열을 스네이크 케이스 문자열로 변환할 때, 우리는 다음을 수행해야 합니다:

  • 단어 사이의 경계를 식별하기
  • 각 경계에 언더스코어(*_) 삽입하기
  • 모든 문자를 소문자로 만들기

예를 들어:

  • 입력: “convertCamelCase”
  • 출력: “convertcamelcase”

이와 관련하여, 이 변환을 달성하는 방법을 살펴보겠습니다.

freestar

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에서 확인할 수 있습니다.

원본 출처

You may also like...

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다