망각에 재주 있는 나를 위해 기록하는 곳.

[자바/JAVA] String, StringBuffer, StringBuilder 본문

JAVA

[자바/JAVA] String, StringBuffer, StringBuilder

baobabtree 2021. 7. 12. 11:22

< String, StringBuffer, StringBuilder 셋의 차이점 >

 

 

String에 저장된 문자열은 수정할 수 없다.

 

무슨 말이냐 하면

String str = "abc";

위에 str변수에 abc문자열이 있는데 여기에

str += "def"; 	// str = str + "def";

def를 추가한다고 생각하면 기존 abc문자열에 def가 이어져서 abcdef가 될 거라고 생각하지만, 

기존 abc가 만들어진 객체에 연결이 끊기고 새로운 abcdef 객체가 만들어지고 연결된다.

이렇게 되면 기존 abc는 메모리 영역에 남아있게 되고 가비지컬렉션(Garbage Collection)에 의해 삭제된다.

만약 상황이 문자 수정, 추가, 삭제가 자주 일어나는 상황이라면 String을 쓰는 것이 성능 저하의 요인이 될 것이다.

 

그래서 쓰는 것이 가변성을 지닌 StringBuffer, StringBuilder클래스이다.

위 두 클래스는 문자열을 내부 버퍼(buffer: 데이터를 임시로 저장하는 메모리)에 문자열을 저장해 두고, 그 안에서 

추가, 수정, 삭제 작업이 가능하게 되어있다. 객체를 또 만들지 않고 한 객체 내에서 작업을 하는 것이다.

 

StringBuffer와 StringBuilder는 사용법은 동일하다. 하지만 둘의 차이점은

StringBuffer는 멀티 스레드 환경에서 사용할 수 있도록 동기화 적용이 되어있다.

Stringbuilder는 단일 스레드 환경에서만 사용이 가능하다. 

( *동기화: 여러 스레드가 한 개 자원을 사용하고자 할 때, 해당 점유하고 있는 스레드가 작업이 끝날 때까지 다른 나머지 스레드는 접근을 못하게 하는 것. )

(동기화와 스레드는 따로 정리하기로)

 

 

 

아래는 StringBuffer, StringBuilder에서 문자 추가, 삽입, 삭제 작업을 하게 해주는 메서드들이다.

 

append("문자열");      // 문자열 끝에 추가로 삽입.
insert(int offset,....)    // 문자열 중간에 추가.
delete(int start, int end)     // 문자열의 일부분 삭제
deleteCharAt(int index)     // 문자열에서 주어진 index의 문자를 삭제
replace(int start, int end, String str)     // 문자열의 일부분을 다른 문자열로 대체
reverse()     // 문자열의 역순으로 바꿈.
setCharAt(int index, char ch)     // 문자열에서 주어진 index의 문자를 다른 문자로 대체

 

StringBuilder sb1 = "문자열123";
// Type mismatch: cannot convert from String to StringBuilder


StringBuilder sb = new StringBuilder();

sb.append("hello");
sb.append(" java");
System.out.println(sb.toString());		
// 결과: hello java
		
sb.insert(2, "a");		// 문자의 위치는 0번부터 시작이다.
System.out.println(sb.toString());	
// 결과: heallo java
		
sb.delete(0, 2);	// 0번째 위치부터 1번째까지 지워졌다.
System.out.println(sb.toString());
// 결과: allo java
		
sb.deleteCharAt(2);		// 두번째 l이 지워져서 alo java가 되었다.
System.out.println(sb.toString());
// 결과: alo java
		
sb.replace(0, 3, "hi");		// 0번째부터 2번째까지 삭제되고, 그 자리에 hi가 들어갔다.
System.out.println(sb.toString());
// 결과: hi java
		
sb.setCharAt(0, 'H');	// 0번째 문자를 'H'로 대체함.
System.out.println(sb.toString());
// 결과: Hi java
		
sb.reverse();
System.out.println(sb.toString());
//결과: avaj iH