String , StringBuilder, StringBuffer의 차이

Bong2·2022년 2월 22일
0

JAVA

목록 보기
7/16

String

  • String 객체(불변) 불변이기 때문에 변하지 않는 문자열은 String을 사용한다.
  • 불변하여 멀티쓰레드 환경에서의 안전성을 가지고 있다.
String str="hello";
str=str+"world"; // [hello world]

새로운 영역을 가리키게 변경되고 처음 선언했던 hello로 값이 할당되어 있던 메모리 영역은 Garbage로 남아있다가 GC에 의해 사라지게 되는 것 --> 불변하기 때문에 문자열을 수정하는 시점에 새로운 String 인스턴스가 생성되는 것

변하지 않은 문자열을 저장할 때 적합

불변인 이유

  1. String Pool

    String이 불변이기 때문에 String Pool도 존재할 수 있다.

값이 같은 String은 String Pool내에서 String 객체를 공유하도록 한다. 공유를 하기 위해서는 String은 반드시 immutable

  1. 보안

사용자의 이름이나 패스워드, 혹은 네트워크 연결을 위한 포트 번호나 connection URL 등 중요한 정보를 String으로 받을 때가 많다. JVM의 class loader가 class loading을 수행할때도 마찬가지

  1. 동기화
    객체가 불변이면 멀티 쓰레드 환경에서도 값이 바뀔 위험 X

  2. Hashcode Caching

참고 : https://starkying.tistory.com/entry/why-java-string-is-immutable

StringBuilder

  • String Builder(가변) 비동기 방식이기 때문에 Single Thread 환경하에서, 변화되는 문자열에 사용한다. 비동기 방식이기 때문에 처리 속도는 제일 빠르다.
  • 멀티쓰레드 환경에서 사용하는 것은 적합하지 않다. 동기화를 고려하지 않는 만큼 단일쓰레드에서의 성능은 StringBuffer보다 뛰어나다.

StringBuffer

  • StringBuffer(가변) 동기방식으로 저장되기 때문에 멀티쓰레드로 접근하거나 문자열이 변경될 경우에 사용한다.
  • 멀티쓰레드 환경에서 안전하다는 점(thread-safe)
StringBuffer sb=new StringBuffer("hello");
sb.append(" world");

.append .delete등의 API를 이용하여 동일 객체 내에서 문자열을 변경하는 것이 가능하다.

문자열의 추가, 수정, 삭제가 빈번하게 발생하는 경우

정리

String : 문자열 연산이 적고 멀티쓰레드 환경
StringBuffer : 문자열 연산이 많고 멀티쓰레드 환경
StringBuilder : 문자열 연산이 많고 단일쓰레드이거나 동기화를 고려하지 않는 경우

  • Thread Safe

스레드 안전은 멀티 쓰레드 프로그래밍에서 일반적으로 어떤 함수나 변수, 혹은 객체가 여러 쓰레드로 부터 동시에 접근이 이루어져도 프로그램의 실행에 문제가 없음을 뜻한다. 보다 엄밀하게는 하나의 함수가 한 쓰레드로부터 호출되어 실행 중일 때, 다른 쓰레드가 그 함수를 호출하여 동시에 함께 실행되더라도 각 쓰레드에서의 함수 수행결과가 올바르게 나오는 것

  • 지키는 방법
  1. Mutaul exclusion
  2. Atomic operations
  3. Re-entrancy
  4. Thread-local storage
profile
자바 백엔드 개발자로 성장하자

0개의 댓글

관련 채용 정보