본문 바로가기

언어/Java

String vs StringBuffer / StringBuilder (with.java)

728x90

안녕하십니까 개발자 엄탱입니다!

오랜만에 블로깅을 하게 되었습니다!

 

이번 주제는 Java에서 대표적인 문자열 클래스인 String 그리고 StringBuffer, StringBuilder의 특징 및 차이점에 대해서 작성해 보겠습니다.

 

String

자바에서는 문자열을 위해 String이라는 클래스를 별도로 제공합니다.

자바는 String을 사용할 때 리터럴 표기와 객체를 선언하여야 사용합니다.

하지만 위의 두 가지 방식은 차이점이 있습니다.

간단하게 리터럴 표기법은 문자열 값 자체를 메모리 공간에 저장하고 다음에 동일한 문자열이 선언된다면 동일한 문자열을 갖고 있는 메모리를 참고하는 형식이고, **new String()**은 인스턴스화 시켜줄 때마다 새로운 데이터가 메모리에 올라가는 방식입니다.

 

 

String a = "HELLO"; // 리터럴 표기
String b = "HELLO"; // 리터럴 표기
String c = a;
//1. System.out.println(a == b); // true
//2. System.out.println(a == c); // true
//3. System.out.println(a.equals(b)); // true

String d = new String("HELLO");
String d2 = new String("HELLO");

//4. System.out.println(d == d2); // false
//5. System.out.println(d.equals(d2)); // true

//6. System.out.println(a == d2); // false
//7. System.out.println(a.equals(d)); // true

 

 

위의 예제를 살펴보면, ==(객체의 주소값 비교)와 equals(값 비교) 연산자가 있습니다.

a, b, c는 ==로 비교하면 true로 나오지만, a, d, d2는 ==로 비교하면 false로 나옵니다.

하지만 값자체는 같기에 equals를 사용하여 비교하면 전부 true로 나오는 것을 볼 수 있습니다.

 

String 인스턴스는 한 번 생성되면 그 값을 읽기만 할 수 있고, 변경하 수는 없습니다.
이러한 객체를 자바에서는 **불변 객체(immutable object)**라고 합니다.

즉, 자바에서 덧셈(+) 연산자를 이용하면 문자열 결합을 수행하면, 기존 문자열의 내용이 변경되는 것이 아니라 내용이 합쳐진 새로운 String 인스턴스가 생성되는 것입니다.

이렇기 때문에 읽어오는 게 더 많은 방식에는 String을 사용하는 게 더 좋은 선택일 수 있습니다.
하지만, 문자열의 추가, 수정, 삭제와 같은 연산자가 자주 발생하는 문자열에서는 String은 성능에 좋지 않을 수 있습니다.

 

문자열의 추가, 수정, 삭제가 많은 경우에는 StringBuffer, StringBuilder를 사용하는 것이 좋습니다.

 

 

StringBuffer / StringBuilder

해당 클래스는 String과 같이 문자열을 위한 클래스입니다.

하지만 String과는 반대로 가변객체이기 때문에 append(), delete()와 같은 내장함수를 사용하여 문자열을 변경할 수 있고, 변경하더라도 String처럼 인스턴스를 새롭게 생성하지 않고 기존의 버퍼 크기를 늘리면서 동작합니다.

 

StringBuffer와 StringBuilder 차이점

StringBuffer와 StringBuilder의 내장함수는 서로 동일합니다. 차이점은 아래와 같습니다.

  • StringBuffer는 각 메서드별로 Synchronized Keyword가 존재하여, 멀티스레드 환경에서도 동기화를 지원하여 멀티스레드 환경에 안전하지만 동기화 관련 처리로 인해 StringBuilder에 비해 성능이 좋지 않습니다.
  • StringBuilder 같은 경우는 동기화를 보장하지 않아 멀티쓰레드 환경에는 적합하지 않고 단일 스레드에 적합합니다.

 

총 정리

String: 문자열 연산이 적은 곳에 유리하며 멀티스레드 환경에서 사용 (불변 객체이기 때문에 멀티스레드 환경에 유리- 이 부분은 추후에 더 공부해서 설명을 추가하겠습니다.)

StringBuffer: 문자열 연산이 많고 멀티스레드 환경에서 사용

StringBuilder: 문자열 연산이 많고 단일스레드 환경에서 사용

728x90