TIL

Java String, StringBuilder, StringBuffer 차이와 장단점

빈코 2023. 8. 21. 15:52

Java 문자열

개요

오늘은 Java에서 문자열을 다루는 String, StringBuilder, StringBuffer의 차이를 알아보려고 한다. 3가지 클래스는 각각 차이점이 있는 만큼 효율적으로 사용하는 방법 또한 다르게 작용이 된다. 어떠한 상황에서 어떤 문자열 클래스를 사용하는 것이 효율적인지는 각 클래스의 특징을 완전히 이해하고 사용해야 한다. 3가지 클래스는 어떤 부분에서 다를까?

 

String📙

우리가 흔히 아는 Java의 문자열 클래스로 대표적인 클래스는 단연 String 일 것이다. String 변수에 값을 할당하는 방법은 2가지가 있는데, 리터럴 변수를 대입하는 방법new 연산자를 사용하는 방법이 있다.

 

String str = "Binco"; // 리터럴
String str = new String("Binco"); // new

리터럴로 String을 선언할 시에는 Heap 영역안에 있는 String constant pool 공간에 해당 값을 저장하게 된다. 해당 공간에 문자열을 저장하게 되면, 같은 문자열을 선언할 시에 한번 더 String constant pool에 저장하는 것이 아닌, 기존에 있는 같은 값을 재사용하게 된다. 재사용하기 때문에 둘의 값을 비교해도 같은 값이라는 결과가 나오게 된다.

 

String str = "binco";
String str2 = "binco";
System.out.print(str == str2); // 결과 true

 

하지만 new 연산자로 String을 선언할 시에는 Heap 영역에 저장하기 때문에, 같은 문자열이라도 서로가 다른 공간에 있어 둘의 값을 비교하면 서로 다른 값이라고 결과가 나오게 된다.

String str = new String("binco");
String str2 = new String("binco");
System.out.print(str == str2); // 결과 false

 

결론적으로 String은 불변성이라는 큰 장점을 가지고 있는데, new 연산자로 객체를 선언하는 것은 같은 값이어도 계속해서 생성하기 때문에 불변성이라는 이점도, 메모리 효율성에도 좋지 않기 때문에 리터럴 방식으로 사용하는 것이 좋다.

 

또한, String 클래스는 불변성(Immutable)으로 인해 문자열을 추가하는 연산에서 다른 문자열 클래스들 보다 성능이 떨어진다. 불변성은 변경할 수 없는 뜻으로 String의 value는 한 번 선언되면 이후에 변경할 수 없기 때문이다. 우리가 String에 다른 String을 더할 때는 기존의 값이 더해져서 변경되는 것이 아닌, 기존의 값에서 더하는 String 값을 더한 후에 최종적으로 새로운 인스턴스를 생성한다.

 

String first = "binco";
System.out.println("first 주소 :"+ first.hashCode());
//결과 : first 주소 : 154200

first = first + " blog";
System.out.println("first :"+ first);
System.out.println("first 주소 :"+ first.hashCode());
//결과 : first : "binco blog"
//결과 : first 주소 : 236840

 

결론적으로 위와 같이 String 클래스는 불변성을 가지고 있기 때문에, 변하지 않는 문자열을 선언할 때는 String 클래스를 리터럴 방식으로 선언해 주는 것이 좋고, 문자열 추가/수정/삭제 등 연산할 때는 String 클래스를 사용하는 것보다는 아래에서 설명드릴 StringBuilder와 StringBuffer를 상황에 맞게 사용하는 것이 좋습니다.

 

StringBuilder와 StringBuffer📘

StringBuilderStringBuffer크기가 유연하게 변경되는 가변성이라는 특징을 가지고 있습니다. 두 클래스 모두 AbstractStringBuilder라는 추상 클래스를 상속받아 구현되어 있기 때문에, append() 메서드를 이용하여 문자열을 추가할 때 기존 문자열에서 추가하는 문자열의 크기를 먼저 더한 후에 문자를 추가하는 방식으로 내부적으로 구성되어 있습니다.

 

AbstractStringBuilder

결론적으로 StringBuilder 와 StringBuffer 클래스를 사용할 때 문자열이 변경되면 같은 공간을 참조하는 것이며, 값만 변경되는 가변성가지고 있다는 뜻입니다. 하지만 두 클래스의 차이점도 있는데 바로 동기화(synchronized)입니다.

 

synchronized

스레드(Thread)란 한번에 여러 작업을 동시에 하는 것을 의미한다. 동시다발적으로 작업을 하는 것은 속도면에서 장점이 있지만, 여러 가지 작업에서 공통적으로 쓰이는 데이터에 한 번에 여러 스레드가 접근한다면, 프로그램상 예상과 다른 방향으로 꼬여버릴 수 있다. 이러한 점을 예방하기 위한 기능이 스레드 동기화(Thread Synchronized)이다.


StringBuilder는 동기화를 지원하지 않고, StringBuffer만 동기화를 지원하기 때문에 StringBuffer는 멀티 쓰레드 환경에서 안전하게 동작합니다. 그 이유는 StringBuffer는 위에서 설명드린 synchronized 키워드를 사용하기 때문입니다. 그렇다고 모든 환경에서 StringBuffer를 사용하는 것이 좋은 것은 아닙니다. 동기화를 사용하는 것은 안정성 면에서 효과를 볼 수 있지만, 반대로 속도적인 측면에서는 효율성이 떨어집니다. 그렇기에, 단일 쓰레드 환경에서는 StringBuilder 클래스를 사용하는 것이 좋고, 멀티 스레드 환경에서는 StringBuffer를 사용하는 것이 좋습니다😃

 

정리📗

  String StringBuffer StringBuilder
저장공간 String constant pool Heap Heap
속도 빠름 느림 빠름
동기화 여부 동기화 동기화 비동기화
속성 불변 가변 가변

 

마치며

지금까지 Java에서 사용하는 문자열들의 특징과 차이점에 대해 알아보았습니다. 차이는 간단하지만 그 원리를 정확하게 이해하고 사용해야 할 것 같네요. 한 두 개의 데이터는 프로그램상 큰 문제는 없지만 실무에서 여러 데이터가 축적되다 보면 예상치 못한 상황이 발생할 수 있으니 간단한 차이점이어도 꼭 원리를 알고 사용하면 좋을 것 같네요😁

 


👨‍👩‍👦‍👦 오픈채팅방 운영

취업을 준비하는 예비 개발자분들을 위한 질문&답변할 수 있는 공간을 만들었습니다. 취업과 이직을 하기 위해서 어떤 걸 중점적으로 준비해야 하는지부터 포트폴리오&이력서 작성법 등 다양한 질문들을 받고 답변을 드립니다. 참여하셔서 다양한 정보 얻고 가시면 좋을 것 같네요😁

 

참여코드 : 456456

https://open.kakao.com/o/gVHZP8dg

 

비전공 개발자 취업 준비방(질문&답변)

#비전공 #개발자 #취업 #멘토링 #부트캠프 #국비지원 #백엔드 #프론트엔드 #중소기업 #중견기업 #자바 #Java #sql

open.kakao.com

 

 


👨‍💻 전자책 출간

아울러 제가  🌟비전공자에서 2년만에 보안 전문 중견기업으로 이직 한 방법들을 정리한 전자책을 출간하게 되었습니다. 어떤 걸 공부해야 하는지, 이직을 위해서 무엇을 준비해야 하는지, 제가 받았던 기술 면접 리스트 등 다양한 목차로 구성되어 있습니다. 또한, 구매 시 1:1 채팅을 이용하여 포트폴리오 첨삭을 도와드리고 있습니다. 🐕전자책으로 얻은 모든 수익은 유기견 센터 '팅*벨 입양센터'에 후원될 예정입니다. 관심 있으신 분들은 아래 링크를 참고해 주세요😁

https://kmong.com/gig/480954

 

비전공개발자 2년만에 중견기업 들어간 방법 | 14000원부터 시작 가능한 총 평점 0점의 전자책, 취

0개 총 작업 개수 완료한 총 평점 0점인 Binco의 전자책, 취업·이직 전자책 서비스를 0개의 리뷰와 함께 확인해 보세요. 전자책, 취업·이직 전자책 제공 등 14000원부터 시작 가능한 서비스

kmong.com


 

반응형

'TIL' 카테고리의 다른 글

JavaScript 다중 검색 기능 만들기  (0) 2023.09.26
[Java] csv 파일 프로그램 여러가지 Tip  (0) 2023.09.14
PostgreSQL Join 활용 예제  (0) 2023.08.03
PostgreSQL JSON 데이터 활용 II  (7) 2023.06.01
PostgreSQL JSON 데이터 활용  (0) 2023.05.30