[Tip] 자바의 substring()

2024. 5. 9. 18:30정리

"사실 Tip이라기 보다는 나 같은 바보를 위한 글이다.

어쩌면 누군가는 나처럼 생각했을 수도 있으니까."

 

간단하게

public class test01 {
	public static void main(String[] args) {
		
		String str="I like you";
		String result=str.substring(2); 
		
		System.out.println(result);
	}
}

 

 

substring() 안에 원하는 index를 넣어서 해당 index부터 문자열 끝까지 출력할 수 있다. 

하지만 위와 달리 substring() 안에 두 개의 인자값을 넣을 수도 있다. 

 

public class test01 {
	public static void main(String[] args) {
		
		String str="I like you";
		String result=str.substring(2,6); 
		
		System.out.println(result);
	}
}

 

첫 인자값과는 달리 두번째 인자값은 출력하길 원하는 index보다 +1을 더해준 값을 넣어야 한다. 

따라서 내가 문자열 "like"를 출력하고 싶다면 e의 index인 5가 아닌 6을 전달해주면 된다.

여기까지는 다들 알고 있는 사실이다. 

 

문제는 for문을 통해 index를 계속 바꾸어주면서 문자열을 출력할 때 일어났다.

예를 들어 "Ilikeyou" (편의상 공백을 제거한 상태의 문자열)에서

"Ili" "lik" "ike" "key" "eyo" "you" 를 배열에 넣고자 한다면 

 

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

public class test01 {
	public static void main(String[] args) {
		
		String str="Ilikeyou";
		List<String> list=new ArrayList<>();
		
		for(int i=0; i<6; i++) {
			
			if(i+3>=str.length()) {
				list.add(str.substring(i));
			}else {
				list.add(str.substring(i, i+3));
			}
		}
        
		System.out.println(Arrays.toString(list.stream().toArray()));
	}
}

 

substring(i,i+3)에서 i+3이 str 문자열의 인덱스를 벗어날 경우를 대비해서 if문을 활용한 코드다.

만약 i<6의 조건을 따라 i의 값이 5가 된다면 i+3은 8이 될 것이고, str 문자열의 길이는 8이지만 

문자열의 마지막 index는 7이기에

 

(수많은 배열 문제를 풀면서 마주친 StringIndexOutOfBoundsException에 세뇌가 된 건지...)  

 

당연히? 안 될거라 생각했다. 

그러다가 우연히 다른 분의 코드 속에서 index를 초과한 substring() 사용을 보게 됐다.

 

따라서

 

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

public class test01 {
	public static void main(String[] args) {
		
		String str="Ilikeyou";
		List<String> list=new ArrayList<>();
		
		for(int i=0; i<6; i++) {
			list.add(str.substring(i, i+3));
		}
		
		System.out.println(Arrays.toString(list.stream().toArray()));
	}
}

 

깔끔.

두번째 인자값이 index 범위를 초과하더라도 상관이 없는 해당 코드가 가능하다.

??

사실 범위를 초과하더라도 아무 상관이 없다라는 건 아니고...

 

public class test01 {
	public static void main(String[] args) {
		
		String str="Ilikeyou";
		
		String result=str.substring(5, 8);
		
		//String result2=str.substring(5, 100);
		
		System.out.println(result);
		//System.out.println(result2);
	}
}

 

주석문 처리한 코드처럼! 

"you"의 값을 원하는 상황에서 str의 길이 8을 넘어서는 값은 인자값으로 가질 수 없다. 

오직 최대범위는 .length() 까지만!!!

 

(처음에는 어떤 값이 들어가도 상관없이 첫번째 인자값 index부터 마지막 인자값 index까지 전달할 수 있을 줄 알았다...

 5,8을 쓰든 5,10을 쓰든 "you"가 나올 줄로만 알았고, 그래서 엄청 대단한 걸 발견했다고 생각했다.) 

 

두번째 인자값 8은 str 문자열의 각 해당 index인 0~7의 범위를 초과하는 것은 맞지만!

우리는 두번째 인자값 8에서 -1 을 한 값을 전달하는 것이기 때문에 결론적으로 substring(5,8)은 

5~7까지의 문자열을 원하는 것이다. 그렇기에 당연히 substring(5,100)에서 원하는 5~99까지의 문자열을 구할 수 없는 것이고... 

오히려 단순하게 생각했다면 아무 생각 없이 substring(start index, end index)을 사용했을 것이다. 어쩌면 해당 index부터 문자열 전체를 잘라서 전달할 때는 substring(start index)을 사용하면 된다고 자연스럽게 머리에 박혀 있어서 이렇게까지 온 건 아닐까 싶기도 하다.

다른 블로그를 보다가 얻은 Tip은 substring(start index, "이곳은") 문자열.length()로 작성하는 걸 습관화 하자이다.

'정리' 카테고리의 다른 글

[Tip] 자바의 Integer.parseInt()  (0) 2024.06.28
[Tip] 자바의 remove()  (0) 2024.05.10
[Regex] 정규 표현식 정리  (0) 2024.05.04
[Git] 명령어 정리  (4) 2024.05.02