자바에서 문자열을 자를 때 가장 많이 쓰는 메서드는 단연 split()입니다. 보통은 split(",") 처럼 구분자만 넣어서 사용하죠.
그런데 다른 사람의 코드를 보다 보면 split(",", 3) 이나 split(",", -1) 처럼 뒤에 정체모를 숫자가 붙어있는 것을 종종 보게 됩니다.
이 두 번째 파라미터의 정체는 바로 limit(제한)입니다. 이 숫자가 양수일 때, 0일 때, 음수일 때 완전히 다른 3가지 마법을 부리는데요. 오늘 이 3가지 차이점을 완벽하게 정리해 드리겠습니다.
테스트를 위해 끝에 쉼표가 2개 더 붙어있는 아래 문자열을 예시로 들어보겠습니다.
String text = "사과,배,포도,귤,수박,,";
양수는 "결과 배열의 방을 최대 몇 개까지만 만들 것인가?"를 뜻합니다.
String text = "사과,배,포도,귤,수박,,";
String[] arr = text.split(",", 3);
System.out.println(Arrays.toString(arr));
// 결과: ["사과", "배", "포도,귤,수박,,"]
💡 자바의 속마음:*"아, 최대 3조각까지만 내라고? 알겠어. 첫 번째 쉼표 자르고, 두 번째 쉼표 자르고... 앗! 벌써 방이 2개 찼네? 그럼 나머지는 더 이상 자르지 말고 마지막 3번째 방에 몽땅 때려 넣어!*"
사실 우리가 평소에 쓰는 split(",")은 자바 내부적으로 split(",", 0)과 완벽하게 똑같이 동작합니다. limit을 아예 적지 않으면 자바가 알아서 0을 넣어서 계산하기 때문입니다.
String text = "사과,배,포도,귤,수박,,";
String[] arr = text.split(",", 0); // text.split(",")과 완벽히 동일
System.out.println(Arrays.toString(arr));
// 결과: ["사과", "배", "포도", "귤", "수박"]
자바의 속마음:*"구분자가 보일 때마다 전부 다 자를게! 어? 그런데 맨 끝에 쉼표가 남아서 빈 문자열("")이 생기네? 의미 없는 빈 칸은 쓰레기니까 내가 알아서 버려줄게!*"
음수(보통 -1을 씁니다)가 들어가면 자바는 "limit 무한대(제한 없음)" 모드로 돌입합니다.
String text = "사과,배,포도,귤,수박,,";
String[] arr = text.split(",", -1);
System.out.println(Arrays.toString(arr));
// 결과: ["사과", "배", "포도", "귤", "수박", "", ""]
자바의 속마음:*"제한 해제! 중간이든 맨 끝이든 쉼표가 보이면 무조건 다 자른다. 그 결과로 생기는 빈 문자열("")조차도 하나의 소중한 데이터로 인정해서 배열에 모조리 담아줄게!*"
| split 코드 | 파라미터 의미 | 결과 배열 형태 |
|---|---|---|
split(",", 3) | 양수 (제한) | ["사과", "배", "포도,귤,수박,,"] |
split(",", 0) | 0 (기본값) | ["사과", "배", "포도", "귤", "수박"] (뒤에 빈칸 버림) |
split(",", -1) | 음수 (무제한) | ["사과", "배", "포도", "귤", "수박", "", ""] (빈칸 모두 살림) |