Java

[Java Programming] 7.2 String

코딩펭귄 2024. 1. 25. 13:51

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" 

- subStringIndexOflastIndexOf와 함께 자주 사용됨 (날짜에 많이 사용)

- endswith 는 확장자 검사할때 ex)pdf 등 자주 사용함

- indexOf 에서 없는값을 찾으면 : -1 이 나옴

- length : ex) password 최소 몇글자 최대 몇글자 판단할때 사용

- 아무 타입에다가 +"" 해주면 문자가 됨  ex) 1 + '' / 0.14 + "" / true + "" -> 문자가 됨

- reference type에서 == 의 의미는 메모리 주소가 같은지를 비교하는것(문자열이 같은지는 판단 x, 문자열비교는 equals로 하기)

문자열비교(Reference)는 반드시 .equals()로 비교하기
  1. 문자열 비교
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);
}