[자바] 13. 텍스트블록 : 여러 줄 문자열의 해방 (Java 15)

자바 버전 여행 13편 - 여러 줄 문자열의 해방

작성자

카테고리:

* 이 게시물은 쿠팡 파트너스 활동의 일환으로, 이에 따른 일정액의 수수료를 제공받습니다.

(자바 버전 여행 ⑬)

코드 안에 JSON이나 SQL을 문자열로 넣어 본 사람은 안다. \n과 +와 따옴표 이스케이프가 뒤엉켜서, 원래 뭘 적으려 했는지도 안 보인다. 자바 15의 텍스트 블록은 이 지옥을 끝낸다.

Before — 이스케이프 지옥

String json = "{\n" +
    "  \"name\": \"cozmo\",\n" +
    "  \"lang\": \"java\"\n" +
    "}";

After — 보이는 그대로

따옴표 세 개(""")로 열고 닫으면, 그 안은 쓴 그대로 문자열이 된다. 줄바꿈도 따옴표도 이스케이프가 필요 없다.

String json = """
    {
      "name": "cozmo",
      "lang": "java"
    }
    """;

들여쓰기 규칙 하나만 기억하자

텍스트 블록은 여러 줄 중 가장 왼쪽 공통 들여쓰기를 기준으로 잡아 그만큼을 걷어낸다. 그래서 코드 안에서 예쁘게 들여써도, 실제 문자열엔 그 들여쓰기가 안 들어간다. 닫는 """의 위치로 왼쪽 여백을 조절할 수 있다.

한 줄이 너무 길어 코드에서만 줄을 나누고 싶으면, 줄 끝에 \를 붙여 실제 줄바꿈을 없앤다.

String sql = """
    SELECT id, title \
    FROM posts WHERE status = 'publish'
    """;   // 실제로는 한 줄로 이어진다

직접 해보기 — JSON·SQL을 텍스트 블록으로

이스케이프로 도배된 문자열을 텍스트 블록으로 바꿔 보자.

  1. 아래처럼 JSON을 텍스트 블록으로 만들고 그대로 출력한다.
  2. 출력 결과의 들여쓰기가 코드의 들여쓰기와 어떻게 다른지 관찰한다.
  3. 닫는 """를 왼쪽/오른쪽으로 옮겨 보며 여백이 바뀌는 걸 확인한다.
String json = """
        {
          "series": "자바 버전 여행",
          "episode": 13
        }""";
System.out.println(json);

실행해 보면 이렇게 나온다.

{
  "series": "자바 버전 여행",
  "episode": 13
}

여기서 조금씩 바꿔 보자.

  • 줄 끝에 \\를 붙여 두 줄을 한 줄로 합쳐 본다.
  • 문자열 안에 " 하나만 넣어 보고, 이스케이프 없이도 되는지 확인한다.

한 걸음 더 — String.format 대신 텍스트 블록 + formatted(...)로 값을 끼워 넣어 본다.

✅ 확인 — 텍스트 블록이 이스케이프를 없애준다는 것과, 공통 들여쓰기가 제거된다는 규칙을 설명할 수 있으면 통과다.

들여쓰기 규칙 — 걷어내는 여백과 남기는 여백

텍스트 블록에서 헷갈리는 건 딱 하나, 들여쓰기다. 자바는 모든 줄과 닫는 """의 공통 들여쓰기(incidental whitespace)를 자동으로 걷어낸다. 남는 건 ‘의도한‘ 들여쓰기(essential)뿐이다. 즉 닫는 """의 위치가 기준선이 된다 — 이걸 왼쪽으로 당기면 여백이 남고, 본문에 맞추면 여백이 사라진다.

String json = """
        {
          "name": "cozmo"
        }
        """;   // 닫는 따옴표를 여기 두면, 그 왼쪽 8칸 여백이 제거됨

끝 공백과 줄 이어붙이기 — \\s 와 \\

텍스트 블록은 각 줄 끝의 공백을 자동으로 지운다(실수로 남은 트레일링 스페이스 방지). 일부러 남겨야 하면 \s(공백 하나 보존)를 쓴다. 반대로 줄 끝에 \(백슬래시)를 두면 ‘줄바꿈 없이 이어짐‘ — 긴 한 줄을 소스에선 여러 줄로 보기 좋게 나눠 쓸 수 있다.

String s = """
        긴 문장을 소스에서는 나눠 쓰지만 \
        실제로는 한 줄로 이어진다.""";

값 끼워넣기 — 텍스트 블록엔 보간이 없다

한 가지 오해를 짚자. 텍스트 블록은 ‘보기 좋은 리터럴‘이지 템플릿이 아니다. 안에 변수를 ${...}처럼 끼워넣는 문법은 없다. 값을 넣으려면 자바 15에 함께 온 문자열의 formatted() 메서드로 %s를 채운다(String.format의 인스턴스 버전).

String json = """
        { "name": "%s", "lang": "%s" }
        """.formatted("cozmo", "java");

언제 쓰고 언제 안 쓰나

JSON·SQL·HTML·정규식처럼 여러 줄 리터럴엔 텍스트 블록이 최고다. 이스케이프 지옥을 통째로 없애준다. 반대로 한 줄 문자열엔 그냥 큰따옴표가 낫다 — 텍스트 블록은 최소 두 줄(여는 """ 다음 줄바꿈)이 필요하기 때문이다. ‘여러 줄이고 그대로 보이는 게 중요하면 텍스트 블록’으로 기억하면 선택이 쉽다.

문자열까지 편해졌다. 다음 편은 자바 개발자가 가장 반긴 문법, 데이터 클래스의 보일러플레이트를 통째로 지우는 record다.

자주 묻는 질문 (FAQ)

텍스트 블록에서 따옴표를 이스케이프해야 하나요?

아니요. 삼중 따옴표 안에서는 큰따옴표·줄바꿈을 그대로 씁니다. JSON·SQL을 원본대로 넣기 좋습니다.

코드 들여쓰기가 문자열에 그대로 들어가나요?

아닙니다. 여러 줄의 공통 들여쓰기는 자동 제거됩니다. 닫는 삼중 따옴표 위치로 왼쪽 여백을 조절합니다.

코멘트

답글 남기기

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