Java - String.split() 메서드

c.Hano·2024년 11월 21일

자바

목록 보기
6/17
split() 메서드는 문자열(String)을 특정 기준(구분자)로 나누어 문자열을 나누어 배열에 담는다.
String[] 변수이름 = String타입 변수.split("구분자");

이렇게 사용한다.

자바에서 기본으로 제공하는 패키지에 해당된 메서드 이다.

메서드 내부에 들어가보면 이렇게 생겼다.

public String[] split(String regax);

매개변수(파라미터) : regax(regular expression) 문자열을 분리할 기준이 되는 정규 표현식이다. 특정 문자나 패턴을 사용할 수 있다.
리턴값 : String[] 문자열 타입의 배열로 값을 반환한다. 구분자를 기준으로 분리된 문자열 조각들의 배열이다.

아직 무슨 말인지 모르겠다고? 나도 그렇다.

예제를 보며 이해해보자.

기본 사용법.

public class Main {
    
    public static void main(String[] args) {
        
        String command = "삭제?id=1";
        String[] parts = command.split("=");

        for (String part : parts) {
            System.out.println(part);
        }
        // 향상된 for문이다.
        // for (int i = 0; i < parts.length; i++) {
        // String[] part = parts[i];
        // System.out.println(part); 와 같다. (아마도?)
        //}
    }
}
결과.

삭제?id 
1

예제를 하나하나 뜯어보자.

String 타입의 변수 command 에 "삭제?id=1"의 값을 담았다.

command.split("=");

구분자를 = 로 두었다. command 에 담긴 값 중 = 를 기준으로 문자열을 나눈다(split).

"삭제?id"
"1"

command에 담긴 값이 "="를 기준으로 두개로 나뉘었다.
나뉜 문자열을 String[] parts 에 각각 하나의 배열 요소로 분리한다.

parts[0] = "삭제?id"
parts[1] = "1"

요렇게 된다.

split() 동작과정.

문자열변수.split()이 선언되면 문자열을 왼쪽에서 오른쪽으로 탐색한다. 주어진 구분자(위의 예제에선 "="가 구분자였다.)를 만날 때 마다 문자열을 분리한다.

구분자는 삭제한다. 구분자는 결과 배열에 포함되지 않고 제거된다.

빈 문자열 처리

만약 구분자 양쪽에 아무 내용이 없다면, 결과 배열에 빈 문자열("")이 포함된다.

빈 문자열 예제.

String command = "=value"; 
String[] parts = command.split("="); 

for (String part : parts) { 
	System.out.println("[" + part + "]"); 
}

String(문자열)타입의 변수 command에 "=value" 값을 담았다.
String[] parts = command.split("=") 을 통해 command 타입 안에 있는 값을 정해준 구분자("=")를 기준으로 나눈다.
=의 기준 왼쪽에는 "" 아무것도 없다.
=의 기준 오른쪽에는 "value" 가 있다.

실행 결과.

[] 
[value]
parts[0] = ""
parts[1] = "value"

요렇게 된다.

조금 더 나아가보자.

다중 구분자 분리

split()메서드는 정규식을 지원하므로 여러 구분자를 동시에 사용할 수 있다. (정규식은 뒤에서 간단히 다시 말할꺼다. 지금은 그냥 규식이 정도로 생각하자)


String command = "삭제?id=1,name=John"; 

String[] parts = command.split("[=,]"); 
//[]는 정규식. (규식아!!!!!)
//[a,b,c] -> a,b,c 중 어느 하나라도 매칭되면 문자열을 나눈다.
for (String part : parts) { 
	System.out.println(part); 
}
실행 결과

삭제?id 
1 
name 
John

이것도 하나씩 뜯어보자.

String 타입의 command에 "삭제?id=1,name=John" 이라는 문자열 값을 담았다.

String[] parts = command.split("[=,]") =와,를 기준으로 두 개 중 어느 하나라도 해당이 되면 문자열을 나누어 Strin타입의 배열에 담는다.

split()은 왼쪽에서 오른쪽으로 처리된다.

= 기준 왼쪽 : "삭제?id"
= 와 , 사이 " "1"
, 와 = 사이 "name"
= 기준 오른쪽 : "John"

parts[0] = "삭제?id"
parts[1] = "1"
parts[2] = "name"
parts[3] = "John"

이렇게 parts.length()는 4가 나온다.

제한된 분리

뭐가 알아야할게 많다. 좀만 힘내자.

split(String regex, int limit)을 사용하면 나뉘는 배열의 크기를 제한 할 수 있다.
(앞서 .startsWith()메서드와 동일하게 기본 제공 클래스 내부에서 오버로드 되어 있는 모냥이다.)

String command = "삭제?id=1=name"; 
String[] parts = command.split("=", 2); // 최대 두 개로 나눔 

for (String part : parts) { 
	System.out.println(part); 
}
실행 결과

삭제?id 
1=name

구분자로 설정한 "="를 기준으로 왼쪽에서 오른쪽으로 문자열을 탐색했을 때 첫번째로 "삭제?id"가 분리되어 배열에 담긴다. limit이 2이므로 뒤에는 구분식이 있어도 전부 하나의 배열에 담긴다.

parts[0] = "삭제?id"
parts[1] = "1=name"
구분자가 없을 경우

구분자가 없는 경우, 원본 문자열이 그대로 배열의 첫 번째 요소로 반환된다.

String command = "삭제"; 
String[] parts = command.split("="); 

System.out.println(parts.length); // 1 
System.out.println(parts[0]); // 삭제
정규식 관련 문제.

안녕 규식아.

우리 규식이는 문자열에서 특정 조건을 만족하는 것을 쉽게 반환케 하는 명령어들이다.

구분자로 정규식을 사용할 때, 특수문자(. * | [ ] 등등)은 반드시 이스케프(\이건가 정규식에서 특수문자로 인식되는 문자를 일반 문자로 취급하도록 만든다.) 처리해야한다.

정규식기능
.모든 문자를 의미한다.
\.. 문자 자체를 의미한다.
*0번 이상 반복을 의미
\** 문자 자체를 의미한다.
등등등...
. 을 구분자로 사용하는 예제

public static void main(String[] args) { 
	String text = "a.b.c"; 
	String[] parts = text.split("\\."); // 점(.)은 특수문자이므로 \\로 이스케이프 처리 

	for (String part : parts) { 
		System.out.println(part); 
	} 
} 
결과값.

a
b
c
. 을 구분자로 사용하는데 이스케이프(\\)처리를 안했을 경우

public static void main(String[] args) { 
	String text = "a.b.c"; 
	String[] parts = text.split("."); // 이스케이프 처리 안함

	for (String part : parts) { 
		System.out.println(part); 
	} 
} 
출력값.

만약 이스케이프(\)처리 없이 text.split(".")을 사용하면 모든 문자가 매칭되어 "" 이 결과값으로 출력된다.

연속된 구분자
String text = "a==b"; 
String[] parts = text.split("="); 
for (String part : parts) { 
System.out.println(part); 
}
결과
a
 
b

구분자로 "="를 설정하였는데 text안에 "a==b" 처럼 구분자가 두개 들어있다.

당황하지 말고 왼쪽에서 오른쪽으로 처리하자.
= 기준 왼쪽 : "a"
= 와 = 사이 " "" (공백)
= 기준 오른쪽 "b"

parts[0] = "a"
parts[1] = ""
parts[2] = "b"

이렇게 3개의 배열이 나온다.

문자열이 구분자로만 구성된 경우
String text = "==="; 
String[] parts = text.split("="); 
	for (String part : parts) { 
		System.out.println(part); 
	}
결과.



위의 경우와 동일하게 생각하자.
= 기준 왼쪽 : ""
= 와 두번쨰 = 사이 : ""
두번째 = 와 세번째 = 사이 : ""
세번째 = 오른쪽 : ""

parts[0] = ""
parts[1] = ""
parts[2] = ""
parts[3] = ""

분식이와 규식이.. 어느집 자식들이냐.. 왜케 날 힘들게 해...

profile
꼬질이

0개의 댓글