2월 13, 2024

[Java] substring 총정리/ string index

 Java에서 string의 일부를 보기 위해서는 substring이라는 메서드를 사용해주게 됩니다. 

substring은 string이 주어질 경우, string에서 index를 기준으로 일부를 반환하는 메서드인데요,

이를 위해서는 Java string의 index가 어떻게 계산되는지부터 살펴보아야 합니다.


만약 "AppleBanana" 라는 string이 있다고 해봅시다. 

여기서 A는 0번째 index를 가리키고 하나씩 index가 증가하면서 마지막 a는 10번째 index를 가리킨다고 할 수 있어요. 

가장 첫 번째 문자가 0번째 index라는 것을 기억하는 것이 가장 중요합니다. 

 

그러면 이 경우 substring을 어떻게 적용할 수 있을까요?

substring의 메서드 사용법에는 두 가지가 있습니다. String str이 있다면

1. str.substring(index 숫자) 

2. str.substring(시작index, (끝+1)index)

이런 두가지 기본 형태로 사용할 수 있습니다. 

 

그럼 각각을 어떻게 활용하는지 더 자세히 살펴볼게요.

 



1. index에 있는 문자를 반환하는 경우

String str="Homework";
System.out.println(str.substring(2));

 

위와 같은 Java code가 존재할 때 해당 출력값은 무엇이 될까요?

 

바로 m이 출력될 것입니다. 위에서도 언급했듯이 java index는 0부터 시작하기 때문에 H가 0번째 index, o가 1번째 index, m이 2번째 index가 되는 것입니다. 그래서 2번째 substring에 해당하는 문자인 m을 출력해주는 것이죠. 

 

이렇게 substring의 인자가 한 개만 주어질 경우에는 index에 있는 문자가 return됩니다.



2. start index와 end index가 명시되어 있는 경우 

1번보다 더 많이 사용되는 경우인데요, 바로 substring에 인자값을 두 개를 전달하는 겁니다. 

그럴 경우에 첫번째 parameter로는 시작 index를 주고, 두번째 parameter로는 마지막 index보다 하나 큰 값을 주게 됩니다. 

 

다시 말하면, 

만약

System.out.println(str.substring(0, 4));

위와 같은 코드가 있다면 0번째 index, 1번째 index, 2번째 index, 3번째 index의 문자를 print해주라는 것이고, 마지막 end index라고 표시된 4번째 index의 문자는 print에 해당되지 않는다는 것이죠.

 

즉 start index는 포함되는 반면, 두번째 parameter로 주어진 값의 index는 포함되지 않는 다는 것이 중요한 성질입니다!! 

이것을 모르고 가끔 substring을 의도와 다르게 사용하는 경우가 있습니다. 

 

String str="Apple";
System.out.println(0,3);


위와 같은 코드에서는 출력값이 따라서 App가 될 것입니다. 

왜냐하면 3번째 index인 'l'은 출력되지 않고 그 전 index의 문자까지만 출력이 되기 때문이죠. 


8월 30, 2023

JAVA indexOf 활용법 (indexOf 위치, lastIndexOf)

오늘은 자바 소스에서 자주 보이는 
Java indexOf 문법 활용법에 대해 알아보도록 하겠다. 

1. 찾고자하는String.indexOf (String s) 

indexOf 함수를 쓰고자 할 떄는 내가 찾고자 하는 문자열과 준비된 문자열 이렇게 두 개가 있어야 한다. 

예를 들어, 

 

class Main{
	public static void main(String args[]){
    	String toBeFound = "apple"; //포함되어 있는지 확인할 문자열
        String wholeWords = "orangeapplebanana"; //전체 문자열
        
        System.out.println(toBeFound.indexOf(wholeWords)); //6
        System.out.println(toBeFound.indexOf("Helloooo"); //-1
    }
}

예를 들어, 위 예제를 보면 이해가 잘 될텐데, 
여기서 apple (toBeFound)은 우리가 찾고자 하는 문자열이고 
찾고자 하는 대상은 orangeapplebanana (wholeWords)이다. 

indexOf 함수는 특정 문자나 문자열에서 해당하는 문자의 인덱스 값을 반환한다. 

따라서 첫 번째 예제인, 

 

System.out.println(toBeFound.indexOf(wholeWords)); //6

여기서는 apple이 가장 먼저 시작되는 6번째 자리를 가져오게 된다. 

Java는 0번째 index부터 따지게 되고, indexOf의 경우 찾으려는 문자열이 1자리가 아니더라도 가장 처음 자릿수를 가져오게 된다는 점을 기억하면 된다. 

 

indexOf의 경우에는 찾고자 하는 문자열이 없을 경우 -1 을 return 한다는 점을 활용하면 찾고자 하는 문자열이 여러개이더라도 쉽게 이를 걸러낼 수 있다. 

 

class Main{
	public static void main(String args[]){
        System.out.println("[banana, apple]".indexOf("grape")); //-1
    }
}

 

위 코드와 같이 내가 전체 String에서 banana와 apple이 둘다 없는지를 검사하고 싶다면 코드를 두 줄로 쓰지 않고 한 줄로 가능하다. 

 

"grape"라는 String에 banana도 없고 apple도 없다면 -1을 return 할 것이기 때문이다. 

 

이런식으로 편리하게 로직을 짜서 사용할 수 있다. 


 

2. indexOf ("찾을 문자열" , "시작위치")

 

첫 번째 indexOf에서는 특정 String을 찾더라도 가장 처음 위치를 반환한다. 즉 "a,b,c,d"라는 string에서 내가 ","의 위치를 찾고 싶을 때 가장 처음 쉼표의 위치인 1을 return하는 것이다. 

 

만약 indexOf 의 두 번째 인자의 시작위치를 주게 되면 시작위치부터 문자열을 찾게 된다. 


3. lastIndexOf("찾을 string ") /  lastIndexOf("찾을 문자열", "시작 위치")

기본적으로 lastIndexOf는 indexOf와 사용법은 유사하나 

String의 뒤에서부터 탐색을 시작한다는 것이 차이점이다. 

 

뒤에서부터 문자열 탐색을 시작하더라도 index는 마지막 자리가 0인 것은 아니다. 

class Main{
	public static void main(String args[]){
        System.out.println("o".indexOf("Helloo"); //5
    }
}

이 경우 string의 가장 마지막부터 탐색을 시작하기 때문에 가장 마지막 o를 가져오는데 

index의 경우에는 H가 0부터 시작한다는 점은 동일하다.

 

따라서 가장 마지막 o의 index인 5를 가져오게 된다.