티스토리 뷰
String
- String은 immutable (불변) 한 특징을 가진다.
- 따라서, String은 생성자 (new String) 를 통해 생성되면 해당 instance의 공간은 절대 변하지 않는다.
- 그래서 +, concat 등 문자열에 변화를 준다고 하더라도 메모리 공간이 변하는 것이 아닌 새로운 메모리 공간에 새로운 String 객체를 만들고 그 객체를 참조하도록 한다.
- 이렇게 새로운 문자열이 생성되면 기존의 문자열이 Heap 메모리 공간 (가비지 컬렉터가 동작하는 영역) 을 차지하고 있기 때문에 가비지 컬렉터에 의해 제거되야 하는 단점이 있다.
- 또한, 이러한 문자열 연산이 많아질수록 계속적으로 문자열을 만드는 Overhead가 발생하므로 성능이 떨어질 수 밖에 없다.
- 대신에 immutable 이라는 특성 덕분에 좋은 첫 번째는 단순한 조회연산에서는 다른 클래스보다 빠르게 읽을 수 있는 장점이 있다.
- 두 번째로는 멀티쓰레드 환경에서 데이터 무결성 때문에 동기화를 걱정할 필요가 없다.
StringBuilder / StringBuffer
- String과 달리 mutable (가변) 한 특징을 가진다.
- 즉, 문자열 연산을 위해 클래스 객체를 한 개만 만들고, 길이를 변경시키며 연산을 진행할 수 있다.
- 따라서 문자열 연산이 많을 경우 사용하면 성능이 좋다.
- 두 가지 클래스가 제공하는 메소드는 동일하다. (단, StringBuffer는 Synchronized Keyword가 존재)
- 두 가지의 차이점
- StringBuffer는 멀티쓰레드 환경에서 동기화가 가능하기 때문에 thread-safe 하다.
- StringBuilder는 동기화를 지원하지 않기 때문에 멀티쓰레드 환경에서는 적합하지 않다.
- 대신 StringBuilder는 동기화를 고려하지 않기 때문에 싱글쓰레드 환경에서는 StringBuffer보다 연산 처리 속도가 빠르다.
Conclusion
- JDK 1.5 버전 이후로는 컴파일 단계에서 String 객체를 사용하여도 내부적으로 StringBuilder로 컴파일 되도록 변경되었다고 한다.
- 그리하여 1.5 이후 버전에서는 String 클래스를 활용하여도 StringBuilder와 성능상으로 차이가 없어졌다.
- 하지만 반복 루프를 사용하여 문자열을 더할 때에는 객체를 계속 추가한다는 사실에는 변함이 없다.
- 따라서 String 클래스를 사용하는 대신, 쓰레드와 관련이 있다면 StringBuffer, 쓰레드 안전 여부와 상관이 없다면 StringBuilder를 사용하면 좋을 것이다.
StringBuilder / StringBuffer의 메소드
Return Type | Method | Description |
StringB~ | append(Object obj) |
현재 StringB_ 객체에 저장되어 있는 문자열에 obj 객체를 더한다. (ex. StringB~ sb = new StringB~("st") sb.append("splsus")) -> result : stsplsus) |
char | charAt(int index) | 해당 index에 위치한 문자를 반환한다. |
StringB~ | delete(int start, int end) |
start index 부터 (end - 1) index 까지의 sub-string을 제거한다. (ex. sb.delete(0, 2) -> result : splsus) |
StringB~ | StringB~ deletCharAt(int index) | 해당 index에 위치한 문자를 제거한다. |
int |
indexOf(String str) indexOf(String str, int fromIndex) |
문자열내에서 str 문자열이 존재하는 index를 반환한다. fromIndex는 str을 찾기 위해 시작하는 index이다. 문자열의 길이가 2이상이라면 시작하는 문자열의 index를 반환한다. (ex. sb.indexOf("s", 1) -> result : 3 sb.IndexOf("ls") -> result : 2) |
int |
lastIndexOf(String str) lastIndexOf(String str, int fromIndex) |
indexOf와 달리 lastIndexOf는 오른쪽에서 부터 str을 찾는다. (ex. sb.lastIndexOf("s") -> result : 4 sb.lastIndexOf("s", 4) -> result : 3) |
StringB~ | insert(int offset, Object obj) |
append가 문자열의 마지막에 연결한다면, insert는 offset index 에 obj 객체 문자열을 삽입하여 더한다. (ex. sb.insert(2, "abc") -> result : spabclsus) |
int | length() |
현재 StringB~ 객체에 있는 문자열의 길이를 반환한다. (ex. sb.length() -> result : 9) |
StringB~ | replace(int start, int end, String str) |
start index 부터 (end - 1) index 까지의 sub-string을 str로 대체한다. (ex. sb.replace(1, 3, "cha") -> result : schabclsus) |
StringB~ | reverse() |
현재 StringB~ 객체의 문자열을 거꾸로 뒤집는다. (ex. sb.reverse() -> result : suslcbahcs) |
void | setCharAt(int index, char ch) |
해당 index 위치의 문자를 ch로 대체한다. (ex. sb.setCharAt(3, '5') -> result : sus5cbahcs) |
String |
substring(int start) substring(int start, int end) |
위 substring은 start index 부터 문자열 끝까지, 아래 substring은 start index 부터 (end - 1) index 까지 잘라 String 문자열을 만든다. (ex. sb.substring(1, 5) -> result : us5c) |
String |
toString() |
StringB~ 객체의 문자열을 String 객체로 변환해준다. |
Reference
'Programming Language > JAVA' 카테고리의 다른 글
equals() & hashcode() (0) | 2019.11.29 |
---|---|
문자열 (String) 형변환 : Casting, valueOf, toString (1) | 2019.09.08 |
StringTokenizer (0) | 2019.09.06 |
HashTable, HashMap, ConcurrentHashMap (0) | 2019.09.01 |