String클래스
- 문자열을 다루기 위한 클래스.
- String클래스 = 데이터(char[]) + 메서드(문자열 관련)
특징
- 내용을 변경할 수 없는 불변(immutable) 클래스
- 문자열 연산시 새로 객체를 만드는 Overhead 발생(성능이 떨어진다.)
- 문자열의 결합이나 변경이 잦다면, 내용을 변경가능한 StringBuffer, StringBuilder를 사용
문자열 비교
String str1 = "abc";
String str2 = "abc";
String str3 = new String("abc");
String str4 = new String("abc");
- str1 ,str2 는 문자열 abc를 가리킨다.
- str3, str4 는 각각의 인스턴스를 가리킨다.
- 문자열 리터럴로 문자열을 생성 시
- new 연산자를 사용 시
- 문자열은 내용변경이 불가하기 때문에 여러 참조변수가 공유해도 문제가 생기지 않는다.
- 문자열 변수는 "==" 연산자로 비교 시 주소를 비교하기 때문에 값을 비교하기 위해선 equals함수를 써야한다.
문자열 리터럴
- 문자열 리터럴은 프로그램 실행시 자동으로 생성된다.(constant pool에 저장)
- constant pool
- JVM은 문자열 상수 풀에 객체를 생성하고 해당 참조를 스택에 저장한다.
- JVM은 문자열 상수 풀에 리터럴의 복사본을 하나만 저장하여 문자열에 할당된 메모리 양을 최적화 할 수 있다.
- interning 이라고함!
- String변수를 만들고 값을 할당하면 JVM이 상수풀에서 동일한 String을 검색하고, 발견되면 메모리 주소값을 반환하고 그렇지 않으면 풀에 등록하고(interning) 해당 주소값을 반환한다.
StringBuffer클래스, StringBuilder클래스
- 공통점
- new 연산으로 클래스를 한 번만 만듬 (Mutable)
- 문자열 연산시 새로 객체를 만들지 않고, 크기를 변경시킴
- StringBuffer와 StringBuilder 클래스의 메서드가 동일함.
- 차이점
- StringBuffer는 동기화되어 있다. 멀티 쓰레드에 안전함
- StringBuilder는 동기화 되어 있지 않아서. 멀티 쓰레드에 안전하지 않음.
- 멀티 쓰레드 프로그램이 아닌 경우, 동기화는 불필요한 성능저하를 일으킨다. 그럴때 StringBuilder를 쓰자.