Java StringJoiner 사용하기

Java에서 문자열 사이에 특정한 기호로 연결시키고 싶을 경우가 간혹 생긴다. 보통이라면 for루프를 통해서 간단하게 만들 수 있을 것이다.

{"아이언맨", "캡틴아메리카", "블랙위도우", "헐크", "토르", "호크아이"}와 같은 배열이 있다고 생각하자 이들을 -로 연결하겠다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
public class StringJoinerExample {
public void ex1() {
final String DELIMITER = "-";

StringBuilder result = new StringBuilder();
String[] strArr = {"아이언맨", "캡틴아메리카", "블랙위도우", "헐크", "토르", "호크아이"};

for (int i = 0; i < strArr.length; i++) {
result.append(strArr[i]);
if (i < strArr.length - 1) { // 마지막 이전까지 delimiter 를 append.
result.append(DELIMITER);
}
}

System.out.println(result.toString());
// 아이언맨-캡틴아메리카-블랙위도우-헐크-토르-호크아이
}
}

문제 없이 실행되는 소스코드이지만 뭔가 더 간결하게 하고 싶은 욕심이 생긴다. StringJoiner를 사용하면 이를 좀 더 깔끔하게 작성이 가능하다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
import java.util.StringJoiner;

public class StringJoinerExample {
public void ex2() {
StringJoiner joiner = new StringJoiner("-");

String[] strArr = {"아이언맨", "캡틴아메리카", "블랙위도우", "헐크", "토르", "호크아이"};

for (int i = 0; i < strArr.length; i++) {
joiner.add(strArr[i]);
}

System.out.println(joiner.toString());
// 아이언맨-캡틴아메리카-블랙위도우-헐크-토르-호크아이
}
}

StringJoiner는 문자열 생성자에서 선언한 구분자를 add시켜주면서 StringBuilder와 유사한 효과를 낸다. 차이점이 있다면 prefix(접두사)suffix(접미사)까지 선언이 가능하다는 점이다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
import java.util.StringJoiner;

public class StringJoinerExample {
public void ex3() {
StringJoiner joiner = new StringJoiner("-", "[ ", " ]");

String[] strArr = {"아이언맨", "캡틴아메리카", "블랙위도우", "헐크", "토르", "호크아이"};

for (int i = 0; i < strArr.length; i++) {
joiner.add(strArr[i]);
}

System.out.println("AVENGERS");
System.out.println(joiner.toString());
// AVENGERS
// [ 아이언맨-캡틴아메리카-블랙위도우-헐크-토르-호크아이 ]
}
}

StringJoiner는 이번에 암호화폐 거래소 open api를 사용하면서 알게된 클래스이다. ETH-BTC, SNT-BTC처럼 적게는 몇 개, 많게는 백 개가 넘는 마켓코드를 ,를 통해 쉽게 이어 붙이는 방법을 찾다가 발견하게 된 것이다. 앞으로도 유용하게 쓰일 것 같다.

마지막으로 StringJoiner를 활용하여 배열을 json형태로 만드는 예제를 살펴보자.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
import java.util.StringJoiner;

public class StringJoinerExample {
public void ex4() {
StringJoiner jsonJoiner = new StringJoiner(",\n\t", "{\n\t", "\n}");

String[] strArr = {"아이언맨", "캡틴아메리카", "블랙위도우", "헐크", "토르", "호크아이"};

for (int i = 0; i < strArr.length; i++) {
StringJoiner keyJoiner = new StringJoiner("", "\"", "\"");
StringJoiner valueJoiner = new StringJoiner("", "\"", "\"");
StringJoiner keyValueJoiner = new StringJoiner(" : ");

keyJoiner.add("hero" + i);
valueJoiner.add(strArr[i]);

keyValueJoiner.add(keyJoiner.toString());
keyValueJoiner.add(valueJoiner.toString());

jsonJoiner.add(keyValueJoiner.toString());
}

System.out.println("AVENGERS JSON RESULT");
System.out.println(jsonJoiner.toString());
/*
AVENGERS JSON RESULT
{
"hero0" : "아이언맨",
"hero1" : "캡틴아메리카",
"hero2" : "블랙위도우",
"hero3" : "헐크",
"hero4" : "토르",
"hero5" : "호크아이"
}
*/
}
}

StringBuilder, 또는 기타 문자열을 생성하는 클래스와 잘 조합해서 쓴다면 다양한 방면으로 문자열을 만들어 볼 수 있을 것 같다.