[Java Programming] 7.2 String
String
- 문자열을 할당할수있는 Java의 내장 클래스
- 문자열을 간편히 제어할 수 있도록 많은 인스턴스 메소드를제공
ex) String name = "":
name+ "." 누르면 contents assist 창이 나옴
String은 생성자 없이 데이터를 할당 할 수 있다
String 인스턴스에 값을 할당할 때, 생성자를 사용하지 않는다.( Java에서 아주 많이 사용되므로, 간편히 사용할 수 있도록 JVM이 지원하고 있기 때문)
자주 사용하는 String methods
파라미터2 없다면 '끝'까지 라는 의미, (파라미터2값은 인덱스+1 주의)
trim | Instance | - | - | 문자열 좌 / 우 공백제거
- trim 사용 예시
"공백 ID 공백".trim() -> "ID"
" 공백 I 공백 D 공백 ".trim() -> "I 공백 D" (가운데 공백 제거는 replace로 해야됨)
ex) "공백 admin" -> "admin"
- subString은 IndexOf 와 lastIndexOf와 함께 자주 사용됨 (날짜에 많이 사용)
- endswith 는 확장자 검사할때 ex)pdf 등 자주 사용함
- indexOf 에서 없는값을 찾으면 : -1 이 나옴
- length : ex) password 최소 몇글자 최대 몇글자 판단할때 사용
- 아무 타입에다가 +"" 해주면 문자가 됨 ex) 1 + '' / 0.14 + "" / true + "" -> 문자가 됨
- reference type에서 == 의 의미는 메모리 주소가 같은지를 비교하는것(문자열이 같은지는 판단 x, 문자열비교는 equals로 하기)
문자열비교(Reference)는 반드시 .equals()로 비교하기
- 문자열 비교
String str1 = "한글"; // Reference Type (메모리주소 가지고 다님)
String str2 = "한글"; // Reference Type (메모리주소 가지고 다님)
System.out.println(str1==str2); // true
--> 여기서 str1 == str2 -> 메모리 주소가 같은지 판단하는 것
--> 디버깅 해보면 str1의 id=23, str2의 id = 23 으로 메모리 주소가 동일함
2. 사용자가 입력한(scanner) 문자열 비교 (사용자에게 입력받은 데이터는 같은 입력값을 받아도 다른 메모리가 나옴)
String str3 = keyboard.nextLine(); //'한글' 입력
String str4 = keyboard.nextLine(); //'한글' 입력
System.out.println(str3==str4); // true -> 메모리 주소 비교
System.out.println(str3.equals(str4)); // 값을 비교
정규표현식 (자주쓰는 표현)
- ^ : 시작한다
- [ ] 대괄호 : 그룹지정자 -> [0-9] = 0부터 9 중 한글자
- + : 한개이상 있는가
- $ : 끝난다
- 그룹지정자 안에있는 ^ : ~빼고
ex) ^[0-9]+$ : 0~9 숫자로 시작해서 숫자로 끝나는가
ex) replaceAll("[^0-9]", "") : 숫자빼고 나머지를 공백으로 바꿔라
자주쓰는 String methods 사용예시
package string_exercise;
public class StringEx {
public static void main(String[] args) {
String address = "서울특별시 서초구";
// 1. contains : address에 포함되어있는지
boolean isSeoul = address.contains("서울");
System.out.println(isSeoul); //true
// 2. endsWith : ~로 끝나는지
isSeoul = address.endsWith("서초구");
System.out.println(isSeoul); // true
//3. equals (대소문자 구분함) : 정확히 같은지
String name = "University";
boolean isEqual = name.equals("university");
System.out.println(isEqual); //false
//4. equalsIgnoreCase (대소문자 구분안함)
isEqual = name.equalsIgnoreCase("university");
System.out.println(isEqual); //true
String alphabets = "abcdef";
//5. indexOf : 문자의 인덱스 찾기
int letterCIndex = alphabets.indexOf('c');
System.out.println(letterCIndex); //2
int letterDEFIndex = alphabets.indexOf("def");
System.out.println(letterDEFIndex); //3
String message = "abcdefghijklmnop";
//6. lastIndexOf : 문자의 마지막 인덱스 찾기
int letterALastIndex = message.lastIndexOf("a");
System.out.println(letterALastIndex); //0
letterALastIndex = message.lastIndexOf("jj");
System.out.println(letterALastIndex);//-1 (없는값을 찾으면 -1 나옴)
//7. length : 문자열 길이 구하기
int length = message.length();
System.out.println(length); //16
//8. matches : 문자열 형태 확인하기
String phone = "+82-010-1234-1234";
boolean isNumber = phone.matches("^[0-9]+$");
System.out.println(isNumber); //false
//9. replace : 문자열 찾아 바꾸기
String sentance = "안녕하세요, 홍길동님, 안녕히가세요,홍길동님.";
String replacedSentance = sentance.replace("홍길동", "ktds");
System.out.println(replacedSentance); //안녕하세요, ktds님, 안녕히가세요,ktds님.
//10. replaceAll : 문자열 찾아 바꾸기(정규표현식 지원)
// String phone = "01012341234";
phone = phone.replaceAll("[^0-9]", ""); //숫자가아닌 문자를 공백문자로 변경
System.out.println(phone); //8201012341234
//11. startsWith : 파라미터로 시작하는지 확인
// String phone = "8201012341234";
boolean isKoreanNum = phone.startsWith("82");
System.out.println(isKoreanNum); //true
String datetime = "2023-06-08 13:23:23";
//12. substring : 문자열 잘라냄
String year = datetime.substring(0,4);
System.out.println(year); //2023
//datetime에서 13(시) 만 잘라내어 할당
String hour = datetime.substring(11,13);
System.out.println(hour); //13
//datetime에서 시분초 글자만 잘라내어 할당
String time = datetime.substring(11);
System.out.println(time); //13:23:23
//13. trim : 문자열 좌 / 우 공백제거
String dateTime = " 2023-02-02 14:14:14 ";
System.out.println(dateTime.length()); //22
System.out.println(dateTime); // 2023-02-02 14:14:14
dateTime = dateTime.trim();
System.out.println(dateTime.length()); //19
System.out.println(dateTime); //2023-02-02 14:14:14 (문자열 앞뒤 공백제거됨)
//14. int 타입 1을 문자열로 변경하기(Overloading)
String iStr = String.valueOf(1); //int 형 1
System.out.println(iStr); //문자열 1 반환
// 15. int/boolean 등 아무타입에다가 +"" 해줘도 문자가 됨
iStr = 1 + "";
System.out.println(iStr); //문자열 1 반환
}
}
Scanner와 while 이용한 끝말잇기 게임 만들기
import java.util.Scanner;
public class wordTowordGame {
public static void main(String[] args) {
String startWord = "자전거";
System.out.println("시작단어는 '자전거' 입니다.");
Scanner scanner = new Scanner(System.in);
int count = 0;
while (true) {
System.out.println("다음 단어를 입력해 주세요");
String nextWord = scanner.nextLine();
nextWord = nextWord.trim();
String startWordLastWord = startWord.substring(2);
String nextWordFirstWord = nextWord.substring(0,1); //length -1 해줘도 됨
int lenNextWord = nextWord.length();
// if (lenNextWord >= 3) {
// if ( startWordLastWord.equals(nextWordFirstWord)) {
// startWord = nextWord;
// count++;
// }
// else {
// System.out.println("이어나간 단어의 수: " + count);
// break;
// }
// }else {
// System.out.println("이어나간 단어의 수: " + count);
// break;
// }
// }
if (lenNextWord < 3) {
break;
}
if ( startWordLastWord.equals(nextWordFirstWord)) {
startWord = nextWord;
count++;
}
else {
break;
}
}
System.out.println("이어나간 단어의 수: " + count);
}