1. 소개

이전 사용방법(예제)에서는 모든 Java 버전에서 여러 줄 문자열 을 사용하는 방법을 살펴보았습니다 .

이 사용방법(예제)에서는 Java 15 텍스트 블록 기능 을 사용하여 여러 줄 문자열을 가장 효율적으로 선언하는 방법을 자세히 살펴보겠습니다.

2. 사용법

Java 15부터 텍스트 블록을 표준 기능으로 사용할 수 있습니다. Java 13 및 14에서는 이를 미리 보기 기능 으로 활성화해야 했습니다 .

텍스트 블록은 """ (큰따옴표 3개)로 시작하고 그 뒤에 선택적 공백과 줄 바꿈이 옵니다. 가장 간단한 예는 다음과 같습니다.

String example = """
     Example text""";

텍스트 블록의 결과 유형은 여전히 ​​String 입니다. 텍스트 블록은 소스 코드에서 문자열 리터럴을 작성하는 또 다른 방법을 제공합니다.

텍스트 블록 내에서 줄 바꿈을 이스케이프할 필요 없이 줄 바꿈과 따옴표를 자유롭게 사용할 수 있습니다 . 이를 통해 HTML, JSON, SQL 또는 우리가 필요로 하는 모든 것의 리터럴 조각을 더 우아하고 읽기 쉬운 방식으로 포함할 수 있습니다.

결과 문자열  에는 (기본) 들여쓰기와 첫 줄 바꿈이 포함되지 않습니다. 다음 섹션에서 들여쓰기 처리에 대해 살펴보겠습니다.

3. 들여쓰기

다행스럽게도 텍스트 블록을 사용할 때 코드를 적절하게 들여쓰기할 수 있습니다 . 이를 달성하기 위해 들여쓰기의 일부는 소스 코드로 처리되는 반면 들여쓰기의 다른 일부는 텍스트 블록의 일부로 표시됩니다. 이 작업을 수행하기 위해 컴파일러는 비어 있지 않은 모든 행에서 최소 들여쓰기를 확인합니다. 다음으로 컴파일러는 전체 텍스트 블록을 왼쪽으로 이동합니다.

일부 HTML을 포함하는 텍스트 블록을 고려하십시오.

public String getBlockOfHtml() {
    return """
            <html>

                <body>
                    <span>example text</span>
                </body>
            </html>""";
}

이 경우 최소 들여쓰기는 12칸입니다. 따라서 <html> 왼쪽 과 모든 후속 줄에 있는 12개의 공백이 모두 제거됩니다. 이것을 테스트해 봅시다:

@Test
void givenAnOldStyleMultilineString_whenComparing_thenEqualsTextBlock() {
    String expected = "<html>\n"
      + "\n" 
      + "    <body>\n"
      + "        <span>example text</span>\n"
      + "    </body>\n"
      + "</html>";
    assertThat(subject.getBlockOfHtml()).isEqualTo(expected);
}

@Test
void givenAnOldStyleString_whenComparing_thenEqualsTextBlock() {
    String expected = "<html>\n\n    <body>\n        <span>example text</span>\n    </body>\n</html>";
    assertThat(subject.getBlockOfHtml())
       .isEqualTo(expected);
}

명시적인 들여쓰기가 필요한 경우 비어 있지 않은 줄(또는 마지막 줄)에 더 적은 들여쓰기를 사용할 수 있습니다.

public String getNonStandardIndent() {
    return """
                Indent
            """;
}

@Test
void givenAnIndentedString_thenMatchesIndentedOldStyle() {
    assertThat(subject.getNonStandardIndent())
            .isEqualTo("    Indent\n");
}

또한 다음 섹션에서 볼 수 있듯이 텍스트 블록 내에서 이스케이프를 사용할 수도 있습니다.

4. 탈출

4.1. 큰따옴표 이스케이프

텍스트 블록 내에서는 큰따옴표를 이스케이프할 필요가 없습니다. 그 중 하나를 이스케이프하여 텍스트 블록에서 세 개의 큰따옴표를 다시 사용할 수도 있습니다.

public String getTextWithEscapes() {
    return """
            "fun" with
            whitespace
            and other escapes \"""
            """;
}

이것은 큰따옴표를 이스케이프해야 하는 유일한 경우입니다. 다른 경우에는 나쁜 습관으로 간주됩니다.

4.2. 이스케이프 라인 종결자

일반적으로 줄 바꿈은 텍스트 블록 내에서 이스케이프할 필요가 없습니다.

그러나 소스 파일에 Windows 줄 끝( \r\n ) 이 있더라도 텍스트 블록은 줄 바꿈( \n ) 으로만 종료됩니다 . 캐리지 리턴( \r )이 필요하면 텍스트 블록에 명시적으로 추가해야 합니다.

public String getTextWithCarriageReturns() {
return """
separated with\r
carriage returns""";
}

@Test
void givenATextWithCarriageReturns_thenItContainsBoth() {
assertThat(subject.getTextWithCarriageReturns())
.isEqualTo("separated with\r\ncarriage returns");
}

때로는 소스 코드에 읽을 수 있는 형식으로 지정하려는 긴 텍스트 줄이 있을 수 있습니다. Java 14 미리 보기에는 이를 수행할 수 있는 기능이 추가되었습니다. 무시되도록 줄 바꿈을 이스케이프할 수 있습니다 .

public String getIgnoredNewLines() {
    return """
            This is a long test which looks to \
            have a newline but actually does not""";
}

실제로 이 문자열 리터럴은 일반적인 중단되지 않은 문자열 과 동일합니다 .

@Test
void givenAStringWithEscapedNewLines_thenTheResultHasNoNewLines() {
    String expected = "This is a long test which looks to have a newline but actually does not";
    assertThat(subject.getIgnoredNewLines())
            .isEqualTo(expected);
}

4.3. 탈출 공간

컴파일러는 텍스트 블록의 모든 후행 공백을 무시합니다 . 그러나 Java 14 프리뷰부터 새로운 이스케이프 시퀀스 \s 를 사용하여 공백을 이스케이프할 수 있습니다 . 컴파일러는 이 이스케이프된 공간 앞의 모든 공백도 보존합니다.

이스케이프된 공간의 영향을 자세히 살펴보겠습니다.

public String getEscapedSpaces() {
    return """
            line 1·······
            line 2·······\s
            """;
}

@Test
void givenAStringWithEscapesSpaces_thenTheResultHasLinesEndingWithSpaces() {
    String expected = "line 1\nline 2        \n";
    assertThat(subject.getEscapedSpaces())
            .isEqualTo(expected);
}

참고 : 위의 예에서 공백은 '·' 기호로 대체되어 표시됩니다.

컴파일러는 첫 번째 줄에서 공백을 제거합니다. 그러나 두 번째 줄은 이스케이프된 공백으로 종료되므로 모든 공백이 보존됩니다.

5. 포맷

변수 대체를 지원하기 위해 String 리터럴에서 직접 String.format 메서드 를 호출할 수 있는 새 메서드가 추가되었습니다.

public String getFormattedText(String parameter) {
    return """
            Some parameter: %s
            """.formatted(parameter);
}

6. 결론

이 짧은 사용방법(예제)에서는 Java 텍스트 블록 기능을 살펴보았습니다. 게임 체인저가 아닐 수도 있지만 일반적으로 좋은 점인 더 좋고 읽기 쉬운 코드를 작성하는 데 도움이 됩니다.

언제나처럼 기사의 전체 소스 코드는 GitHub에서 확인할 수 있습니다 .

Generic footer banner