들어가며
문자열을 쪼개야겠다 생각이 들면 split() 메서드가 떠오르기 마련이다. 우아한테크코스 프리코스 1주차 문제도 split() 메서드를 절묘하게 이용해야하는 문제였다. 그래서 이번 기회에 split() 메서드에 대해서 깊게 알아보고, 내가 코드에 인자로 -1을 넣은 이유도 블로그에 작성해볼까 한다.

본론으로
자바의 String.split()은 정규식(regex) 을 기준으로 문자열을 잘라 문자열 배열을 반환한다.
- 시그니처
- String[] split(String regex)
- String[] split(String regex, int limit)
여기서 첫 번째 인자 regex는 정규표현식이다.
두 번째 인자인 limit은 결과 배열의 길이/후행 빈 토큰 처리에 영향을 준다.
- limit > 0 : 최대 limit개로 자르고, 마지막 요소에 나머지 전부 포함
- limit == 0 : 후행 빈 토큰을 제거
- limit < 0 : 제한 없음 + 후행 빈 토큰도 보존 -> "결론 먼저 스포하자면 요놈 때문에 그렇다!!" 일단 예시를 보자 ㅎㅎ
예시
"1,2,".split(",", 0); // -> ["1", "2"] (마지막 빈 토큰 제거)
"1,,3".split(",", 0); // -> ["1", "", "3"] (중간 빈 토큰은 보존)
"1,2,".split(",", -1); // -> ["1", "2", ""] (마지막 빈 토큰 보존)
",,a".split(",", -1); // -> ["", "", "a"] (선두/중간 빈 토큰도 그대로)
즉 limit이 -1라는 뜻은 -> “끝의 빈 토큰도 버리지 말고 다 보여줘” 라는 의미이다.
그럼 왜 끝의 빈 토큰도 버리지 말라고 했을까?? 마지막 구분자 이후의 값은 버려도 되는 거 아닌가???
문자열 포맷 검증에서 “빈 토큰”은 유효성 오류 신호인 경우가 많다.
예를 들어, “구분자 연속 사용”("1,,2")이나 “마지막에 구분자만 쓰고 값 없음”("1,2,")은 입력 오류로 보고 싶을 수 있다.
- split(regex, 0)을 쓰면 마지막 빈 토큰이 사라져서 오류를 놓친다.
- split(regex, -1)을 쓰면 마지막 빈 토큰이 남아 있어서 검증 단계에서 정확히 잡아낼 수 있다.
그래서 왜 마지막 구분자 이후를 살렸는데??
솔직히 말하자면 이번 첫주차 문제에서 이것저것 다 해봐야 문제 난이도가 올라갔을 때 문제구현에만 온 힘을 쓸 수 있겠다고 판단했다.. 그래서 여러개념 적용 중이다. 그래서인지 검증 로직을 꽤 빡빡하게 많이 두었는데 아래의 검증 로직에서 꽤 고민을 했다. 내 문제에선 아래의 예외가 적용되어 있다. 과해석일 수도 있겠지만 욕심내서 해보았다.
“구분자 사이가 비어 있으면 예외”
그럼 이 말은 아래 케이스를 보자. split(",", 0) 을 했다고 가정하고 나누었다.
"1,,3" -> ["1", "", "3"] -> 예외
",2,3" -> ["" , "2", "3"] -> 예외
"1,2," -> ["1", "2"] -> 당연히 예외지 않을까?-> 그럼 마지막 토큰 버리면 안되는데...??
음... 근데 String.split(",") 만 해버리면 마지막 구분자 이후의 토큰은 버려버린다!!! 그럼 3번째 케이스는 에러가 잡히지 않고 통과되어버리는 불상사가 발생한다!!!
그래서 수소문하여 찾은 방법중에 split()의 limit 인자로 음수를 주면 마지막 구분자 이후의 토큰을 버리지 않고 살려준다!! 는 정보를 얻어서 바로~~ 아래 코드처럼 적용했다 ㅎㅎ
private static List<String> split(String body, String delimiter) {
return Arrays.asList(body.split(delimiter, -1));
}
마무리하며
문제를 해결하기 위해 필사적으로 찾는 구글링은 생각보다 더 많은 깨달음을 주는 것 같다. 그냥 배우기 위해 인강을 보거나, 수업을 듣는 것보다 확실히 문제가 터졌을 때 수습하는 과정에서 실력이 많이 는다는 것을 깨닫는다. 이 개념은 정말 빵꾸가 나버린 배를 수리하기 위해 판자를 급하게 덧붙히 듯이 빠르게 찾은 개념이라 다시는 안 까먹을 듯 하다... 문자열 쪼개는 문제 다 덤벼~!

'Java & Kotlin' 카테고리의 다른 글
| [JAVA] 함수형 인터페이스란?(Supplier<T>, Predicate<T>를 적용하게 된 이유를 중점으로) (0) | 2025.11.03 |
|---|---|
| [JAVA] Collection의 복사 방법에 대해 알아보자!(방어적 복사, 얕은 복사, 깊은 복사) feat. 내가 List.copyOf와 Arrays.asList를 쓴 이유 (0) | 2025.10.18 |
| [JAVA] 정규 표현식, Pattern 클래스로 쉽게 이용해보자! (Pattern.quote()를 중점적으로) (0) | 2025.10.17 |
| [JAVA] 일급 콜렉션을 이용하여 상태와 로직을 따로 관리하자! (0) | 2025.10.17 |
| [JAVA] final 키워드 정복하기! (0) | 2025.10.16 |