원본 글: https://www.baeldung.com/java-string-with-separator-to-list
이 글에서는 List형태로 이루어진 여러 문자열을 콤마(,)로 구분된 하나의 문자열로 만드는 방법에 대해 이야기합니다.
또한 콤마(,)와 숫자가 포함된 문자열을 Integer형 리스트로 반환하는 법도 학습합니다.
1. Dependencies
몇 가지 편리한 기능을 사용하려면 Apache Commons Lang3과 Guava 라이브러리를 추가해야합니다.
implementation 'org.apache.commons:commons-lang3:3.17.0'
testImplementation 'com.google.guava:guava:32.1.3-jre'
2. Defining Our Example
예제로 쓸 2가지 입력값을 정해야합니다. 첫 번째 문자열은 (,)로 분리된 나라 이름들을 가지고 있습니다. 두 번째 문자열은 (,)로 분리된 숫자를 가지고 있는 ranks라는 문자열 변수입니다.
String countries = "Russia,Germany,England,France,Italy";
String ranks = "1,2,3,4,5,6,7";
그리고 이 예제를 통해서 변환된 값을 담을 2개의 리스트를 선언합니다.
List<String> convertedCountriesList;
List<Integer> convertedRankList;
이제 많은 예제를 통해서 변환되었을때 기대할 수 있는 기댓값 변수를 정의합니다.
List<String> expectedCountriesList = Arrays.asList("Russia", "Germany", "England", "France", "Italy");
List<Integer> expectedRanksList = Arrays.asList(1, 2, 3, 4, 5, 6, 7);
3. Core Java
문자열을 변환할 첫 번째 방법은 순수 Java 코드만을 이용해서 작성해봅니다.
String클래스가 제공하는 split() 함수를 통해서 문자열을 분리하고, 이를 List형태로 구성합니다.
숫자로 이루어진 문자열도 비슷한 방식으로 숫자만 뽑아내고 리스트에 추가합니다.
@Test
public void core_java_test() {
List<String> convertedCountriesList = Arrays.asList(countries.split(",", -1));
String[] splitRanks = ranks.split(",");
List<Integer> convertedRankList = new ArrayList<Integer>();
for(String number: splitRanks) {
convertedRankList.add(Integer.parseInt(number));
}
Assertions.assertEquals(expectedCountriesList, convertedCountriesList);
Assertions.assertEquals(expectedRanksList, convertedRankList);
}
위에 사용된 코드에서 split()함수를 보면 '-1'이라는 파라미터를 가지고 있는것을 볼 수 있습니다.
이건 limit조건을 거는것인데, limit란 첫 번째 인자로 들어온 구분값을 얼마나 적용할 것인지에 대한 값입니다.
-1은 딱히 조건을 걸지 않고 모든 문자열에 대해서 적용하겠다는 의미입니다. 이 경우에는 빈 문자열도 배열에 포함됩니다.
이렇게 두 번째인자에 명시하지 않는 경우 '0'의 값이 들어가는데 이 경우에는 빈 문자열을 무시합니다.
따라서 ranks를 분리할때 빈 문자열은 무시하게 됩니다.
4. Java Streams
Java Stream API를 통해서 분리해봅니다.
split() 함수를 통해서 String 배열로 변경한 뒤, 이를 Stream API를 통해서 List형태로 바꿉니다.
@Test
public void stream_spit_test() {
List<String> convertedCountriesList = Stream.of(countries.split(",", -1)).collect(Collectors.toList());
List<Integer> convertedRankList = Stream.of(ranks.split(","))// 분리
.map(String::trim)// 공백제거
.map(Integer::parseInt)// 숫자 변환
.collect(Collectors.toList()); //리스트 변환
Assertions.assertEquals(expectedCountriesList, convertedCountriesList);
Assertions.assertEquals(expectedRanksList, convertedRankList);
}
숫자를 바꾸는 경우에는 절차가 좀 더 들어갑니다. 문자열을 분리 한뒤, Stream 클래스로 변환합니다.
이후 trim()함수를 통해서 문자열의 앞 뒤 공백들을 제거해줍니다. 다음으로 parseInt()를 통해서 모든 문자열에 대해서 숫자로 변환합니다. 마지막으로 Stream을 List형태로 변환하여 이를 리턴합니다.
5. Apache Commons Lang
Apache Commons Lang 라이브러리를 통한 변환입니다.
@Test
public void apache_common_test() {
List<String> convertedCountriesList = Arrays.asList(StringUtils.splitPreserveAllTokens(countries, ","));
String[] convertedRankArray = StringUtils.split(ranks, ",");
List<Integer> convertedRankList = new ArrayList<>();
for (String number: convertedRankArray) {
convertedRankList.add(Integer.parseInt(number));
}
Assertions.assertEquals(expectedCountriesList, convertedCountriesList);
Assertions.assertEquals(expectedRanksList, convertedRankList);
}
StringUtils.splitPreserveAllTokens()
함수를 통해서 모든 문자열을 분리합니다. 그리고 해당 문자열 배열을 리스트 형태로 변환합니다.
숫자로 된 문자열의 경우 StringUtils.split()
함수를 통해서 분리한 뒤, 새로운 리스트에 파싱된 숫자를 추가합니다.
split()
함수와 spitPreserveAllTokens()
의 차이점은 뭘까요?
둘 다 문자열을 분리하여 배열에 넣는 함수라는 점은 동일합니다. spitPreserveAllTokens()
함수는 빈 문자열에 대해서 무시하지 않고 이를 배열에 추가하지만, split()
함수는 빈 문자열을 무시합니다.
그렇기에 만약 빈 문자열을 배열에 추가하고 싶다면 splitPreserveAllTokens()함수를 사용하면 됩니다.
6. Guava
Guava라이브러리를 통해서 문자열을 변환해봅니다.
@Test
public void guava_test() {
List<String> convertedCountriesList = Splitter.on(",")
.trimResults()
.splitToList(countries);
List<Integer> convertedRankList = Lists.transform(Splitter.on(",")
.trimResults()
.splitToList(ranks), new Function<String, Integer>() {
@Override
public Integer apply(String input) {
return Integer.parseInt(input.trim());
}
});
Assertions.assertEquals(expectedCountriesList, convertedCountriesList);
Assertions.assertEquals(expectedRanksList, convertedRankList);
}
- Splitter.on() 함수에 구분자를 넣어서 이를 분리합니다.
timeResults()
함수는 문자열 앞 뒤 공백을 모두 무시하라는 뜻입니다.splitToList()
함수는 말그대로 분리된 문자열을 List형태로 변환하는 함수입니다.Lists.transform()
함수는 문자열을 첫 번째 인자로 받고, 함수형 인터페이스를 두 번째 인자로 받습니다.- 첫 번째 인자는 변환하고자 하는 리스트입니다.
- 두 번째 인자는 리스트의 각 항목을 어떻게 변환할지에 대해 정의하는 부분입니다.
7. 결론
콤마(,)로 이루어진 문자열을 분리할 수 있는 여러 방법들을 살펴봤습니다.
블로그 주인장 생각
순수 자바 함수를 사용하는 것은 가장 간단하나 변환과정이 조금 번거롭고, Java Stream을 이용한 방법은 변환과정이 더욱 번거로워 보입니다. 아무래도 제가 아직까지 Stream에 익숙하지 않아서 그런걸까요. Apache Common 라이브러리는 Core Java방식과 크게 다르지 않지만 매개변수가 아닌 함수 이름으로 동작방식을 구분해놔서 좋은 것 같습니다. 마지막으로 Guava는 편리하나 익숙해지는데 손이 탈 것 같고, Chained API에 대한 학습이 필요해보여서 사용하기에 고민이 되는 부분입니다.
'Baeldung번역&공부 > Java-string' 카테고리의 다른 글
랜덤한 문자열을 생성하는 방법(Generate Random String) (0) | 2025.02.11 |
---|---|
isEmpty()와 isBlank()의 차이(Difference Between String isEmpty() and isBlank()) (0) | 2025.02.09 |
공백을 지우는 여러 방법들(Remove Whitespace From a String in Java) (0) | 2025.02.07 |
첫 문자를 대문자로 바꾸는 방법(Capitalize the First Letter of a String in Java) (0) | 2025.02.06 |
날짜 검증하는 여러 방법(Check If a String Is a Valid Date in Java) (0) | 2025.02.05 |