도도한 개발자

[Java] #15-3. String - indexOf(), 값 추출하기 본문

Backend/Java

[Java] #15-3. String - indexOf(), 값 추출하기

Kiara Kim 2022. 3. 19. 18:00

* String내에서 위치 찾기

리턴 타입 메소드 이름 및 매개 변수
int indexOf(int ch)
indexOf(int ch, int fromIndex)
indexOf(String str)
indexOf(String str, int fromIndex)
lastIndexOf(int ch)
lastIndexOf(int ch, int fromIndex)
lastIndexOf(String str)
lastIndexOf(String str, int fromIndex)

 

indexOf() 메소드는 String 클래스의 가장 많이 사용되는 메소드 중 하나다. 

 

· indexOf() 는 앞에서부터(가장 왼쪽부터) 문자열이나 char를 찾으며,

· lastIndexOf()는 뒤에서부터(가장 오른쪽부터) 찾는다.

 

 

* String의 값 일부 추출하기

 

문자열의 위치를 왜 찾을까? 보통 그 위치부터 어떤 값을 추출해 내거나, 그 값이 존재하는지를 확인할 때 사용한다. 값을 추출하는 메소드의 종류는 다음과 같이 구분할 수 있다.

 

· char 단위의 값을 추출하는 메소드

· char 배열의 값을 String으로 변환하는 메소드

· String의 값을 char 배열로 변환하는 메소드

· 문자열의 일부 값을 잘라내는 메소드

· 문자열을 여러 개의 String 배열로 나누는 메소드

 

 

** char 단위의 값을 추출하는 메소드

리턴 타입 메소드 이름 및 매개 변수 설명
char charAt(int index) 특정 위치의 char 값을 리턴한다.
void getChars(int srcBegin, int srcEnd, char[] dst, int dstBegin)  매개 변수로 넘어온 dst라는 char 배열 내에 srcBegin에서 srcEnd에 있는 char를 저장한다. 이때 dst 배열의 시작위치는 dstBegin이다.
int codePointAt(int index) 특정 위치의 유니코드 값을 리턴한다. 리턴 타입은 int지만, 이 값을 char로 현 변환하면 char 값을 출력할 수 있다.
int codePointBefore(int index) 특정 위치 앞에 있는 char의 유니코드 값을 리턴한다. 리턴 타입은 int지만, 이 값을 char로 형 변환하면 char 값을 출력할 수 있다.
int codePointCount(int beginIndex, int endIndex) 지정한 범위에 있는 유니코드 개수를 리턴한다.
int offsetByCodePoints(int index, int codePointOffset) 지정된 index부터 오프셋이 설정된 인덱스를 리턴한다.

 

마지막의 offsetByCodePoints() 메소드는 문자열 인코딩과 관련된 문제를 해결하기 위해 사용된다. 이 중 가장 많이 사용하는 메소드는 charAt() 메소드다. 

 

 

** char 배열의 값을 String으로 변환하는 메소드

 

리턴 타입 메소드 이름 및 매개 변수 설명
static String copyValurOf(char[] data) char 배열에 있는 값을 문자열로 변환한다.
static String copyValurOf(char[] data, int offset, int count) char 배열에 있는 값을 문자열로 변환한다. 단 offset 위치부터 count까지의 개수만큼만 문자열로 변환한다.

 

이 메소드는 static 메소드이기 때문에 현재 사용하는 문자열을 참조하여 생성하는 것이 아닌, static하게 호출하여 사용해야 한다. 다음과 같이 사용한다.

 

char values[] = new char[]{'J', 'a', 'v', 'a'};
String javaText = String.copyValueOf(values);

 

 

** String의 값을 char 배열로 변환하는 메소드

 

리턴 타입 메소드 이름 및 매개 변수 설명
char[] toCharArray() 문자열을 char 배열로 변환하는 메소드

 

어떤 String 객체를 만들더라도, 그 객체는 내부에 char 배열을 포함한다. 

 

 

** 문자열의 일부 값을 잘라내는 메소드

 

리턴 타입 메소드 이름 및 매개 변수 설명
String substring(int beginIndex) beginIndex부터 끝까지 대상 문자열을 잘라 String으로 리턴한다.
String substring(int beginIndex, int endIndex) beginIndex부터 endIndex까지 대살 문자열을 잘라 String으로 리턴한다.
CharSequence subSequence(int beginIndex, int endIndex) beginIndex부터 endIndex까지 대상 문자열을 잘라 CharSequence 타입으로 리턴한다.

 

위의 메소드들은 자바에서 문자열을 다룰 때 indexOf()와 더불어 가장 많이 사용하는 메소드 중 하나다. "Java technology"라는 문자열이 있을 때, "technology"라는 단어만 추출하려고 할 때 다음과 같이 substring()메소드를 사용하면 된다.

 

public void checkSubstring() {
	String text = "Java technology";
    String technology = text.substring(5);
    System.out.println(technology);
}

 

위 예제처럼 substring() 메소드에 5라는 하나의 정수 값만 지정하면 5번째부터 text 문자열이 끝날 때까지를 모두 잘라내라는 의미다. 근데 만약 tech라는 단어만 잘라내고 싶을 땐 어떻게 해야 할까? 다음의 소스를 보자.

 

String tech = text.substring(5, 4);
System.out.println(tech);

 

결과는 어떨까?

 

Exception in thread "main" java.lang.StringIndexOutOfBoundsException: begin 5, end 4, length 15
	at java.base/java.lang.String.checkBoundsBeginEnd(String.java:3319)
	at java.base/java.lang.String.substring(String.java:1874)
	at chapter15.StrCheck.checkSubstring(StrCheck.java:60)
	at chapter15.StrCheck.main(StrCheck.java:17)

 

예외가 발생한다. 앞에서 설명한 표를 잘 보면 첫 번째 매개 변수는 beginIndex이고, 두 번째 매개 변수는 데이터의 길이가 아닌 substring이 끝나는 위치를 말한다. 따라서 끝나는 위치를 5 + 4인 9로 해야한다.

 

String tech = text.substring(5, 9);

 

 

** 문자열을 여러 개의 String 배열로 나누는 메소드

 

리턴 타입  메소드 이름 및 매개 변수 설명
String[] split(String regex) regex에 있는 정규 표현식에 맞춰 문자열을 잘라 String의 배열로 리턴한다.
String[] split(String regex, int limit) regex에 있는 정규 표현식에 맞춰 문자열을 잘라 String의 배열로 리턴한다. 이때 String 배열의 크기는 limit보다 크면 안된다.

 

자바에서 문자열을 여러 개의 문자열 배열로 나누는 방법은 String 클래스에 선언된 split() 메소드를 사용하는 것과 java.util.StringTokenizer라는 클래스를 사용하는 것이다. 후자는 나중에 알아보고 전자의 예시를 보자.

 

public void checkSplit() {
	String text = "Java technology is both a programming language and a platform";
	String[] splitStr = text.split(" ");
	for(int i = 0; i < splitStr.length; i++) {
		System.out.println("index " + i + " : " + splitStr[i]);
	}
}

 

text에 있는 문자열을 공백으로 나누어 splitStr이라는 String 배열에 담았다. 그리고 각각의 값들을 출력했다. 결과는 다음과 같다.

 

index 0 : Java
index 1 : technology
index 2 : is
index 3 : both
index 4 : a
index 5 : programming
index 6 : language
index 7 : and
index 8 : a
index 9 : platform

 

그럼 이만.