개발자 미니민의 개발스터디

[JAVA] 자바 - String 클래스 (1) (⭐⭐⭐중요)

by mini_min

[JAVA]
자바 - String 클래스


함수가... 뭐이리 많은거야..ㅎ

머리터질라그래..

 

✔️ String 클래스란?

- 문자열은 내가 나타낸다. 문자열과 관련된 작업도 하는 메소드다.

- 모든 문자열 리터널은 스트링 클래스가 인스턴스로 구현한다고 보면 된다.

- String 클래스 인스턴스 값은 변경 불가!!!❌

- 만약, 문자열이 변경되면 그건 기존 값이 변경된게 아니라, 아예 새로운 String 인스턴스가 만들어진 것이다!!

 

- + 연산으로 결합 가능

- + 연산으로 결합하면 내용이 합쳐진 새로운 인스턴스가 만들어진 것임.

 

 

🏷️ String 클래스 리터널

문자열은 상수풀에 저장되며 동일한 문자열이 존재하면 동일 주소를 반환한다.

String s1 = "seoul";
String s2 = "seoul";		//동일한 주소를 받아냄

//새로운 객체를 생성하여 문자열을 설정
String s3 = new String ("seoul");
		
		System.out.println(s1);	//seoul
		System.out.println(s2); //seoul
		System.out.println(s3); //seoul
		
//주소 비교 
System.out.println(s1 == s2);	//true. 주소 비교. 동일 객체 
System.out.println(s1 == s3);	//false. 주소 비교. 다른 객체 
		
//동일한 객체는 해쉬코드가 같지만 해쉬코드가 같다고 같은 객체는 아니다.

 

◾ 만약, 문자열이 변경되거나 추가되면, s1과 s2 객체는 서로 다르게 되니까 주소값도 달라지겠다.

 

 

 

✔️ String 클래스란?

- 객체에서 '==' 은 주소값을 비교한다. 만약, 문자열 자체를 비교하고 싶으면, object의 equals()를 override 하여 String 클래스에서 equals() 메소드를 사용해서 문자열을 비교할 수 있다. 

 

public static void main(String[] args) {
		//문자열 비교
		
		String s1 = "seoul";
		String s2 = new String("seoul");
		
		System.out.println(s1 == s2); // 객체에서 ==는 주소 비교 false
		
		//object 의 equals() :주소를 비교
		//String 의 equals() : object의 equals()를 override 하여 문자열을 비교
		System.out.println(s1.equals(s2)); 	//문자열을 비교하니까 true!

	}

 

 

 

✔️ 문자열 추출하기 - substring 메소드 

스트링 클래스나 다른 클래스에서도 굉장히 자주 쓰이는 메소드... 바로 '@번째 값에서 @번째 값을 추출할 때' 쓰는 substring() 메소드이다. 배열처럼, 첫번째 숫자는 0부터 시작한다.

 

⭕ substring() 메소드 안에 다른 메소드를 사용해서 특정 문자열부터 시작하는 값 출력도 가능하다.
ex) s1.substring(s1.lastIndexOf(".")+1)
= . 부터 시작하는 문자열을 끝까지 출력

 

 

💡 한 문자만 반환하고 싶을 때 : charAt()

💡 대소문자 구분하지 않을 때 : equalsIgnoreCase("Seoul Korea")

💡 특정 문자열로 시작하는지 볼 때 : startsWith("seoul")

💡 특정 문자열로 끝나는지 볼 때 : endsWith("korea")

💡 문자열을 ASCII 코드로 비교해서 차이 반환할 때 : compareTo()

 

String s1 = "seoul korea";
		String s2;
		int n;
		
		n = s1.length();
		System.out.println("문자열 길이 : " + n); //11
		
		
		//6인덱스부터 8인덱스까지 문자열 추출
		//배열도 0부터 시작하기 때문에 6부터 시작(인덱스는 0부터 시작)
		// substring(s,e) : s인덱스에서 e-1인덱스까지의 문자열
		s2 = s1.substring(6,9);		//end 인덱스 - begin 인덱스 갯수만큼 출력
		System.out.println(s2);  //kor
		
		s2 = s1.substring(6); //6인덱스에서 끝까지 출력
		System.out.println(s2); //korea
		
		
		//문자열에서 특정 한문자 출력하고 싶음
		char c = s1.charAt(6);
		System.out.println(c);
		
		System.out.println(s1.equals("seoul korea"));	//true
		System.out.println(s1.equals("Seoul Korea"));	//false. 대소문자 구분
		System.out.println(s1.equalsIgnoreCase("Seoul Korea")); 
			// true. 대소문자 구분 안함
		
		
		// 문자열이 특정 문자열로 시작하는지 ?
		System.out.println(s1.startsWith("seoul"));
		
		
		// 문자열이 특정 문자열로 끝나는지 ?
		System.out.println(s1.endsWith("korea"));
		
		// 특정 문자열 비교
		// 문자열은 < > == 으로 비교 불가
		// compareTo() : 문자열을 사전식으로 비교하여 차이를 반환(ASCII 코드 차이)
		
		System.out.println(s1.compareTo("seoul corea"));
			// 'k' - 'c' : 8 (c에서 k까지 8차이)
			// aabaaaaaa < abc 
		

	}

}

 

 

 

✔️ 문자열 추출하기 - index0f()

index0f() 메소드특정 문자나 문자열몇번째 인덱스에 존재하는지 '순서 값'을 반환한다.

'@번째 순서부터'  논리가 필요할 때 활용하면 좋은 메소드다.

= 발견 못하면 -1 값을 반환

 

public static void main(String[] args) {

		String s1 = "seoul korea";
		String s2;
		int n;
		
		//index0f() : 특정 문자나 문자열이 몇번째 인덱스에 존재하는지 반환
		// 없으면 -1 
		
		n = s1.indexOf("seo");
		System.out.println(n);	//0. 처음에 위치
		
		n = s1.indexOf("KOR");  //-1. 없으니까
		System.out.println(n);
		
		n = s1.indexOf("ko");
		System.out.println(n);  // 6
		
		n = s1.indexOf("o", 3); //3 인덱스부터 검색
		System.out.println(n);  // 두번째 o 자리가 출력
		
        
		//lastindex0f() : 뒤에서 부터 특정 문자나 문자열이 몇번째 인덱스에 존재하는지 반환
		n = s1.lastIndexOf("o"); //
		System.out.println(n);

 

lastindex0f() 는 인덱스 메소드와 달리, 뒤에서부터 특정 문자나 문자열이 몇번째 있는지 찾아낸다.

 

 

 

✔️ replaceAll() 메소드

문자열을 변경할 때는 replaceAll() 메소드 와 replace() 메소드가 있는데, replaceAll() 메소드는 정규식을 사용할 수 있다. 정규식 패턴에서 <숫자, 공백, 또는> 을 표현하는 것은 차례대로 '\\d' , '\\s' , '|' 이다. 

 

💡 [0-9] : 가로 안에 첫번째 숫자부터 두번째 숫자까지 제거한다는 의미.

💡 [0-9A-Za-z] : 대소문자, 숫자 제거한다는 의미.

💡 \\w : 영문자+숫자를 의미한다.

💡\\W : 영문자+숫자를 제외한 나머지 모두를 의미한다.

 

s1 = "우리나라 대한민국 대한민국 만세";
		// 대한이란 글자만 한글로
		
		s2 = s1.replace("대한", "大韓");	//정규식은 사용불가
		System.out.println(s2);
		
		s2 = s1.replaceAll("대한", "大韓"); //정규식은 사용가능 (정규식 : 패턴)
		System.out.println(s2);
		
		
		// 정규식 패턴 - \\d : 숫자, \\s : 공백(엔터,탭포함), | : 또는 
		s1 = "우리 123 나라 456 대한";
		s2 = s1.replaceAll("\\d", ""); //숫자 제거
		System.out.println(s2);
		
		
		s2 = s1.replaceAll("\\d", "").replaceAll("\\s", "");
		s2 = s1.replaceAll("\\d|\\s", "");//숫자랑 공백 삭제
		System.out.println(s2);
		
		//[0-9] : 숫자
		s2 = s1.replaceAll("[2-5]", ""); //2~5상 숫자 제거
		System.out.println(s2);
		
		
		// 숫자랑 영문자 없애기
		s1 = "우리12나라 ab대한XY민국";
		s2 = s1.replaceAll("[0-9A-Za-z]", ""); //영문자(대소문자), 숫자 제거
		System.out.println(s2);
		
		s2 = s1.replaceAll("\\w", ""); // \\w : 영숫자
		System.out.println(s2);
		
		s2 = s1.replaceAll("\\W", ""); // \\w : 영숫자 제외 나머지 제거
		System.out.println(s2);
		
		
		// 영문자, 숫자, 대한 제거
		s2 = s1.replaceAll("\\w|대한", "");
		System.out.println(s2);
		//[] 안에 있는 글자는 한글자 한글자를 나타낸다.
	

	}

 

 

 

✔️ matches() 메소드

문자열정규식 패턴(위에 참고)과 일치하는지 따져서 참/거짓 값을 반환한다. 

 

💡 \\d{1~3} : 최소 1글자, 최대 3글자 문자열을 의미

💡 ^ : 정규식 패턴에서 시작을 의미한다.

💡 $ : 정규식 패턴에서 마지막을 의미한다.

💡 + : 정규식 패턴에서 +1, '하나 이상'을 의미한다.

 

public static void main(String[] args) {
		String s, p;
		
		boolean b;
		
		//1~3자 이내의 숫자가 있는지 검사
		p = "\\d{1,3}";		//최소 1개, 최대3개 // \\d{8} : 8글자
		s = "12";
		b = s.matches(p); //정규식 패턴에 일치하면 true
		System.out.println(b);
		
		s = "1234";
		System.out.println(s.matches(p)); // false
		
		
		// ^:시작 $:마지막 +:하나이상 
		 p = "^[가-힣]+$";
		 s = "홍ㅋ나";
		 System.out.println(s.matches(p)); // false
		
		 s = "홍길동";
		 System.out.println(s.matches(p)); // true
		 
		 
		 p = "010-\\d{4}-\\d{4}";
		 s = "010-1111-1111";
		 System.out.println(s.matches(p)); // true
		 
		 
		 // 숫자가 아닌 것은 *로 치환 // 아닌 것은 대가로 안에 꺽새^ 주기
		 s = "우리 12 abc 67 & 79";
		 s = s.replaceAll("[^0-9]", "*");	//[^] : 부정
		 System.out.println(s);

 

 

 

✔️ toUpperCase() / trim()  메소드

소문자를 대문자로 변경하고 싶을 때, toUpperCase() 메소드를 사용한다! 메소드 호출 후, 출력하면 소문자에서 대문자가 된 결과를 얻을 수 있고, trim() 메소드는 문자열의 앞부분과 뒷부분 공백을 제거한다. 

 

public static void main(String[] args) {
		String s, s2;
		int n, m;
		
		s = "seoul korea";
		
		s.toUpperCase();	//문자열은 불변하기 때문에 대문자로 변경되지 않는다.
		System.out.println(s); //소문자를 대문자로 바꿈
		

		s = "   자    바    ";
		System.out.println(":"+s+":");
		System.out.println(":"+s.trim()+":"); //왼쪽 오른쪽 공백 제거(가운데는x)
		System.out.println(":"+s.replaceAll("\\s", "")+":");
								//replace는 정규식이 안먹힌다.
		System.out.println(":"+s.replaceAll(" ", "")+":");

 

◾ 가운데 공백은 지울 수 없다는 사실 기억하기!

 

 

 

✔️ String.format() 메소드

String.format() 메소드는 printf() 메소드와 유사하다, 형식을 주고, 인자를 가져와서 문자열로 만들어준다. 

아래에서 볼 수 있는 n 은 정수형 인자인데, String.format() 에 들어가서 문자열이 됨!

 

n = 12345;
	s = String.format("%,d", n); //printf 와 유사
	System.out.println(s);//세 자리마다 컴마
		
	m = 5;
	s = String.format("%1$d %2$d %1$d", n,m);
	System.out.println(s);

 

 

 

✔️ split() 메소드

split() 메소드는 쪼개기! 특정 패턴을 인자로 주면, 그 패턴을 기준으로 문자열을 분리하고 배열로 반환한다.

- 패턴 기준 문자열 쪼개기!

- 배열로 반환!

 

s = "자바,스프링,오라클,HTML";
	String[] ss = s.split(","); // 특정 패턴으로 문자열을 분리하여 배열로 반환
	for(String a : ss) {
		System.out.print(a + " ");
	}
	
    System.out.println();	//split <-분리할 때 사용 (,로 분리하도록 코드짬)

 

◾ 배열로 반환하기 때문에, 배열 변수로 받는다... 향상된 for 문으로 다시 받을 수도 있다.

 

 

 

 

 

블로그의 정보

개발자 미니민의 개발로그

mini_min

활동하기