[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 문으로 다시 받을 수도 있다.
'Java' 카테고리의 다른 글
[JAVA] 자바 - StringTokenizer 클래스 이해하기! (0) | 2022.07.24 |
---|---|
[JAVA] 자바 - StringBuilder, StringBuffer 클래스 (0) | 2022.07.24 |
[JAVA] 자바 - Calendar 클래스 (달력 만들기, 나이 구하기) (0) | 2022.07.21 |
[JAVA] 자바 - Wrapper class 란? 개념 정리 (0) | 2022.07.20 |
[JAVA] 자바 - 기본 API 클래스 (import, static import, object, equals) (0) | 2022.07.20 |
블로그의 정보
개발자 미니민의 개발로그
mini_min