: 문자열을 저장하고 이를 다루는 데 필요한 메서드 제공
한번 생성된 String의 인스턴스가 갖고 있는 문자열은 읽어 올 수만 있고 변경할 수 없다.
String a = "a";
String b = "b";
a += b;
System.out.println(a); // ab
위 코드와 같이 +
연산자를 통해 문자열을 결합하는 경우
인스턴스 내의 문자열이 바뀌는 것이 아니라, 새로운 문자열 "ab"가 담긴 String 인스턴스가 생성되는 것이다.
(즉, a가 기존에 가리키던 "a"가 저장된 인스턴스를 더이상 가리키지 않고 "ab"가 저장된 인스턴스를 가리키는 것.
매 연산 마다 새 인스턴스가 생성되어 메모리공간을 차지하므로 최대한 결합횟수를 줄이는 것이 좋다.)
String str1 = "abc";
String str2 = "abc";
String str3 = new String("abc");
String str4 = new String("abc");
위 코드에서 str1과 str2는 같은 주소를, str3과 str4는 다른 주소를 저장한다(가리킨다).
문자열 리터럴은 이미 존재하는 문자열을 재사용한다.
str1과 str2는 같은 주소를 저장한다.
str3과 str4와 같이 String 클래스의 생성자를 이용한 경우 new
연산자에 의해 메모리할당이 이루어진다. 따라서 항상 새로은 인스턴스가 생성되어 서로 다른 주소를 저장한다.
==
)따라서 str1과 str2에 equals()
, ==
로 비교했을 때 모두 true
가 나오고,
str3과 str4에 equals()
, ==
로 비교했을 때는 각각 true
, flase
가 나온다.
자바 소스파일에 포함된 모든 문자열 리터럴은 컴파일 시에 클래스 파일에 저장된다.
(이때 같은 문자열은 한번만 저장된다)
: 문자열 s를 갖는 String 인스턴스 생성
String s = new String("Hello");
// s = "Hello"
: 문자열 value를 갖는 String 인스턴스 생성
char[] c = {"H","e","l","l","o"};
String s = new String(c);
// s = "Hello"
: StringBuffer 인스턴스가 갖고 있는 문자열과 같은 내용의 String 인스턴스 생성
StringBuffer sb = new StringBuffer("Hello");
String s = new String(sb);
// s = "Hello"
: 지정된 위치 index에 있는 문자를 알려준다
String s = "Hello";
String n = "0123456";
char c1 = s.charAt(1);
char c2 = n.charAt(1);
// c1 = 'e' , c2 = '1'
: 주어진 문자 ch가 문자열에 존재하는지 지정된 위치 pos부터 확인하여 위치(index)를 알려준다.
ch가 문자열에 없다면 -1을 반환한다.
String s = "Hello";
int idx1 = s.indexOf('e', 0);
int idx2 = s.indexOf('e', 2);
// idx1 = 1
// idx2 = -1
: 주어진 문자 ch가 문자열에 존재하는지 확인하여 위치(index)를 알려준다.
ch가 문자열에 없다면 -1을 반환한다.
String s = "Hello";
int idx1 = s.indexOf('o');
int idx2 = s.indexOf('k');
// idx1 = 4
// idx2 = -1
: 주어진 문자열이 존재하는지 확인하여 그 위치(index)를 알려준다.
str이 문자열에 없다면 -1을 반환한다.
String s = "ABCDEFG";
int idx1 = s.indexOf('CD');
// idx1 = 2
: 주어진 문자 ch가 문자열에 존재하는지 확인하여 위치(index)를 알려준다.
ch가 문자열에 없다면 -1을 반환한다.
String s = "Hello";
int idx1 = s.indexOf('o');
int idx2 = s.indexOf('k');
// idx1 = 4
// idx2 = -1
: 지정된 문자 또는 문자코드를 문자열의 오른쪽 끝에서부터 찾아서 위치를 알려준다.
못 찾으면 -1을 반환한다.
String s = "java.lang.Object";
int idx1 = s.lastIndexOf('.');
int idx2 = s.indexOf('.');
// idx1 = 9
// idx2 = 4
: 지정된 문자열을 인스턴스의 문자열의 오른쪽 끝에서부터 찾아서 위치를 알려준다.
못 찾으면 -1을 반환한다.
String s = "java.lang.java";
int idx1 = s.lastIndexOf("java");
int idx2 = s.indexOf("java");
// idx1 = 10
// idx2 = 0
: 지정된 문자열 s가 포함되어있는지 검사한다.
String s = "abcdefg"
boolean b = s.contains("bc");
// b = true
: 지정된 문자열 suffix로 끝나는지 검사한다.
String s = "Hello.txt"
boolean b = s.endsWith(".txt");
// b = true
: 매개변수로 받은 문자열(obj)과 String 인스턴스의 문자열을 비교한다.
obj가 String이 아니거나 문자열이 다르면 false를 반환한다.
String s = "Hello"
boolean b = s.equals("Hello");
boolean c = s.equals("hello");
// b = true
// c = false
: 지정된 문자열 s가 포함되어있는지 검사한다.
String s = "Hello"
boolean b = s.equalsIgnoreCase("Hello");
boolean c = s.equalsIgnoreCase("hello");
// b = true
// c = true
: 문자열(str)과 사전순서로 비교한다.
같으면 0을, 이전이면 음수를, 이후면 양수를 반환한다.
int i1 = "aaa".compareTo("aaa");
int i2 = "aaa".compareTo("bbb");
int i3 = "bbb".compareTo("aaa");
// i1 = 0, i2 = -1, i3 = 1
: 주어진 문자열 prefix로 시작하는지 검사한다.
String s = "java.lang.Object";
boolean b = s.startWith("java");
boolean b2 = s.startWith("lang");
// b = true
// b2 = false
: 문자열(str)을 뒤에 덧붙인다.
String s1 = "Hello";
String s2 = s1.concat(" World");
//sw = "Hello World"
: 여러 문자열 사이에 구분자 delimiter을 넣어서 결합한다.
문자열을 자르는 split()과 반대의 작업을 한다고 생각하자
String animals = "dog,cat,bear,panda";
String[] arr = animals.split(","); // arr = {"dog", "cat", "bear", "panda"}
String str = String.join("-",arr);
// str = "dog-cat-bear-panda"
: 문자열 중의 문자(old)를 새로운 문자(new)로 모두 바꾼 문자열을 반환한다.
String s = "Hello";
String s1 = s.replace("ll", "LL");
// s1 = "HeLLo"
: 문자열 중의 문자열(old)를 새로운 문자열(new)로 모두 바꾼 문자열을 반환한다.
String s = "Hello";
String s1 = s.replace("ll", "LL");
// s1 = "HeLLo"
: 문자열 중에서 지정된 문자열(regex)와 일치하는 것을 새로운 문자열(replacement)로 모두 변경한다.
String s = "Hellollo";
String s1 = s.replaceAll("ll", "LL");
// s1 = "HeLLoLLo"
: 문자열 중에서 지정된 문자열(regex)와 일치하는 것 중 첫 번째 것만 새로운 문자열(replacement)로 변경한다.
String s = "Hellollo";
String s1 = s.replaceFirst("ll", "LL");
// s1 = "HeLLollo"
: String 인스턴스에 저장되어있는 모든 문자열을 소문자로 변환하여 반환한다.
String s = "Hello";
String s1 = s.toLowerCase();
// s1 = "hello"
: String 인스턴스에 저장되어있는 모든 문자열을 대문자로 변환하여 반환한다.
String s = "Hello";
String s1 = s.toUpperCase();
// s1 = "HELLO"
: 문자열의 왼쪽 끝과 오른쪽 끝에 있는 공백을 없앤 결과를 반환한다.
문자열 중간에 있는 공백은 제거되지 않는다.
String s = " Hello world ";
String s1 = s.trim();
// s1 = "Hello world"
: 문자열의 길이를 알려준다.
String s = "Hello";
int length = s.length();
// length = 5
: 문자열을 지정된 분리자(regex)로 나누어 문자열 배열에 담아 반환한다.
String animals = "dog,cat,bear,panda";
String[] arr = animals.split(',');
// arr = {"dog","cat","bear","panda"}
: 문자열을 지정된 분리자(regex)로 나누어 문자열 배열에 담아 반환한다.
단, 문자열 전체를 지정된 수(limit)으로 자른다.
String animals = "dog,at,bear,panda";
String[] arr = animals.split(',',2);
// arr = {"dog","cat,bear,panda"}
: 주어진 시작 위치 begin부터 끝 위치(end) 범위에 포함된 문자열을 얻는다.
끝 위치의 문자는 포함 되지 않는다.
String s = "java.lang.Object";
String c = s.substring(10);
String p = s.substring(5,9);
c = "Object"
p = "lang"
: 지정된 값을 문자열로 변환하여 반환한다.
String b = String.valueOf(true);
String c = String.valueOf('a');
String i = String.valueOf(100);
// b = "true"
// c = "a"
// i = "100"
: 문자열을 상수풀(constant pool)에 등록한다.
이미 상수풀에 같은 내용이 있을 경우 그 문자열의 주소값을 반환한다.
String s = new String("abc");
String s2 = new String("abc");
boolean b = (s==s2);
boolean b2 = s.equals(s2);
boolean b3 = (s.intern()==s2.intern());
// b = false
// b2 = true
// b3 = true