자바에서는 문자열을 위해 char형의 배열이 아닌 String 클래스를 제공한다.
String a = "a";
String b = "b";
a = a + b; // 문자열이 바뀌는 것이 아닌 새로운 인스턴스가 생성
String str1 = "abc"; // 문자열 리터럴 "abc"의 주소가 str1에 저장됨
String str2 = "abc"; // 문자열 리터럴 "abc"의 주소가 str2에 저장됨
String str3 = new String("abc"); // 새로운 String 인스턴스를 생성
String str4 = new String("abc"; // 새로운 String 인스턴스를 생성
문자열 리터럴을 지정한 경우
String 클래스의 생성자를 이용한 경우
📌 equals() vs '=='
equals()를 사용했을 때는 두 문자열의 내용("abc")을 비교하기 때문에 두 경우 모두 true
'==' 등가비교 연산자로 비교했을 때 각 String 인스턴스의 주소를 비교하기 때문에 결과가 다르다.
자바 소스 파일에 포함된 모든 문자열 리터럴은 컴파일 시에 클래스 파일에 저장된다. 이 때 같은 내용의 문자열 리터럴은 한 번만 저장된다. 문자열 리터럴도 String 인스턴스이고, 한 번 생성하면 내용을 변경할 수 없으므로 하나의 인스턴스를 공유하면 되기 때문이다.
public static void main(String[] args) {
String s1 = "AAA";
String s2 = "AAA";
String s3 = "AAA";
String s4 = "BBB";
}
클래스 파일에는 소스파일에 포함된 모든 리터럴의 목록이 있다. 해당 클래스 파일에 클래스 로더에 의해 메모리에 올라갈 때, 이 리터럴의 목록에 있는 리터럴들이 JVM 내에 있는 상수 저장소(constant pool)에 저장된다.
길이가 0인 배열
String s = "";
참조변수 s가 참조하고 있는 String 인스턴스는 내부에 new char[0]과 같이 길이가 0인 char형 배열에 저장하고 있는 것이다.
char[] chArr = new char[0]; // 길이가 0인 char 배열
int[] iArr = {}; // 길이가 0인 int 배열
// char c = ""; // 에러
char c = ' '; // 반드시 하나의 문자를 지정해야함. 공백으로 초기화
자주 사용되는 목록
join : 여러 문자열 사이에 구분자를 넣어서 결합한다. split()와 반대 작업
String animals = "dog,cat,bear";
String[] arr = animals.split(","); // ["dog", "cat", "bear"]
String str = String.join("-", arr); // dog-cat-bear
java.util.StringJoiner 클래스
StringJoiner sj = new StringJoiner(",", "[", "]");
Strin[] strArr = {"aaa", "bbb", "ccc"};
for(String s : strArr)
sj.add(s.toUpperCase());
System.out.println(sj.toString()); // [AAA,BBB,CCC]
join(), StringJoiner JAVA8에서 추가됨
int i = 100;
String str1 = i + "";
String str2 = String.valueOf(i);
성능은 valueOf가 더 좋지만, 빈 문자열을 더하는 방법이 간단하고 편하기 때문에 성능 향상이 필요한 경우메만 valueOf 쓰기
int i = Integer.parseInt("100");
int i2 = Integer.valueOf("100");
예전에는 parseInt()와 같은 메서드를 많이 썼는데, 메서드의 이름을 통일하기 위해 valueOf()가 나중에 추가 되었다. valueOf(String s)는 메서드 내부에서 parseInt(String s)를 호출할 뿐이므로 두 메서드는 반환 타입만 다른 같은 메서드다.
💡 valueOf()의 타입은 int가 아니라 Integer 이지만 auto-boxing에 의해 int로 자동 변환된다.
int iVal = 100;
String strVal = String.valueOf(iVal);
double dVal = 200.0;
String strVal2 = dVal + "";
// '+'가 포함된 문자열 변환 (JDK1.7부터 가능)
double sum = Integer.parseInt("+"+strVal) + Double.parseDouble(strVal2);