String 클래스는 java.lang 패키지에 포함된 클래스로 문자열을 나타낸다. 스티링 리터럴은 자바 컴파일러에 의해 모두 String 객체로 처리된다.
문자열을 다루는데 있어 중요한 점은 스트링 리터럴과 new String()으로 생성된 스트링 객체는 서로 다르게 관리된다.
스트링 리터럴은 자바 내부에서 리터럴 테이블로 특별히 관리하여 동일한 리터럴을 공유시킨다. 하지만 스트링 객체는 힙 메모리에 생성된다.
스트링 리터럴 “Hello”와 “Java”는 JVM의 스트링 리터럴 테이블에 생성되며 각각 a, b가 가리키고 c는 리터럴 테이블에서 a와 “Hello”를 공유한다.
그러나 new String()에 의해 생성된 스트링 객체 d, e, f는 모두 힙 메모리에 독립적으로 생성된다.
스트링 객체는 수정이 불가능하다는 특징 있다. 편집되는 것 같아 보여도 내부적으로는 단지 폐기 후 새로 생성하는 것이기 때문이다. (어찌보면 당연한 얘기인데 새로운 객체를 생성하는 것이기 때문)
아래는 String 객체의 사용 예이다.
스트링 리터럴의 경우 같은 문자열이면 리터럴 테이블을 공유하기 때문에 직접 비교가 가능하다. 하지만 String 객체인 경우에는 힙 영역에 독립적으로 저장되기 때문에 equals(Object obj) 함수를 통해 비교를 해야 문자열 자체만을 비교할 수 있다.
String a = "Hello";
String b = "Hello";
String c = "Java";
String d = new String("Hello");
String e = new String("Java");
String f = new String("Java");
System.out.println(e.equals(a)); // false
System.out.println(e.equals(b)); // false
System.out.println(e.equals(c)); // true
System.out.println(e.equals(d)); // false
System.out.println(e.equals(f)); // true
// 아래는 참조값을 비교하게 됨
System.out.println(e == f); // false
StringBuffer 클래스도 java.lang 패키지에 포함되어 있으며, String 클래스와 마찬가지로 문자열을 다룬다.
String의 경우 객체 내부의 문자열을 수정할 수 없지만, StringBuffer 객체는 문자열을 저장하는 가변 버퍼를 가지고 있기 때문에 저장된 문자열의 수정이 가능하다. 문자열의 크기가 늘어나면 내부 버퍼 크기를 자동 조절한다.
아래는 StringBuffer 객체의 사용 예이다.
출처
명품 JAVA programming - 황기태, 김효수
https://www.youtube.com/사람만이