💡contains() 메소드
배열 내 데이터의 유무 검색
String[] member = {"AAA", "BBB", "CCC", "DDD"};
String name = "AAA";
if (contains(member, name)) {
System.out.println(name + " 있음");
}
else {
System.out.println(name + " 없음");
}
private static boolean contains(String[] member, String name) {
for(int i=0; i<member.length; i++) {
if (member[i].equals(name)) {
// 발견
return true;
}
}
// 발견 실패
return false;
}
member배열에 name변수에 저장된 문자열 데이터가 저장되어 있는지를 검색하는 소스코드이다.
contains() 메소드를 참조하여 'AAA' 데이터가 있을 경우 true를 반환하며, 없을 경우 false를 반환한다.
💡charAt() 메소드
문자열에서 한 글자씩 추출
System.out.print("아이디: ");
String id = scan.nextLine();
for (int i=0; i<id.length(); i++) {
char c = id.charAt(i);
// 소문자 검증
if (c < 'a' || c > 'z') {
System.out.println("잘못된 문자가 발견되었습니다.");
break;
}
}
System.out.println("종료");
사용자의 ID를 소문자만 입력받을 수 있게 하겠다고 하면, CharAt() 메소드를 이용하여 한 글자씩을 추출하여 문자가 소문자인지 아닌지를 검증할 수 있다.
💡substring() 메소드
문자열에서 여러 글자 추출
// 메소드 오버로딩
// String substring(int beginIndex, int endIndex)
// String substring(int beginIndex)
tring txt = "가나다라마바사아자차카타파하";
System.out.println(txt.substring(3, 7)); // 라마바사
System.out.println(txt.charAt(5)); // '바' > 문자코드값 변환 가능
System.out.println(txt.substring(5, 6)); // "바" > 문자코드값 변환 불가능
charAt() 메소드는 한글자를 뽑아오지만, substring() 메소드는 여러 글자를 한꺼번에 추출할 수 있다는 차이점이 있다.
또한 charAt() 메소드는 문자코드값을 취할 때 사용할 수 있지만, substring() 메소드는 문자코드값을 취할 수 없다.
beginIndex는 포함(inclusive)이고, endIndex는 미포함(exclusive)을 한다.
자바에서는 범위를 나타낼 때, 시작 값은 포함하며 끝 값은 포함하지 않는다는 특징을 알면 이해하기 쉽다.
// 주민번호
String jumin = "970728-2012345";
// 성별 확인
System.out.println(jumin.charAt(7) == '1' ? "남자" : "여자"); // 여자
System.out.println(jumin.substring(7, 8).equals("1") ? "남자" : "여자"); // 여자
위 소스코드에서 charAt과 substring의 사용 결과 모두 동일하지만, 이런 경우에는 charAt을 사용하는 것이 더 용이해 보인다.
파일 경로 확인
String path = "C:\\class\\java\\JavaTest\\Ex34_String.java";
// 1. 파일명 추출 > "Ex34_String.java"
int index = path.lastIndexOf("\\");
String filename = path.substring(index + 1);
System.out.println(filename); // Ex34_String.java
// 2. 확장자 없는 파일명 추출 > "Ex34_String"
index = filename.lastIndexOf(".");
String filenameWithoutExtension = filename.substring(0, index);
System.out.println(filenameWithoutExtension); // Ex34_String
// 3. 확장자 추출 > ".java"
String extension = filename.substring(index);
System.out.println(extension); //.java
substring을 활용하여 파일 경로를 확인할 때 사용할 수 있다.
💡indexOf() 메소드
배열 내 데이터의 위치 검색
String[] member = {"AAA", "BBB", "CCC", "DDD"};
String name = "AAA";
int index = indexOf(member, name);
System.out.println(index);
private static int indexOf(String[] member, String name) {
for(int i=0; i<member.length; i++) {
if (member[i].equals(name)) {
// 발견
return i; // 발견된 위치 == 방번호
}
}
// 발견 실패
return -1;
}
member배열에 name변수에 저장된 문자열 데이터가 저장되어 있다면, 문자열의 위치를 반환하는 소스코드이다.
indexOf()메소드를 참조하여 'AAA' 데이터가 있을 경우 위치값(i)를 반환하며, 없을 경우 -1을 반환한다.
이때 0을 반환하지 않는 이유는 member[0]에 'AAA'가 저장되어 있기 때문이다.
단어가 중복 사용된 경우
String txt = "안녕하세요. Isaac입니다.";
int index = -1;
// 문자 검색
index = txt.indexOf('안');
System.out.println(index); // 0 인덱스의 처음 시작은 0
index = txt.indexOf('I');
System.out.println(index); // 7
index = txt.indexOf('김');
System.out.println(index); // -1 문자가 없을 경우 -1 반환
// 문자열
index = txt.indexOf("Isaac");
System.out.println(index); // 7 문자열일 경우 첫 번째 글자의 인덱스 반환
먼저 txt문장을 가지고 단어의 인덱스의 반환 값을 먼저 확인해보도록 하자.
문자열을 검색할 때, 첫 번째 글자의 인덱스가 반환되는 것을 확인할 수 있다.
// 찾는 단어가 중복 사용되었을 경우
txt = "안녕하세요. Isaac입니다. 반갑습니다. Isaac입니다. 안녕히가세요. Isaac입니다.";
index = txt.indexOf("Isaac");
System.out.println(index); // 7 첫 번째 Isaac만을 찾는다.
// index = txt.indexOf("Isaac", 0); 뒤에 0이 들어있다고 생각하면 된다. 0은 찾기 시작할 위치이다.
// 찾기 시작할 위치를 지정함으로서 두 번째 Isaac과 세 번째 Isaac을 찾을 수 있다.
index = txt.indexOf("Isaac", 10);
System.out.println(index); // 24 두 번째 Isaac을 찾는다.
index = txt.indexOf("Isaac", 25);
System.out.println(index); // 42 세 번째 Isaac을 찾는다.
indexOf() 메소드는 오버로딩이 되어 있다. 따라서 찾으려는 문자열 다음에 찾기 시작할 위치를 지정해 주는 것이 가능하다. 이러한 방법으로 두 번째 Isaac과 세 번째 Isaac을 찾을 수 있다.
index = 0;
for (int i=0; i<3; i++) {
index = txt.indexOf("Isaac", index);
System.out.println("for" + index);
index += 3;
}
for7
for24
for42
for문을 사용하면 Isaac이 3번 사용되었다고 가정할 때, 위치를 모두 찾을 수 있다
하지만 Isaac이 얼마나 들어있을지는 알 수 없으므로 무한루프 사용이 용이한 while로 고친다.
index = 0;
while (true) {
index = txt.indexOf("Isaac", index);
if (index == -1) { // Isaac을 못 찾은 경우
break;
}
System.out.println("while" + index);
index += 3;
}
while7
while24
while42
금칙어가 사용된 경우
String word = "바보";
String content = "당신만을 바라보는 바보가 되어버렸습니다.";
// content에서 word를 찾은 경우 (금지어가 발견된 경우)
if (content.indexOf(word) > -1) {
System.out.println("금지어 발견");
} else {
System.out.println("금지어 발견 못 함");
}
게시판을 사용할 때, 금칙어를 지정해야 하는 경우에는 위와 같은 방법을 활용할 수 있다.
// 금지어가 여러 개인 경우
String[] words = {"바보", "ㅂㅏㅂㅗ", "멍청이", "해삼", "말미잘"};
for (int i=0; i<words.length; i++) {
if (content.indexOf(words[i]) > -1) {
System.out.println("금지어 발견");
break;
}
}
금지어가 여러 개인 경우, 금지어를 모두 검색해야 하므로 else는 사용하지 않는다.
대신에 break를 사용하여 반복분을 빠져나오도록 한다.
indexOf와 lastIndexOf의 차이
txt = "안녕하세요. Isaac입니다. 반갑습니다. Isaac입니다. 안녕히가세요. Isaac입니다.";
// 검색 방향: 왼쪽 > 오른쪽
System.out.println(txt.indexOf("Isaac")); // 7
// 검색 방향: 오른쪽 > 왼쪽
System.out.println(txt.lastIndexOf("Isaac")); // 42
System.out.println(txt.lastIndexOf("Isaac", 21)); // 7
indexOf() 메소드는 왼쪽에서 오른쪽으로 글자를 검색하며, lastIndexOf() 메소드는 오른쪽에서 왼쪽으로 문자를 검색한다는 차이가 있다.