티스토리 뷰

Programming Language/JAVA

String, StringBuilder, StringBuffer

기내식은수박바 2019. 9. 2. 16:42
반응형

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
댓글
반응형
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
TAG
more
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함