Background
백준 3003번 문제를 StringBuilder로 풀다보니 문자열 중간마다 공백을 넣을 때 가독성이 떨어지는 것 같아서 다른 방법은 없을까 찾아보니 StringJoiner 클래스를 보고 처음 사용해봐서 정리하고자 한다.
백준 3003번 문제풀이
2023.10.24 - [Baekjoon(JAVA)/Algorithm] - <Baekjoon(JAVA) - Algorithm> 3003번: 킹, 퀸, 룩, 비숍, 나이트, 폰
StringJoiner
StringJoiner 클래스는 Java 8에 추가된 클래스이다.
StringJoiner는 여러 문자들을 연결할 때 붙일 구분자(delimiter)를 지정해줄 수 있는게 특징이다.
StringBuffer/StringBuilder, StringJoiner 코드를 보고 비교해보자.
StringBuffer/StringBuilder 클래스
String testS1 = "A";
String testS2 = "B";
String testS3 = "C";
String testS4 = "D";
String testS5 = "E";
StringBuilder sb = new StringBuilder();
sb.append("[ ");
sb.append(testS1);
sb.append(" ");
sb.append(testS2);
sb.append(" ");
sb.append(testS3);
sb.append(" ");
sb.append(testS4);
sb.append(" ");
sb.append(testS5);
sb.append(" ]");
System.out.println(sb);
/*
결과
[ A B C D E ]
*/
StringJoiner 클래스
String testS1 = "A";
String testS2 = "B";
String testS3 = "C";
String testS4 = "D";
String testS5 = "E";
StringJoiner sj = new StringJoiner(" ", "[ ", " ]");
sj.add(testS1);
sj.add(testS2);
sj.add(testS3);
sj.add(testS4);
sj.add(testS5);
String testS = sj.toString();
System.out.println(testS);
/*
결과
[ A B C D E ]
*/
자동으로 구분자를 사이에 넣어주기 때문에 코드가 줄어들은 것을 알 수 있다.
(추가적으로 prefix와 suffix도 붙여줄 수 있다.)
StringJoiner - stream
StringJoiner 클래스는 stream을 이용해서 쉽게 사용할 수 있다.
String testS1 = "A";
String testS2 = "B";
String testS3 = "C";
String testS4 = "D";
String testS5 = "E";
List<String> testSList = Arrays.asList(testS1, testS2, testS3, testS4, testS5);
String testS = testSList.stream().collect(Collectors.joining(" ", "[ ", " ]"));
System.out.println(testS);
/*
결과
[ A B C D E ]
*/
String.Join()
Java 8에서는 String 클래스에서 Join 메서드를 제공하고 있다.
String testS1 = "A";
String testS2 = "B";
String testS3 = "C";
String testS4 = "D";
String testS5 = "E";
String[] sList = {testS1, testS2, testS3, testS4, testS5};
String testS = String.join(" ", sList);
System.out.println(testS);
/*
결과
A B C D E
*/
String.Join() 메서드는 아래와 같이 내부적으로 StringJoiner() 클래스를 구성하고 있다.
public static String join(CharSequence delimiter, CharSequence... elements) {
Objects.requireNonNull(delimiter);
Objects.requireNonNull(elements);
// Number of elements not likely worth Arrays.stream overhead.
StringJoiner joiner = new StringJoiner(delimiter);
for (CharSequence cs: elements) {
joiner.add(cs);
}
return joiner.toString();
}
결론
구분자를 반복해서 붙여야 하는 경우나, 접두사/접미사를 간편하게 사용하고자 할 때 StringJoiner를 사용하자.
References
https://futurecreator.github.io/2018/06/02/java-string-joiner/
https://parkhyeokjin.github.io/java/2019/07/18/StringJoining.html
https://data-traveler.tistory.com/22?category=719589