도도한 개발자
[Java] #15-3. String - indexOf(), 값 추출하기 본문
* 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
그럼 이만.
'Backend > Java' 카테고리의 다른 글
[Java] #16. Nested class, 내부 클래스 (0) | 2022.03.24 |
---|---|
[Java] #15-4. String - 값을 바꾸는 메소드 (0) | 2022.03.23 |
[Java] #15-2. String - nullCheck, 비교/검색 (0) | 2022.03.18 |
[Java] #15-1. String - String의 생성자 (0) | 2022.03.17 |
[Java] #14. 예외 (Exception) (0) | 2022.03.16 |