[JAVA] 문자열 자르기 - substring, split

Benjamin·2023년 1월 24일
0

JAVA

목록 보기
13/28

String의 멤버 함수로 substring()split() 두가지가 가장 흔하게 쓰이는 방식이다.

(String에서 하나의 공백도 하나의 인덱스를 차지하고있는것임을 잊지말자.)

String substring()

파라미터를 1개 혹은 2개로 받을 수 있다.

  1. 파라미터 2개는 시작지점과 끝지점을 전달받아 시작지점부터 끝지점-1까지 리턴한다.
  • 문자열변수명.substring(시작지점, 끝지점) : 시작지점 ~ (끝지점-1)까지 자른다.

아래이미지를 보도록 하자.

이 이미지처럼 이해해도된다.

-> substring(1, 3) : "BC"가 리턴이 된다.

만약 문자열 끝에서부터 3글자만 출력하고 싶다면 아래 예제와 같이 사용하면 된다.

public static void main(String[] args) {		
	String str = "abc123def";
	System.out.println(str.substring(str.length()-3, str.length()));
}
  • 출력 : def

그리고 아래예제와 같이 indexOf() 함수를 사용하면 특정 글자 두개를 포함하여 그사이에 글자를 모두 출력하게 된다.

public static void main(String[] args) {		
	String str = "abc123def";
    System.out.println(str.substring(str.indexOf("1"), str.indexOf("3") + 1));
}
  • 출력 : 123
  1. 파라미터를 1개만 받으면, 입력받은 인자값의 index를 포함하여 끝까지 리턴한다.
  • 문자열변수명.substring(시작지점) : 시작지점부터 끝까지 리턴한다.

-> substring(5) 를 입력하면 인덱스 5부터 문자열 끝까지 잘라서 "3de"가 리턴된다.

주의사항 (에러처리)

substring() 함수를 사용하다가 문자열의 길이보다 긴 값을 substring의 인자로 전달하게 되면 아래 예제와 같이 StringIndexOutOfBoundsException 에러가 발생한다.

  • 첫번째 예제
public static void main(String[] args) {		
	String str = "abcdefg12345";
	System.out.println("substring(10,20) : " + str.substring(10,20));
}

에러 메시지 :
Exception in thread "main" java.lang.StringIndexOutOfBoundsException: Range (10, 20) out of bounds for length 12

총 글자수는 12개이지만 10부터 20을 출력하라고 했기때문에 에러가 발생한것이다.

  • 두번째 예제
    두번째 파라미터(끝지점 인덱스)는 (받은 값-1)까지 출력한다.
    그렇다면, (받은 값-1)된 값이 실제 String에서 쓰이는 마지막 인덱스(아래 예시에서는 11)가 되도록한다면 어떻게될까?
    즉, 두번째 파라미터를 String 길이로 주면 어떻게될까?
public static void main(String[] args) {
		String str = "abcdefg12345";
		System.out.println("substring(10,12) : " + str.substring(10,str.length()));
}


정상적으로 잘 출력된다.

이전 에러 메시지에서도 '~~length 12'라는 말이 있었듯이, 파라미터의 최대값이 길이값이 되는것은 상관없다.
즉, 실제 부여되어있는 인덱스는 최대값이 '길이-1'이지만, 파라미터에 인덱스를 초과하는 길이값을 넣는것은 가능하다.
실제적으로는 해당값-1(즉, 인덱스의 최대값)으로 적용되기때문이다.

  • 세번쨰 예제
    (받은 값-1)된 값이 실제 String의 길이가 되도록, 두번째 파라미터를 (String길이+1)로 주면 어떻게될까?
public static void main(String[] args) {
		String str = "abcdefg12345";
		System.out.println("substring(10,13) : " + str.substring(10,13));
	}

이런 에러를 방지하기 위해서는 try-catch문을 사용해서 StringIndexOutOfBoundsException 에러를 예외처리해주면 된다.


String[] split()

  • 특정 문자열을 파라미터로 받아서 해당 문자열을 기준으로 문자열을 잘라 String 배열에 넣어주는 기능을 한다.
  • String의 멤버함수이다.

split(String regex)

String[] strarr = 문자열변수명.split(기준문자)

아래이미지를 보면 이해하기 쉬울 것이다.


위에 이미지를 아래는 코드화 한것이다.

//예시
public static void main(String[] args) {		
	String str = "ABC,EE,QQ1,5112";
	String arr[] = str.split(",");
	for(String cut : arr) {
		System.out.println(cut);
	}		
}

출력 :
ABC
EE
QQ1
5112

  • split("") : 문자열에서 문자를 하나하나떼서 배열의 원소로 넣는다.(공백도 하나의 문자로 취급)
    -> toCharArray()는 문자배열로 바꿔주는데, 이렇게하면 문자열배열로 바꿀 수 있다.

아래에서 예시를 보자.

//예시
public static void main(String[] args) {
		String str = "hello im";
		String[] arr = str.split("");
		for(int i=0; i<arr.length; i++) {
			System.out.println(arr[i]);
		}

	}

결과이다.

split(String regex, int limit)

두번째 인자값 limit은 배열의 크기를 결정한다.

예시를 보자.

String str = "12-3-456-7890-234";
String[] arr = str.split("-",2);

//12
//3-456-7890-234 

이렇게 2개로 분리된다.
-> 초반에는 구분자에 의해 분리되어 들어가다가, 마지막 원소는 분리되지못하고 전체가 들어간다.

String str = "12-3-456-7890-234";
String[] arr = str.split("-",4);

//12
//3
//456
//7890-234

위처럼 4개로 분리된다.


참고사이트

https://hijuworld.tistory.com/78
https://jamesdreaming.tistory.com/81
https://jamesdreaming.tistory.com/84

0개의 댓글