즉, String은 변하지 않는(immutable) 객체이기 때문에 문자열을 변수처럼 사용하고 싶다면 StringBuffer클래스를 사용해야 한다.
따라서 값을 바꾸는 경우 새로운 String 객체 인스턴스가 생성된다.
문자열 생성 방식으로 String 과 new String() 두가지가 있다. 차이점을 비교해보며 객체와 메모리 영역에 대해 알아보쟝.
일반적으로 변수에 문자열을 저장할 경우 아래와 같이 문자열 리터럴을 사용하는 것 같다.
String str1 = "string class";
이럴 경우 String 객체는 Heap영역에 저장된다.
더 상세히 말하자면 문자열 리터럴은 String Constant Pool 영역에 할당이 되고, 자바7부터 문자열 상수 풀의 위치는 Heap으로 옮겨졌다.
그리고 자바는 문자열 리터럴이 동일하다면 String 객체를 공유하도록 되어있으므로
String str1 = "string class";
String str2 = "string class";
는 동일한 객체를 가리킨다.
그렇다면 당연히 주소값을 비교하는 참조변수의 ==, != 연산을 활용한다면
System.out.print(str1 == str2); //true 출력
가 될것이다.
객체 생성 연산자인 new 연산자는 힙 영역에 새로운 객체를 만들 때 사용한다. 즉, new String()을 하는 경우 문자열의 내용이 동일하더라도 서로 다른 객체를 참조한다.
String str1 = "String class";
String str2 = new String("String class");
boolean result1 = (str1 == str2); //false
가 된다.
따라서 문자열의 내용만을 비교할 때에는 String 객체의 equals()메소드를 사용해야 한다.
boolean result2 = str1.equals(str2); //true
말해뭐해...뭘하든 API문서가 최고겠지만 자주 사용해서 편리하게 참고하고 싶은 몇몇 메소드들만 따로 정리하겠다. 아래 링크를 클릭하면 Java 8 API 문서를 볼 수 있다. 한국어 최고
Java 8 API 문서 링크
return type : int
String str = "abc";
int strLen = str.lengh(); //3
return type : boolean
String str1 = "String class";
String str2 = new String("String class");
boolean result2 = str1.equals(str2); //true
return type : char
String str = "String class";
char ch = str.charAt(0); //'S'
return type : boolean
String str = "a";
boolean isEmpty = str.isEmpty(); //false
return type : int
String str = "abcdef";
int startIdx = str.indexOf("cd"); //2
이외에도 오버로딩된 indexOf 메소드들이 있으니 API참고
return type : string
_return type : String_
String resultStr = "abcd".subString(1, 3); //"bc"
return type : string
String str1 = "apple and apple";
String str2 = str1.replaceAll("apple", "banana"); //"banana and banana"
return type : string
String str = "AbCd";
String upperStr = str.toUpperCase(); //"ABCD"
return type : string
String str = "AbCd";
String lowerStr = str.toLowerCase(); //"abcd"
return type : string
return type : string
int num = 100;
String str = null;
String numStr = String.valueOf(num); //"100"
String nullStr = String.valueOf(str); //"null"
Object 클래스의 toString()메소드와 비교
toString() 또한 객체의 내용을 문자열로 리턴하나 대상값이 null이면 NullPointerException을 발생시킨다.
return type : char[]
String str = "apple and banana";
char[] array = str.toCharArray(); //[a, p, p, l, e, , a, n, d, , b, a, n, a, n, a]
return type : String[]
String str = "apple,and,apple";
String[] arr = str.split(",");
System.out.println(Arrays.toString(arr)); //[apple, and, apple]