String 클래스
- 문자열 데이터를 처리하는 클래스
- 리터럴을 사용하여 문자열을 직접 생성하거나(추천!) new 연산자를 사용한 인스턴스 생성 시 생성자에 문자열을 전달하여 생성
- 리터럴 사용 시 해당 문자열 존재 여부를 상수풀에서 검사한 후 중복되는 문자열이 없으면 생성, 중복될 경우 주소값을 리턴하므로 메모리 공간 낭비가 줄어들게 됨
- new 연산자 사용 시 문자열 중복 여부와 무관하게 문자열 객체 생성
- 문자열 내용 비교 시 동등비교(==) 연산보다 equals() 메서드 사용
- 문자열을 생성하면 String 클래스 내부적으로 char[]로 관리됨
- 개발자의 편의를 위해 별도의 String 클래스를 만들어서 제공
- 배열 형태이므로 배열 인덱스와 동일한 인덱스 번호를 사용 (첫 글자 인덱스 0번, 마지막 글자 인덱스는 문자열 길이 -1)
String 클래스의 메서드
- 문자열 수정, 검색, 치환 등 다양한 작업을 수행하는 메서드를 제공
- String 객체는 불변객체이므로 원본 문자열을 수정하지 않고 각종 작업을 수행할 경우 수정된 데이터를 문자열로 새로 생성함
- 문자열 수정이 빈번할 경우에는 메모리 낭비가 심하므로 StringBuilder 또는 StringBuffer 클래스를 활용해야함
length()
문자열 길이(문자열을 분리해놓은 배열 크기) 리턴
String s1 = "Java programming";
System.out.println("s1.length : " +s1.length());
✔️결과 : s1.length : 16
equals()
문자열 비교(대소문자 구별)
String s1 = "Java programming";
System.out.println("s1.equals(JAVA PROGRAMMING) : " + s1.equals("JAVA PROGRAMMING"));
System.out.println("s1.equals(Java programming) : " + s1.equals("Java programming"));
✔️결과 :
s1.equals(JAVA PROGRAMMING) : false
- s1.equals(Java programming) : true
equalsIgnoreCase()
문자열 비교(대소문자 구별X)
String s1 = "Java programming";
System.out.println("s1.equalsIgnoreCase(JAVA PROGRAMMING) : " + s1.equalsIgnoreCase("JAVA PROGRAMMING"));
✔️결과 : s1.equalsIgnoreCase(JAVA PROGRAMMING) : true
charAt()
특정 인덱스에 위치한 문자 1개 리턴
String s1 = "Java programming";
System.out.println("s1.charAt(5) : " + s1.charAt(5));
✔️결과 : s1.charAt(5) : p
substring()
특정 범위 문자열(=부분 문자열) 추출
- substring(int beginIndex) : 시작 인덱스부터 끝까지 분자열 추출
String s1 = "Java programming";
System.out.println("s1.substring(5) : " + s1.substring(5));
- substring(int beginIndex, int endIndex) : 시작인덱스 ~ 끝인덱스 -1까지 추출
String s1 = "Java programming";
System.out.println("s1.substring(5,11) : " + s1.substring(5,11));
System.out.println("s1.substring(5,12) : " + s1.substring(5,12));
✔️결과 :
s1.substring(5) : programming s1.substring(5,11) : progra
s1.substring(5,12) : program
concat()
문자열 결합
String s1 = "Java programming";
System.out.println("s1.concat(!) : " + s1.concat("!"));
✔️ 결과 : s1.concat(!) : Java programming!
System.out.println(s1 + "!");
두 코드는 같은 결과를 나타내는데 concat() 을 사용하는 이유는 결합(연결)연산자보다 연산 속도 빠르기 때문이다.
indexOf()
특정 문자 또는 문자열의 인덱스 리턴
➡️문자열의 첫번째 인덱스부터 탐색 ➡️ 탐색할 문자 또는 문자열이 존재하지 않을 경우 -1 리턴
System.out.println("s1.indexOf('a') : " + s1.indexOf('a'));
✔️결과 : 1
➡️앞에서부터 문자 a를 탐색하여 처음 만나는 인덱스 1 리턴
System.out.println("s1.indexOf('x') : " + s1.indexOf('x'));
✔️ 결과 : -1
➡️ 존재하지 않는 문자이므로 -1 리턴
System.out.println("s1.indexOf(Program) : " + s1.indexOf("Program"));
✔️ 결과 : 5
➡️앞에서부터 문자열 "Program"을 탐색하여 시작 인덱스 5 리턴
lastIndexOf()
문자열 탐색 시 뒤에서부터 탐색하여 인덱스 리턴
➡️탐색 순서를 역순으로 할 뿐, 인덱스 번호 자체가 바뀌지는 않음
System.out.println("s1.lastIndexOf('a') : " + s1.lastIndexOf('a'));
✔️결과 : 10
➡️뒤에서부터 문자 a를 탐색하므로 "Java Programming"의 Program 부분의 a가 탐색되어 인덱스 번호 10 리턴
replace()
특정 문자 또는 문자열 치환
➡️동일만 문자 또는 문자열이 존재할 경우 모두 치환
System.out.println("s1.replace('a', '@') :" + s1.replace('a', '@'));
✔️결과 : J@v@ progr@mming
➡️소문자 a 를 찾아 모두 @ 기호로 치환하므로 "Java Programming" -> "J@v@ Progra@mming”
System.out.println("s1.replace(a, @) : " + s1.replace("a", "@"));
✔️결과 : J@v@ progr@mming
➡️char 타입 대신 String 타입 문자열도 지정 가능
System.out.println("s1.replace(Java, Python) : " + s1.replace("Java", "Python"));
✔️결과 : Python programming
toUpperCase(), toLowerCase()
System.out.println("s1.toUpperCase() : " + s1.toUpperCase());
System.out.println("s1.toLowerCase() : " + s1.toLowerCase());
✔️결과 :
s1.toUpperCase() : JAVA PROGRAMMING s1.toLowerCase() : java programming
trim()
문자열 앞 뒤의 불필요한 공백 제거
➡️주의! 문자열 사이의 공백은 제거하지 않음
String s2 = " 땅콩이 귀여워 ";
System.out.println("안녕하세요 " + s2 + "~~!");
System.out.println("안녕하세요 " + s2.trim() + "~~!");
✔️결과 :
안녕하세요 땅콩이 귀여워 ~~!
contains()
문자열 포함 여부 리턴
String s2 = " 땅콩이 귀여워 ";
System.out.println("s2.contains(땅콩) : " + s2.contains("땅콩"));
System.out.println("s2.contains(호두) : " + s2.contains("호두
✔️결과 :
s2.contains(땅콩) : true s2.contains(호두) : false
split()
특정 기준으로 문자열 분리
➡️분리된 문자열은 배열로 관리됨 ➡️분리에 사용되는 기준 문자열을 구분자(= 분리자, Delimeter) 라고 함 ➡️구분자를 지정하는 규칙은 정규표현식을 따름(나중에 배움) ➡️문자열을 "/" 기호를 기준으로 분리하여 배열로 관리 가능
String s3 = "자바/JSP/클라우드";
String[] subjectArr = s3.split("/");
for(int i = 0; i < subjectArr.length; i++) {
System.out.println(subjectArr[i]);
}
➡️문자열을 "/" 기호 기준으로 분리하여 String[] 배열 타입으로 리턴
➡️"자바", "JSP", "클라우드" 형태로 분리되어 배열에 저장됨
✔️결과 :
자바 JSP 클라우드
만약, "." 기호를 구분자로 지정하는 경우 정규표현식에서 특수기호로 사용되어 모든 문자를 구분자로 지정하게 됨
➡️모든 문자가 분리 기준이 되어 제거됨
String s4 = "안녕하세요. 자바 프로그래밍입니다.";
String[] strArr = s4.split("."); // 모든 문자열이 제거되므로 사용 불가
for(int i = 0; i < strArr.length; i++) {
System.out.println(strArr[i]);
}
결과가 안뜸
그렇다면, 정규표현식 규착에 따라 . 기호를 구분자로 지정해야할 경우 \\. 사용하면 된다.
String[] strArr = s4.split("."); // 모든 문자열이 제거되므로 사용 불가
for(int i = 0; i < strArr.length; i++) {
System.out.println(strArr[i]);
}
'JAVA' 카테고리의 다른 글
[JAVA] Wrapper 클래스 (0) | 2023.10.17 |
---|---|
[JAVA] StringBuffer와 StringBuilder (0) | 2023.10.17 |
[JAVA] String 객체 - 문자열 생성 방법 두 가지 (0) | 2023.10.11 |
[JAVA] toString() 메서드 (0) | 2023.10.11 |
[JAVA] object 클래스 (0) | 2023.10.11 |