JAVA

String과 StringBuilder 비교하기 (String vs StringBuilder)

superbono 2021. 6. 21. 17:04

* String?

String은 문자열이다. java에서 string 객체는 불변이므로 생성된 후에는 변경할 수 없다. 객체이니까 heap 영역에 생성된다. 

java에서 문자열을 생성하는 방법에는 2가지가 있다. 

 

// no.1
String s =“GeeksforGeeks”;

// no.2
String s = new String ( "GeeksforGeeks");

 

string은 불변의 성격을 가지고 있으므로 + 연산자를 사용하게 되면 기존의 문자열이 가지고 있는 메모리에 +로 추가하는 새 문자열을 추가하는 것이 아니라, 새로 메모리를 할당받아 새 string을 만들게 된다. 

String str = "Don";

str += "John";

// 
이렇게 되면 1번 라인 기존의 str이 가지고 있던 메모리에 
john 문자열이 추가되는 것이 아니라

아예 새로운 영역에 "Don John"이라는 문자열을 새로 할당받는다.
왜냐하면 문자열은 불변의 성격을 지니기 때문이다.

따라서 문자열을 +연산자를 많이 사용하여 합치게 되면 그 때마다 메모리를 새로 할당받아와야 하기 때문에 성능의 저하가 일어난다. 

   string의 메소드

 1. int length(): 문자열의 길이를 리턴한다. 

 2. char charAt(int i): 문자열의 i번째 문자(character)을 리턴한다.

 3. String substring(int i): 문자열의 i번째부터 끝까지 일부 문자열을 리턴한다. 

 4. String substring(int i, int j): 문자열의 i부터 j - 1까지 일부 문자열을 리턴한다 .

 5. String concat(String str): 기존 문자열의 끝에 매개변수로 들어온 문자열을 연결한다. 

 6. int indexOf(String s): 지정된 문자열이 처음 나타나는 문자열의 인덱스를 반환한다. 

 7. boolean equals(Object otherObj): 문자열을 매개변수로 들어오는 객체와 비교한다. 

 8. boolean equalsIgnoreCase(String anotherString): 대소문자를 무시하고 문자열을 다른 문자열과 비교한다.

 9. String toLowerCase(): 문자열의 모든 문자를 소문자로 변환한다. 모든 문자를 대문자로 변환하는 toUpperCase()도 있다.

 10. String trim(): 문자열의 시작과 끝의 공백을 제거하여 문자열의 복사본을 반환한다. 문자열 중간의 공백은 신경쓰지 않는다 . 

 11. String replace(char oldChar, char newChar): 문자열 내의 oldChar을 모두 0newChar로 변환한다.   

더 많은 메소드들이 있으므로 자세한 것은 공식 문서 확인하자

 

* StringBuilder?

StringBuilder는 가변적인 성격을 지닌다. 따라서 문자열이 변경될 때마다 새로 메모리를 할당받는 string과는 달리, 버퍼를 통해 문자열을 저장해두었다가 toString() 메소드를 통해서 한번에 string 문자열 객체를 생성하게 된다. 

   StringBuilder의 문자열을 추가하는 메소드

       -append()

          기존 문자열의 끝에 추가한다. 

StringBuilder sb = new StringBuilder("Butter");
sb.append("fly");

// 
sb는 Bufferfly가 된다. 

        -insert()

           원하는 위치에 문자열 추가한다. 

StringBuilder sb = new StringBuilder("Buer");
sb.insert(2,"tt");

//
sb는 butter

 

 

 

* 요약

문자열은 불변의 성질을 가지고 있다. 따라서 문자열에 다른 문자열을 덧붙이는 등 수정이 일어나게 되면 새로 메모리를 받아와야 하므로 성능의 저하가 일어날 수 있다. StringBuilder는 가변적이므로 buffer에 문자열을 담고 수정하고 뭐 그러다가 toString() 메소드로 한번에 string을 생성한다. 그러므로 문자열의 수정이 잦은 경우에는 StringBuilder를 사용하는 것이 성능상 유리하다. 

 

 

+ ) 그러나 StringBuilder는 멀티 쓰레드 환경에서 문자열을 변경해야 하는 경우에는 동기화 문제가 발생할 수 있다고 한다... thread-safe하지 않기 때문 -> 멀티 쓰레드 환경에서는 StringBuffer를 사용해야 한다. (StringBuffer는 멀티쓰레드 환경에서 각각의 메소드에 대해 동기화를 보장하기 때문에 동기화 문제가 발생하지 않는다고 한다.) 

 

출처 - https://www.geeksforgeeks.org/string-class-in-java/

 

String class in Java | Set 1 - GeeksforGeeks

A Computer Science portal for geeks. It contains well written, well thought and well explained computer science and programming articles, quizzes and practice/competitive programming/company interview Questions.

www.geeksforgeeks.org

https://readystory.tistory.com/141?category=784159 

 

Java의 String 이야기(3) - String vs StringBuilder

오늘은 Java의 String에 대한 마지막 이야기! String VS StringBuilder 에 대해 살펴보겠습니다. 아직 1편과 2편을 보지 않으신 분들은 이전 포스팅에서 읽고 오시기를 권장합니다. 2019/12/19 - [JAVA] - Java의..

readystory.tistory.com

 

'JAVA' 카테고리의 다른 글

Collection Framework  (0) 2021.07.05
Interface(인터페이스)  (0) 2021.06.30
메모리 구조(Stack, Heap)  (0) 2021.06.20
JDBC: executeQuery VS excuteUpdate  (0) 2021.04.25
상속(Inheritance)  (0) 2021.01.29