split() 뒤에 붙는 숫자의 비밀: limit 파라미터의 3가지 마법
블로그 시작에 앞서 split()에 대해 잘 모른다면 위의 블로그를 먼저 보고 오시는거 추천드려요!
코딩 테스트에서 문자열을 특정 기호(구분자)로 잘라 배열로 만들어야 하는 문제는 단골로 출제됩니다. 이때 많은 자바 입문자들이 습관적으로 StringTokenizer를 사용했다가 '오답' 판정을 받곤 합니다.
예를 들어, "oxooxoxxox"라는 문자열을 "x"를 기준으로 잘라서 각 조각의 길이를 구해야 한다고 가정해 봅시다.
(원하는 정답 배열: [1, 2, 1, 0, 1, 0])
분명 완벽하게 코드를 짠 것 같은데 왜 틀렸을까요? 자바가 문자열을 자르는 3가지 방식의 차이를 정확히 알아야 합니다.
StringTokenizer의 배신 (빈 공간 무시)StringTokenizer는 애초에 문자열에서 '의미 있는 토큰(조각)'만 뽑아내기 위해 만들어진 아주 오래된 클래스입니다.
• 동작 방식: 구분자("x")가 연속으로 나오거나 맨 앞/뒤에 있으면, 그 사이의 빈 공간을 완전히 무시(스킵)해 버립니다.
• 결과: "oxooxoxxox" ➔ ["o", "oo", "o", "o"] (길이: 4)
• 문제점: 우리가 원했던 '연속된 x 사이의 길이가 0인 빈 문자열'을 아예 배열에 담아주지 않습니다.
split("x")의 반쪽짜리 진실 (후행 빈 문자열 제거)"그럼 split을 쓰면 되잖아?" 하고 split("x")를 사용하면 함정을 절반만 피한 것입니다.
• 동작 방식: 중간에 있는 빈 문자열은 배열에 잘 담아줍니다. 하지만, 맨 마지막에 남는 빈 문자열들은 싹 다 버려버립니다.
• 결과: "oxooxoxxox" ➔ ["o", "oo", "o", "", "o"] (길이: 5)
• 문제점: 문자열 맨 끝에 "x"로 끝나면서 생기는 마지막 빈 공간을 잘라내 버립니다. (정답 길이가 6이어야 하는데 5가 나옴)
split("x", -1) (리미트 해제)이 모든 문제를 해결하고 빈 공간을 하나도 빠짐없이 배열에 담으려면, split 메서드의 두 번째 파라미터인 limit(제한) 값을 조작해야 합니다.
• 동작 방식: split(구분자, limit)에서 limit 자리에 음수(-1)를 넣으면, 자바에게 "배열의 크기 제한을 없애고, 맨 끝에 남는 빈 문자열까지 모조리 다 배열에 담아라!"라는 강력한 명령을 내리게 됩니다.
• 결과: "oxooxoxxox" ➔ ["o", "oo", "o", "", "o", ""] (길이: 6)
• 결론: 빈 문자열까지 정확하게 카운트해야 하는 코딩 테스트 문제에서는 무조건 split("구분자", -1)을 사용해야 완벽한 정답을 받을 수 있습니다.
(대상 문자열: "A,,B,,," / 구분자: ",")
| 사용 메서드 | 결과 배열 | 배열 길이 | 특징 |
|---|---|---|---|
StringTokenizer | ["A", "B"] | 2 | 연속된 구분자, 끝 구분자 모두 무시 (알맹이만 뽑음) |
split(",") | ["A", "", "B"] | 3 | 중간 빈 문자열은 살리지만, 맨 끝 빈 문자열들은 버림 |
split(",", -1) | ["A", "", "B", "", "", ""] | 6 | 중간이든 끝이든 모든 빈 문자열을 배열에 포함! (코테 정석) |