SOFTMOA TECHNOLOGY

Java String.split에서 마지막 빈 문자열이 사라질 때 해결 방법

소프트모아가 정리한 기술 기록입니다.

Contents
작성일 2026. 10. 17.

Java에서 쉼표로 나눈 배열의 마지막 열이 사라진다면 split(",")의 기본 동작부터 확인해야 합니다. 마지막 빈 문자열도 하나의 필드라면 split(",", -1)로 보존하고, 그 뒤에 열 수와 필수값을 검사하세요. 기본 호출은 limit가 0인 경우와 같아 뒤쪽 빈 문자열을 버립니다.[1]

누락된 열과 비어 있는 값은 다릅니다

사번·이름·선택값을 받는 세 열짜리 연동을 가정하겠습니다. 합성 입력 E7,Lee,는 마지막 선택값이 비어 있지만 열은 3개입니다. 반면 E7,Lee는 세 번째 열 자체가 없습니다. 두 입력을 같은 배열로 만들면 원본 형식이 달랐다는 사실을 놓치게 됩니다.

출력에 따옴표를 붙여 빈 값과 빈 배열을 구별했습니다. 표시 함수는 예제의 단순한 값 전용이며 JSON 직렬화기는 아닙니다.

입력과 배열을 함께 확인하는 재현 코드

아래 내용을 SplitCheck.java로 저장합니다. 로컬 Temurin 21.0.10과 25.0.4.1에서 실행해 같은 결과를 확인했습니다. 파일을 읽거나 DB에 쓰지 않고 메모리에 만든 문자열만 처리합니다.

java -version
java SplitCheck.java
import java.util.Arrays;
import java.util.regex.Pattern;
import java.util.stream.Collectors;

public class SplitCheck {
    static void show(String label, String[] values) {
        String text = Arrays.stream(values)
            .map(v -> "\"" + v + "\"")
            .collect(Collectors.joining(", ", "[", "]"));
        System.out.println(label + " n=" + values.length + " " + text);
    }
    public static void main(String[] args) {
        String row = "E7,Lee,";
        show("default", row.split(","));
        show("keep", row.split(",", -1));
        show("middle", "E7,,Y".split(",", -1));
        show("empty", "".split(",", -1));
        show("commas0", ",,".split(","));
        show("commas-1", ",,".split(",", -1));
        show("cap3", "E7,Lee,Y,EXTRA".split(",", 3));
        show("all", "E7,Lee,Y,EXTRA".split(",", -1));
        show("literal", "E7|Lee|".split(Pattern.quote("|"), -1));
        String[] fields = row.split(",", -1);
        if (fields.length != 3 || fields[0].isBlank()) {
            throw new IllegalArgumentException("invalid employee row");
        }
        System.out.println("accepted n=" + fields.length);
    }
}

실행 결과입니다. n은 반환된 배열의 길이입니다.

default n=2 ["E7", "Lee"]
keep n=3 ["E7", "Lee", ""]
middle n=3 ["E7", "", "Y"]
empty n=1 [""]
commas0 n=0 []
commas-1 n=3 ["", "", ""]
cap3 n=3 ["E7", "Lee", "Y,EXTRA"]
all n=4 ["E7", "Lee", "Y", "EXTRA"]
literal n=3 ["E7", "Lee", ""]
accepted n=3

default에서 사라졌던 마지막 값은 keep에서 빈 문자열로 남습니다. 중간 값이 빈 E7,,Y도 열 위치를 유지합니다. 이때 빈 문자열을 거르는 필터를 뒤에 붙이면 다시 열이 당겨지므로, 위치가 의미인 데이터에는 그런 필터를 적용하지 마세요.

limit에 3을 넣어도 세 열 검증은 되지 않습니다

양수 limit는 기대 열 수를 보장하는 옵션이 아닙니다. 최대 limit−1번 분리하고, 나머지 입력을 마지막 원소에 넣습니다.[1] 코드의 cap3는 원본에 값이 4개인데도 길이가 3입니다. 세 번째 원소에 Y,EXTRA가 합쳐져 있기 때문입니다. 이 상태에서 길이만 검사하면 초과 열을 놓칩니다.

예제처럼 모든 빈 필드를 보존한 뒤 fields.length != 3을 검사하면, 추가 열이 있는 입력은 4개로 드러납니다. 반대로 E7,Lee는 여전히 2개라 거부할 수 있습니다. 옵션을 고쳤다고 부족한 열을 자동으로 채워 주지는 않습니다.

  • limit = 0: 후행 빈 문자열을 제외하는 동작이 필요한 경우에 사용합니다.[1]
  • limit < 0: 후행 빈 필드를 포함해 나눈 뒤 구조를 검사할 때 사용합니다.[1]
  • limit > 0: 마지막 항목에 나머지 문자열을 통째로 두려는 경우에 사용합니다.[1]

빈 입력과 구분자만 있는 입력도 테스트하세요

이 실행에서 빈 입력 ""의 결과는 빈 배열이 아니라 [""], 길이 1입니다. ,,는 기본 호출에서 길이 0이지만 -1을 쓰면 빈 값 3개로 남습니다. 따라서 배열이 비지 않았다는 조건만으로 유효한 레코드라고 판단하면 안 됩니다. 마지막 검사는 세 열인지와 사번이 공백뿐인지까지만 확인하는 예시입니다.

세 번째 값이 선택항목이라면 E7,Lee,를 허용할 수 있습니다. 이름까지 필수로 정했다면 E7,,Y는 별도 규칙으로 거부해야 합니다. 사번 중복이나 허용 상태값도 분리해서 검사하세요. null 입력은 이 코드의 대상이 아니므로 호출 전에 거부할지, 누락 상태로 처리할지 결정해야 합니다.

구분자 기호와 CSV 형식은 별도 문제입니다

split의 첫 인자는 정규식입니다.[1] 파이프 기호를 문자 그대로 쓰려면 예제의 Pattern.quote("|")처럼 처리할 수 있습니다. quote는 지정 문자열을 정규식의 특별한 의미 없이 일치시키는 패턴을 만듭니다.[2] 이는 CSV의 따옴표 처리와는 다른 기능입니다.

이 예제는 필드 안에 구분자나 줄바꿈이 들어가지 않는 단순 형식을 전제로 합니다. CSV에는 따옴표로 감싼 필드 안의 쉼표·줄바꿈과 따옴표 이스케이프 규칙이 있으므로 split 호출만 바꿔서는 처리할 수 없습니다.[6] 그런 파일은 Apache Commons CSV 같은 전용 파서로 읽고, 입력 형식에 맞는 설정을 선택하세요.[3]

또한 -1은 행 길이나 메모리 사용량의 상한이 아닙니다. 운영 입력에는 분리 전 길이 제한을 따로 두고, 실패한 행 번호와 원인을 남기는 편이 좋습니다. 개인정보가 포함된 원문 전체를 진단 로그에 그대로 쓰지는 마세요. 소프트모아의 업무 연동을 설계할 때도 파싱 결과와 업무상 허용 여부를 구분해야 합니다.

참고 문서

소프트모아는 해당 시스템을 구축합니다. 문의하기

Share this

Java

Have a questions?

견적 및 기술문의

mobile : 010-7931-4813

Contact Form