언어/JAVA

🔍 Java split(",", -1) — 마지막 콤마 때문에 삽질했던 사람들에게

zumsim 2025. 11. 8. 22:24
728x90
반응형

자바에서 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)

 

👉 모든 항목을 그대로 유지하고 싶을 때, 꼭 써야 하는 옵션입니다.


 

728x90
반응형