[Java]String, StringBuffer, StringBuilder에 대하여 알아봅니다.

엄진환·2021년 8월 3일
0
post-thumbnail

Java에서 String 선언

1. new 연산자를 이용하는 방식

String new_str1 = new String("Hello Java!");
String new_str2 = new String("Hello Java!");

System.out.println("new_str1 : " + System.identityHashCode(new_str1) + ", " + new_str1);
System.out.println("new_str2 : " + System.identityHashCode(new_str2) + ", " + new_str2);
결과

new_str1 : 918221580, Hello Java!
new_str2 : 1746572565, Hello Java!

  • 각 String이 힙 영역에 저장되면서 같은 문자열이여도 다른 메모리 주소를 가지는 것을 확인할 수 있습니다.
  1. Literal 방식
String literal_str1 = "Hello Java!";
String literal_str2 = "Hello Java!";

System.out.println("literal_str1 : " + System.identityHashCode(literal_str1) + ", " + literal_str1);
System.out.println("literal_str2 : " + System.identityHashCode(literal_str2) + ", " + literal_str2);
  • 각 String이 string constant pool 영역에 저장되면서 같은 문자열의 리터럴 방식으로 생성 시 같은 메모리 주소를 가지는 것을 확인할 수 있습니다.
결과

literal_str1 : 918221580, Hello Java!
literal_str2 : 918221580, Hello Java!

Java에서 String 사용하지 말아야 할 때!

문자열 조작!(+, concat, substring 등...)

Java에서 String 문자열을 조작 시 매번 새로운 인스턴스가 생성되기 때문에 성능, 속도가 느립니다. 예제 코드로 확인해 보겠습니다.

String literal_str1 = "Hello Java!";
String literal_str2 = "Hello Java!";

System.out.println("literal_str1   : " + System.identityHashCode(literal_str1) + ", " + literal_str1);
// 문자열 연결
literal_str1 = literal_str2.concat("?");
System.out.println("literal_str1 : " + System.identityHashCode(literal_str1) + ", " + literal_str1);
// 문자열 자르기(마지막 문자 제거)
literal_str1 = literal_str1.substring(0, literal_str1.length() - 1);
System.out.println("literal_str1 : " + System.identityHashCode(literal_str1) + ", " + literal_str1);
결과

literal_str1 : 918221580, Hello Java!
literal_str1 : 1746572565, Hello Java!?
literal_str1 : 989110044, Hello Java!

  • 기존 문자열에 추가, 삭제 시 새로운 메모리 주소에 할당되는 것을 확인할 수 있습니다.

StringBuilder, StringBuffer를 사용합시다!

StringBuilder, StringBuffer는 new 연산자를 통해서만 문자열을 생성할 수 있습니다.

// StringBuffer
StringBuffer sBuffer = new StringBuffer("Hello StringBuffer!");
System.out.println("sBuffer : " + System.identityHashCode(sBuffer) + ", " + sBuffer);
sBuffer.append("?");
System.out.println("sBuffer : " + System.identityHashCode(sBuffer) + ", " + sBuffer);
sBuffer.deleteCharAt(sBuffer.length()-1);
System.out.println("sBuffer : " + System.identityHashCode(sBuffer) + ", " + sBuffer);

// StringBuilder
StringBuilder sBuilder = new StringBuilder("Hello StringBuilder!") ;
System.out.println("sBuilder : " + System.identityHashCode(sBuilder) + ", " + sBuilder);
sBuilder.append("?");
System.out.println("sBuilder : " + System.identityHashCode(sBuilder) + ", " + sBuilder);
sBuilder.deleteCharAt(sBuilder.length()-1);
System.out.println("sBuilder : " + System.identityHashCode(sBuilder) + ", " + sBuilder);
결과

sBuffer : 918221580, Hello StringBuffer!
sBuffer : 918221580, Hello StringBuffer!?
sBuffer : 918221580, Hello StringBuffer!
sBuilder : 989110044, Hello StringBuilder!
sBuilder : 989110044, Hello StringBuilder!?
sBuilder : 989110044, Hello StringBuilder!

  • 결과를 보면 stringBuffer, stringBuilder 모두 문자열 조작으로 주소가 바뀌지 않는 것을 확인할 수 있습니다.

StringBuilder, StringBuffer의 차이?

이에 대한 내용은 java 공식 문서에서 확인할 수 있었습니다.

StringBuilder, StringBuffer 공식 문서

요약하자면...

  • StringBuilder : 싱글 스레드 환경에서 사용하도록 설계된 클래스로 StringBuffer보다 대부분에서 빠른 성능을 가집니다.
  • StringBuffer : 멀티 스레드 환경에서 사용하도록 설계되어 스레드로부터 안전하게 작업할 수 있는 클래스입니다.
profile
개발 공부 블로그

0개의 댓글