Java: String, StringBuilder, StringBuffer

Buddy·2022년 9월 27일
0

Java

목록 보기
1/2

Why Use StringBuffer and StringBuilder in Java

Why Use StringBuffer and StringBuilder in Java
이 글에서는 왜 자바에서 StringBuffer 와 StringBuilder 를 사용하는지, 자바의 문자열에 대해 깊게 이해하고 어떻게 효과적으로 문자열을 사용하여 실수를 피하는 방법에 대해 설명한다.
특히 StringBuffer 와 StringBuilder 사이의 차이점을 이해하고 적재적소에 맞게 사용 할 수 있게 될 것이다.

String sql = "Insert Into Users (name, email, pass, address)";
sql += " values('" + user.getName();
sql += "', '" + user.getEamil();
sql += "', '" + user.getPass();
sql += "', '" + user.getAddress();
sql += "')";

위의 코드는 여러개의 문자열을 연결하여 SQL 의 Inster 문을 구성하고 있다.

Java 에서의 String 은 불변객체이다. 때문에 + 연산을 할 때 마다 문자열에 추가적인 요소가 붙는 것이 아닌 기존의 문자열의 연산으로 새로운 문자열 객체가 생성되어 할당되는 것이다.

sql += " values('" + user.getName(); 

이 코드에서 “ values(’” 라는 String 객체가 생성되고 연산되어 새로운 문자열 객체가 sql 에 저장된다. 이러한 방식으로 문자열을 생성할 경우 중간에 불필요한 문자열 객체가 많이 생성된다. 객체 생성은 항상 다른 작업보다 시간이 오래 걸리고 리소스를 더 소모하게 된다. 고로 String 을 통해서 문자열을 연결하는 방법은 비효율적이다.

StringBuilder

이때 StringBuilder 를 사용해서 위와같은 문제점을 해소 할 수 있다.

Java 는 StringBuilder 를 통해 문자열을 mutable 하게 다룰 수 있도록 하고, 일반적인 문자열에 대한 performance issue 를 해소한다.

위의 sql 문자열 concatentation 은 StringBuilder 를 사용하면 아래와 같다.

StringBuilder sb 
		= new StringBuilder("Insert Into Users (name, email, pass, address)";)

sb.append(" values('").append(user.getName());
sb.append("', '").append(user.getEmail());
sb.append("', '").append(user.getPass());
sb.append("', '").append(user.getAddress());
sb.append("')");

String sql = sb.toString();

문자열 concatentation 에서는 StringBuilder 를 사용하는 것이 performance 에서 우수하다는 것을 기억하자.

StringBuilder (Java Platform SE 8 )

StringBuffer

StringBuffer 는 동기화가 된다는 특징을 제외하면 StringBuilder 와 같이 동작하고, StringBuilder 와 유사한 Method 를 가지고 있다. 고로 멀티 쓰레드 환경에서 인스턴스를 공유하고 싶다면 StringBuffer 가 필요하다. Java Docs 의 StringBuilder 설명에서도 멀티 쓰레드 환경에서는 StringBuffer 를 사용할 것을 명시하고 있다. 싱글 쓰레드 환경이라면 StringBuffer 보다 StringBuilder 를 사용하는 것이 performance 에서 우수하다.

StringBuffer sbSql
    = new StringBuffer("Insert Into Users (name, email, pass, address)");
 
sbSql.append(" values ('").append(user.getName());
sbSql.append("', '").append(user.getEmail());
sbSql.append("', '").append(user.getPass());
sbSql.append("', '").append(user.getAddress());
sbSql.append("')");
 
String sql = sbSql.toString();

StringBuffer (Java Platform SE 8 )

결론

String 을 사용해 문자열을 다루는 것은 ‘문자열은 불변객체’ 라는 특징 때문에 불필요하게 새로운 문자열 객체들이 여러번 생성될 수 있다. 이를 해소하기 위해 StringBuilder, StringBuffer 를 사용한다.

StringBuilder 와 StringBuffer 는 사용성이 유사하나, StringBuffer 는 Synchronized 한 특성을 가지고 있어 멀티 쓰레드 환경에서 사용이 가능하고, StringBuilder 는 멀티 쓰레드 환경에서는 의도된 사용성에서 벗어날 수 있기 때문에 환경을 고려해서 사용해야 한다. 다만, 싱글 쓰레드 환경에서 StringBuiler 의 성능이 더 우수하다.

추가
자바 8 이후(? 버전은 정확하지 않음) 에서는 컴파일 시 String 연산도 StringBuilder 로 변환되어 성능 차이가 없다고 함.

다만 메모리 낭비가 심한 경우가 있을 수 있으니 아래와 같은 케이스에서는 StringBuilder 를 사용하는 것이 권장!

// 연산 중 String 객체가 계속 생성되어 메모리의 낭비가 있을 수 있음
...
String result="";
for(String s : stringArray) {
	result = result + s;
}
// 연산 중 String 객체가 계속 생기는 것을 방지하는 방법
...
StringBuilder stringBuilder = new StringBuilder()
for(String s : stringArray) {
	stringBuilder.append(s);
}
String result = stringBuilder.toString();

https://stackoverflow.com/questions/1532461/stringbuilder-vs-string-concatenation-in-tostring-in-java

일반적으로 String, StringBuilder, StringBuffer 의 성능은
StringBuilder > StringBuffer > String 이라고 한다.
다만 StringBuilder, StringBuffer 는 성능보다 사용하는 용도가 다른것이니 모든 상황에서 StringBuilder 를 사용하는 것이 좋은 것은 아니다.

profile
가볍게 쓰는 내용들이라 주관과 틀린 내용이 많습니다. 비판적인 시각으로 봐주시고 지적은 환영 :)

0개의 댓글

관련 채용 정보