원본글: https://www.baeldung.com/java-string-interpolation
이 글에서는 문자 보간(문자열 사이사이에 변수값들을 넣는 방법)에 대해서 알려줍니다.
사실 다른 포스트의 문자열 잇는 방법이나 큰 차이가 없어보이긴하지만 알아보겠습니다.
1. Plus operator
첫 번째로는 ‘+’ 연산자를 이용한 방법입니다.
해당 방법을 이용해서 문자열을 잇거나 변수를 추가할 수 있습니다.
@Test
public void operator_test() {
String expected = "String Interpolation Test By Minseok";
String first = "Interpolation";
String second = "By";
String result = "String " + first + " Test "+ second + " Minseok";
Assertions.assertEquals(expected, result);
}
가장 간단한 방법중 하나입니다.
2. The format() Function
또 다른 방법으로는 format()메서드를 이용한 방법이 있습니다.
‘+’ 연산자와 달리 인자값을 추가해줘야한다는 특이사항이 있습니다.
@Test
public void format_test() {
String expected = "String Interpolation Test By Minseok";
String first = "Interpolation";
String second = "By";
String result = String.format("String %s Test %s Minseok", first, second);
Assertions.assertEquals(expected, result);
}
참고로 ,변수명을 여러번 써야해서 파라미터를 중복으로 작성해야할 때 이를 회피할 수 있습니다.
@Test
public void format_avoid_repeat_test() {
String expected = "String Interpolation Test By Minseok By Baeldung";
String first = "Interpolation";
String second = "By";
String result = String.format("String %1$s Test %2$s Minseok %2$s Baeldung", first, second);
Assertions.assertEquals(expected, result);
}
위의 예시에서 second에 대한 변수를 중복전달하지 않고 한 번에 문자열을 구성하는 것을 확인할 수 있습니다.
3. StringBuilder Class
StringBuilder를 통해 여러 변수에 매개변수를 추가할 수 있습니다.
@Test
public void builder_test() {
String expected = "String Interpolation Test By Minseok";
String first = "Interpolation";
String second = "By";
String result = new StringBuilder()
.append("String ")
.append(first)
.append(" Test ")
.append(second)
.append(" Minseok")
.toString();
Assertions.assertEquals(expected, result);
}
4. MessageFormat Class
MessageFormat이라는 클래스를 통해서도 String interpolation을 구성할 수 있습니다.
이는 좀 덜 알려졌는데, 결과적으로는 StringBuilder보다 성능적으로 느린 이유도 있기 때문입니다.
@Test
public void messageFormat_test() {
String expected = "String Interpolation Test By Minseok";
String first = "Interpolation";
String second = "By";
String result = MessageFormat.format("String {0} Test {1} Minseok", first, second);
Assertions.assertEquals(expected, result);
}
동작은 format()함수와 비슷합니다. 변수를 대입하는 방식도 좀 다르죠. 여기서 StringBuilder보다 느린 이유를 확인할 수 있습니다.
StringBuilder는 내부버퍼에 문자열을 추가하는 작업만 진행하는데, MessageFormat은 구문을 해석한 뒤, 매개변수에 알맞은 값을 변환하는 작업까지 거치기때문에 일반적으로는 StringBuilder가 더 성능적으로 좋습니다.
그럼 String.format()과 비교해서는 어떨까요?
format()이 Message보다는 빠릅니다. format()이 변환과정에서 좀 더 빠르기 때문입니다.
5. Apache Commons
외부라이브러리인 Apache Commons에서 제공하는 여러 문자열 유틸로 String Interpolation을 구성할 수 있습니다.
테스트하기위해서는 ‘org.apache.commons:commons-text‘ 의존성이 필요합니다.
@Test
public void apache_commons_test() {
String expected = "String Interpolation Test with some Java examples By Minseok";
String baseString = "String ${first} Test with some Java examples ${second} Minseok";
String first = "Interpolation";
String second = "By";
Map<String, String> parameters = new HashMap<>();
parameters.put("first", first);
parameters.put("second", second);
StringSubstitutor substitutor = new StringSubstitutor(parameters);
String result = substitutor.replace(baseString);
Assertions.assertEquals(expected, result);
}
보면은 Map자료구조에 파라미터값들을 넣고 외부 라이브러리를 통해서 자동으로 변환하는 것을 확인할 수 있습니다.
6. String Templates
해당 기능은 Java21버전에 추가되었지만 Java23에서는 여러 이유로 삭제되었습니다. 고로 적지 않겠습니다.
7. 결론
String interpolation을 구성할 때 여러 방식에 대해 학습하였습니다.
평: 성능적으로는 StringBuilder가 좋지만, 저는 여러 편의성을 따져서 format()을 사용하지 않을까합니다. 일단 StringBuilder를 사용할때 한 눈에 보기가 불편하기도 하고, 그러다보니 공백확인이 제대로 안될 때가 있었습니다.
'Baeldung번역&공부 > Java-string' 카테고리의 다른 글
문자열에서 마지막 문자를 지우는법(How to Remove the Last Character of a String?) (0) | 2025.02.01 |
---|---|
줄바꿈에 대하여(Adding a Newline Character to a String in Java) (0) | 2025.02.01 |
Java Text Blocks (Java15이상) (0) | 2025.01.31 |
Multi-line을 정의하는 여러 방법(Java Multi-line String) (0) | 2025.01.30 |
인코딩에 대하여(Guide to Character Encoding) (0) | 2025.01.29 |