자바에서 CSV나 콤마 구분 문자열을 다뤄보다 보면, 누구나 한 번쯤 겪는 일이 있습니다.
“마지막 콤마 때문에 배열 길이가 달라지네… 왜 안 나오지??”
😩 흔한 상황
String raw = "수신처1,수신처2,";
String[] arr = raw.split(",");
System.out.println(Arrays.toString(arr));
결과:
[수신처1, 수신처2]
엇? 뒤에 콤마가 있었는데 빈 문자열("") 은 어디 갔을까요?
그렇습니다. 자바의 split()은 기본적으로 뒤쪽의 빈 토큰을 자동으로 버립니다.
🧩 왜 이런 일이 생길까?
String.split()은 내부적으로 정규식을 사용하며, 기본 동작은 뒤에 있는 빈 토큰은 제거로 설정되어 있습니다.
"A,B,".split(",") → ["A","B"]
"A,B,".split(",",0) → ["A","B"]
즉, "A,B,"처럼 마지막에 콤마가 있으면 마지막 빈값("")이 잘려나갑니다.
✅ 해결책: split(",", -1)
해결 방법은 간단합니다.
String raw = "수신처1,수신처2,";
String[] arr = raw.split(",", -1);
System.out.println(Arrays.toString(arr));
결과:
[수신처1, 수신처2, ]
split(",", -1)은 “모든 토큰을 유지하라, 뒤의 빈값도 버리지 마라”라는 뜻입니다 ✅
📊 limit 값의 의미
| 코드 | 설명 | 결과 ("A,B,") |
|---|---|---|
split(",") |
기본형 (limit=0) | ["A","B"] |
split(",", 2) |
최대 2개로 나눔 | ["A","B,"] |
split(",", -1) |
모든 토큰 보존 | ["A","B",""] |
🧠 실무에서 왜 중요한가?
이건 단순한 문자열 파싱 문제가 아니라, 배열 길이와 데이터 정합성 문제로 이어집니다.
String[] p_receive_org = request.getParameter("p_receive_org").split(",");
for (int i = 0; i < p_receive_org.length; i++) {
System.out.println(i + " ::: " + p_receive_org[i]);
// DB insert 로직
}
만약 프런트에서 "수신처1,수신처2,"를 보내면 split 결과가 ["수신처1","수신처2"]가 되어 서버에서는 마지막 인덱스를 못 찾습니다 → IndexOutOfBoundsException 발생.
하지만 split(",", -1)을 쓰면 ["수신처1","수신처2",""] 로 배열 길이가 맞게 들어와 빈값까지 인식되고 에러 없이 insert가 가능합니다.
🧩 실무 예시 (JSP + Java)
JSP에서 받은 문자열:
<input type="hidden" id="p_receive_org" name="p_receive_org" value="1,2,">
서버(Java):
String raw = request.getParameter("p_receive_org");
String[] orgArr = raw.split(",", -1); // ✅ 빈값까지 유지
for (int i = 0; i < orgArr.length; i++) {
String org = orgArr[i];
System.out.println(i + " ::: [" + org + "]");
}
출력 결과:
0 ::: [1]
1 ::: [2]
2 ::: []
💬 요약 정리
| 상황 | split(",") |
split(",", -1) |
|---|---|---|
"A,B," |
["A","B"] |
["A","B",""] |
"A,,B" |
["A","","B"] |
["A","","B"] |
"A,,B," |
["A","","B"] |
["A","","B",""] |
"A,B,," |
["A","B"] |
["A","B","",""] |
💡 결론:
마지막에 콤마가 붙을 가능성이 있다면, 무조건split(",", -1)을 사용하자.
그래야 빈값도 데이터로 인정되고 배열 길이도 정확히 유지된다.
✏️ 마무리
많은 사람들이 split()이 단순히 “콤마로 나누는 메서드”라고 생각하지만, 사실 limit 옵션에 따라 완전히 다른 결과를 만들어냅니다.
빈값 하나 때문에 디버깅하느라 몇 시간을 날린 적 있다면, 이 한 줄만 기억해두세요.
split(",", -1)
👉 모든 항목을 그대로 유지하고 싶을 때, 꼭 써야 하는 옵션입니다.
'언어 > JAVA' 카테고리의 다른 글
| [Java] 현업 자바 백엔드 개발자들이 가장 많이 하는 실수 1위: NullPointerException(NPE) 방어 미흡 (0) | 2025.11.19 |
|---|---|
| request.getRemoteAddr()로 정확한 IP 추출이 되지 않을 때.. (0) | 2023.05.11 |
| 에라토스테네스의 체 (0) | 2022.11.15 |
| 배열 복사 : clone() 과 arraycopy() (0) | 2022.11.09 |
| JAVA 엑셀다운로드시 파일명 한글 오류 (0) | 2022.11.08 |