String 클래스
- java.lang 패키지에 포함
- 문자열을 나타냄
- 스트링 리터럴은 자바 컴파일러에 의해 모두 String 객체로 처리
//다양한 방법으로 String 객체 생성 가능
//스트링 리터럴로 String 객체 생성
String str1 = "abcd";
//String 클래스의 생성자를 이용하여 String 객체 생성
char data[] = {'a', 'b', 'c', 'd'};
String str2 = new String(data);
String str3 = new String("abcd"); //str2, str3 모두 "abcd" 문자열
String 생성자
스트링 리터럴과 new String()
- 스트링 리터럴과 new String()으로 생성된 스트링 객체는 서로 다르게 관리됨
- 스트링 리터럴은 JVM 이 관리, 응용프로그래램 내에서 공유
- new String()으로 생성된 스트링은 힙 메모리에 생성됨
※스트링 객체는 수정 불가
- 리터럴이든 new String()이든 일단 생성된 스트링 객체는 수정이 불가능
String s = new String("Hello");
String t = s.concat("Java"); //스트링 s에 "Java"를 덧붙인 새로운 스트링 객체 리턴
- 위 코드를 실행하면 s.concat()는 "HelloJava"를 리턴하며 t가 이를 가리킴
- s가 수정된 것이 아니라 새로운 스트링 객체가 리턴된 것이므로 s는 여전히 "Hello"를 가리킴
- 한번 만들어진 스트링은 수정이 불가하므로 스트링이 공유되어도(위 그림의 a, c처럼) 문제x
String 활용
문자열 비교: int compareTo(String anotherString)
- 문자열이 같으면 0을 리턴하는 메소드
- 기준 문자열이 비교할 문자열(anotherString)보다 사전에 먼저 나오면 음수 리턴
- 기준 문자열이 사전에 나중에 나오면 양수 리턴
String java = "Java";
String cpp = "C++";
int res = java.compareTo(cpp);
if(res==0) System.out.println("same");
else if(res<0) System.out.println("java+"<"+cpp);
else System.out.println(java+">"+cpp);
//실행 결과: Java>C++
- J가 C보다 사전에서 뒤에 나오므로 res는 양수
- 문자열 순서를 비교할 필요가 없을 때는 equals() 메소드 사용을 추천
문자열 연결: String concat(String str)
+ 연산의 피연산자에 문자열이나 객체가 포함된 경우
- 객체는 객체.toString() 메소드를 호출하여 문자열로 변환한 후 연결
- 기본 타입 값은 해당 값을 문자열로 변환하여 연결
String concat(String str)을 이용하여 연결
"I love".concat("Java")
//실행 시 "I love Java" 리턴
- 기존 String 객체에 연결되지 않고 새로운 스트링 객체 리턴
String s1 = "abcd";
String s2 = "efgh";
s1=s1.concat(s2);
- concat()은 새로운 문자열을 생성
- s1.concat(s2)는 새로운 스트링 객체인 "abcdefgh"를 리턴하고 s1이 이를 가리킴
문자열 내 공백 제거: String trim()
String a = " abcd def ";
String b = " xyz\t";
String c = a.trim(); // c = "abcd def", 문자열 중간의 공백은 제거하지 않음
String d = b.trim(); // d = "xyz", 스페이스와 '\t' 모두 제거됨
문자열의 문자: char charAt(int index)
String a = "class";
char c = a.charAt(2); // c='a'
- 문자열의 특정 위치에 있는 문자를 알아냄
int count = 0;
String a = "class";
for(int i=0; i<a.length(); i++){
if(a.charAt(i)=='s')
count++;
}
}
- 이를 응용해 문자열 내에 특정 문자가 몇 개 있는지 알아낼 수 있음
예제 6-7 String 클래스의 활용 예
public class StringEx {
public static void main(String[] args) {
String a=new String(" C#");
String b=new String(",C++ ");
System.out.println(a+"의 길이는 "+a.length()); //문자열 길이
System.out.println(a.contains("#")); //a에 '#'이 포함되었는지
a=a.concat(b); //문자열 연결-a에 b를 연결한 새로운 문자열 리턴
System.out.println(a);
a=a.trim(); //문자열 앞뒤 공백 제거(중간 공백 제거x)
System.out.println(a);
a=a.replace("C#", "Java"); //문자열 대치
System.out.println(a);
String s[]=a.split(","); //','을 기준으로 문자열 분리
for(int i=0; i<s.length; i++) {
System.out.println("분리된 문자열 "+(i+1)+": "+s[i]);
}
a=a.substring(5); //인덱스 5부터 끝까지의 substring 리턴
System.out.println(a);
char c=a.charAt(2);
System.out.println(c); //인덱스 2의 문자 리턴
}
}
'java > 개념' 카테고리의 다른 글
StringTokenizer 클래스 (0) | 2024.06.07 |
---|---|
StringBuffer 클래스 (0) | 2024.06.07 |
박싱과 언박싱 (0) | 2024.06.04 |
Object 클래스 (0) | 2024.06.02 |
JDK에서 제공하는 패키지 (0) | 2024.06.02 |