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 |