String 클래스
CharSequence가 상위 클래스로 있고
이를 String, StringBuffer, StingBuilder가 상속하여 구현한다.
String은 변경 불가능!!
즉, String x= "Hello";
에 x += " World"; 를 하면 x 자체가 바뀐게 아니라 x가 새로운 "Hello World" 객체의 레퍼런스를 가지는 것이다.
CharSequence vs String
CharSequence 인터페이스 -> 구현은 안 되어있음
문자열을 처리를 위한 인터페이스
CharSequence 인터페이스를 구현 -> String, StringBuffer, StringBuilder 클래스
charAt(int index), length(), toString(), compare(), subSequence() 함수 등이 구성되어 있다.
String 클래스 - CharSequence, Serializavle, Comparable 인터페이스를 구현한 클래스
변경이 불가능 : immutable 클래스 (final)
public final class String
imolements java.io.Seiralizable, Comparable<String>, CharSequence, Constable, ConstantDecs{...}
-> 상속도 안 됨 (final class)
CharSequence와 String 메소드 비교
CharSequence에 있는 메소드가 String에서 구체화
int length();
char charAt(int index);
public String toString();
public String toString()
{
return this; // print가 String클래스와 Object 클래스를 따로 처리
}
CharSequence subSequence(int start, int end);
CharSequence와 String 변환
String -> CharSequence 변환
String이 CharSequence 인터페이스를 구현한 클래스
단순히 upcasting해주면 됨 -> 묶어서 처리하려고
CharSequence -> String 변환
toString() 호출
String str = "Hello String";
CharSequence cs;
cs = str; // String ->charSequence 변환
System.out.println("CharSequence: " + cs);
str = cs.toString(); // CharSequence -> String 변환 : toString() 호출
System.out.println("String " + str);
둘 다 Hello String 출력
String의 특징과 객체 생성
String - java.lang.String
String 클래스는 하나의 문자열 표현
// 스트링 값으로 스트링 객체 생성
String str1 = "abcd";
// String 클래스의 생성자를 이용하여 스트링 생성
char data[] = {'a', 'b', 'c', 'd'};
String str2 = new String(data);
String str3 = new String("abcd"); // str2와 str3는 모두 문자열
-> char 배열 또는 ""을 이용한 생성자에 문자열 삽입
String 생성자
String()
String(char[] value)
String(String original)
String(StringBuffer buffer)
String 객체 생성 방법
문자열로 생성
String s = "Hello";
JVM이 리터럴 관리, 응용프로그램 내에서 공유됨
String 객체로 생성
스트링 객체의 주요 특징
스트링 객체는 수정 불가능
문자열 변경 시 기존 문자열을 변경하지 않고 새로운 문자열이 생성됨.
문자열 가공에눈 StringBuffer 클래스 사용
String str = "Hello";
str += " World";
-> Hello World 생성, Hello는 가비지가 됨.
String s = new String("Hello");
String t = s.concat("Java"); // 스트링 s에 "Java"를 덧붙인 새로운 스트링 객체 리턴
-> 스트링 s가 변한 것은 X
String 클래스의 주요 메소드 #1
char charAt(int index) : index에 있는 문자 값 리턴
int compareTo(String anotherString) : 두 문자열을 사전 순으로 비교
// 앞의 문자열이 먼저 나오면 -1, 같으면 0 뒤가 먼저 나오면 1 리턴
String concat(String str) : 주어진 문자열을 현재의 문자열 뒤에 붙임
boolean equals(Object obj) : 주어진 객체와 현재의 문자열을 비교함
int length() : 문자열의 길이를 리턴 -> 배열은 length가 멤버 변수이고 문자열에서 length()는 멤버 메소드이다.
String[] split(String regex) :
regex에 일치하는 부분을 중심으로 문자열을 분리, 분리된 문자열을 배열에 저장하여 반환
String subString(int beginIndex) : beginIndex부터 시작하는 서브 스트링 반환
String trim() : 문자열 앞뒤의 공백 문자들을 제거한 문자열 반환
String strip() : 문자열 앞뒤의 공백 문자들을 제거한 문자열 반환(JDK 11 이휴)
(Unicode 공백 문자 모두 제거)
String replace(char, char) : target이 지정하는 문자를 replacemaent가 지정하는 문자로 변경
String replace(CharSequence target, CharSequence replacement)
int indexOf(String str) : 문자열에서 검색어(str)가 처음 발견되는 index를 리턴 또는 -1
int indexOf(String str, int fromIndex) : 문자열의 fromIndex부터 검색어 str을 찾음
int indexOf(char ch, int fromIndex) : 문자열에서 해당 문자를 fromIndex로부터 검색함
String valueOf(int i) 등등의 valueOf 함수 : 각 인자를 문자열로 변환
문자열 연결
+연산자로 문자열 연결 : 피연산자에 문자열이나 객체가 포함되어 있는 경우 : 객체는 객체.toString()을 호출하여 문자열로 변환하여 연결
기본 타입값은 자동으로 문자열로 변환하여 연결
문자열 비교
문자열 객체의 내용을 비교
리턴값 : true / false
== 은 문자열 객체의 주소 비교
문자열 비교 예제
public class StringCompare1 {
public static void compareString(String s1, String s2)
{
if(s1.equals(s2)) // 동일하면 true 리턴
{
System.out.printf("s1(%s) 과 s2(%s)는 동일한 문자열\n", s1, s2);
}
else
{
System.out.printf("s1(%s) 과 s2(%s)는 다른 문자열\n", s1, s2);
}
System.out.printf("s1 객체 주소 : 0x%x\n", System.identityHashCode(s1));
System.out.printf("s2 객체 주소 : 0x%x\n", System.identityHashCode(s2));
if(s1 == s2)
{
System.out.printf("s1과 s2는 객체 주소가 동일\n");
}
else
{
System.out.printf("s1과 s2는 객체 주소가 다름\n");
}
}
public static void main(String[] args) {
String s1 = "Apple";
String s2 = "Apple";
String s3 = new String("Apple");
String s4 = new String("Apple");
String s5 = "apple";
compareString(s1, s2);
compareString(s1, s3);
compareString(s3, s4);
compareString(s1, s5);
}
}
s1과 s2는 객체주소가 동일
s3와 s4는 객체주소가 다름
s1과 s3 역시 객체 주소가 다름
문자열 분리
String.split(String regex) 함수
String str1 = "boo:and:foo";
String[] vocas = str1.split(":");
for(int i = 0; i < vocas.length; i++)
{
System.out.println(vocas[i]);
}
vocas[0], [1], [2]에 문자열이 각각 저장