-
String 관련 클래스대충 정리 일기 2022. 9. 3. 18:50
String
String의 가장 큰 특징은 값을 변경할 수 없는 불변 객체라는 것이다.
String은 일반적인 클래스들과는 다르게 리터럴(””)의 형식으로 객체를 생성하는데, 이는 Constant Pool에 값을 저장하기 위함이다.
Constant Pool(상수 풀)이란 이름 그대로 상수들이 저장된 영역으로, (JVM - Runtime Constant Pool)
만약 String str = “java”; 라는 객체를 생성했다면 Constant Pool에 “java”가 저장되고
다른 곳에서 “java”를 생성하려 할 경우 Constant Pool에 있는 “java”를 리턴한다.
예를 들어보면
String a = "aaa"; String b = "aaa"; String c = new String("aaa"); String d = new String("aaa"); System.out.println(a == b); // true System.out.println(a == c); // false System.out.println(c == d); // false
a의 “aaa”가 먼저 상수 풀에 저장된 후 b에서 “aaa”를 생성하지 않고 상수 풀에 저장된 “aaa”를 반환했다.
즉, a와 b는 같은 “aaa”를 참조하는 것이다.
반면 생성자로 생성할 경우 각자 다른 인스턴스로 생성된다.
즉, c와 d는 같지 않고, a,b와도 같지 않은 것이다.
이러한 차이점을 보이는 이유는 성능 향상을 위해서로,
문자열은 똑같은 값이 자주 쓰이는 경향이 있기 때문에
캐싱하여 사용하는 것이다.
정리
- String은 값을 변경할 수 없는 불변 객체이다.
- 리터럴(””)로 생성할 경우 값이 상수 풀에 캐싱한다.
- 생성자로 생성하면 값이 같더라도 다른 인스턴스가 되기 때문에 성능 향상을 위해 상수 풀을 사용한다.
StringBuilder / StringBuffer
StringBuilder와 StringBuffer는 기능은 거의 같으나 동기화를 실시하는 점에 차이가 있다.
String이 불변 객체이기 때문에 문자를 추가할 때마다 상수 풀에 새로 저장된다는 단점을 보완하기 위해서
StringBuilder와 StringBuffer가 등장했다.
→ 상수 풀에 “aaa”가 존재할 경우 “aaa” + “b” 를 실행하면, 상수풀에는 “aaa”, “aaab”가 저장된다.
StringBuilder와 StringBuffer는 모두 AbstractStringBuilder를 상속받기 때문에
클래스 멤버 변수로 가변 배열(byte[] value)을 가지고 있어 문자열을 삽입할 때(append) 배열의 크기가 자동으로 맞춰지며,
객체 자체만으로는 값을 사용할 수 없고, toString()으로 String 객체를 반환받아 사용해야 한다.
동기화 이슈
동기화 문제란, 멀티 스레드 환경에서 발생하는 문제로,
여러 스레드가 동시에 같은 자원에 접근할 때 자원이 오염되어 결과에 오류가 생길 수 있는 문제이다.
만약 스레드 1이 읽고자 하는 데이터는 “abcd” 였으나, 스레드 2가 먼저 접근해 “abcde”로 수정한다면
스레드 1은 원치 않는 데이터를 읽게 된다.
이를 방지하는 방법 중에 하나가 synchronized 키워드인데, 메소드에 이 키워드가 붙은 경우
접근 스레드가 메소드에서 빠져나올 때까지 다른 스레드가 접근할 수 없다.
StringBuilder와 StringBuffer가 구현한 기능은 거의 비슷하게 동작하나,
StringBuffer는 메소드에 synchronized 키워드가 붙어 있어 동기화를 실시하게 된다.
따라서 StringBuffer는 안전하지만 (Builder에 비해) 속도가 느리고,
StringBuilder는 속도가 빠르지만 안전하지 않다.
정리
- StringBuilder와 StringBuffer는 AbstractStringBuilder를 상속받아 기능은 거의 비슷하다.
- 불변 객체인 String과는 달리 문자열을 추가, 삭제, 수정하는 데에 강점이 있다.
- StringBuilder와 StringBuffer의 차이는 동기화 여부에 있으며, StringBuffer는 메소드에 synchronized 키워드가 붙어 있다.
- StringBuilder는 속도가 빠르지만 안전하지 않고, StringBuffer는 안전하지만 (Builder에 비해) 속도가 느리다.
String과 StringBuilder / StringBuffer
- String은 불변 객체이며, 값이 캐싱되기 때문에 값을 여러 번 참조할 때 성능이 빠르다.
- 값을 상수 풀에 저장하여 사용한다.
- StringBuilder/StringBuffer는 문자열을 효과적으로 조작하기 위해 사용한다.
- 가변 배열을 사용하여 문자열 크기에 따라 배열의 크기가 조절된다.
'대충 정리 일기' 카테고리의 다른 글
Annotation (0) 2022.08.27 Collection (0) 2022.08.27 db insert (0) 2022.08.19