본문 바로가기
Java/Java

API) 문자열 값을 수정해주는 StringBuilder, StringBuffer

by 박채니 2022. 3. 25.
SMALL

안녕하세요, 코린이의 코딩 학습기 채니 입니다.

 

개인 포스팅용으로 내용에 오류 및 잘못된 정보가 있을 수 있습니다.


String의 특징 중 하나인 불변성(immutable)!

public void test1() {
	String s1 = "java";
	String s2 = "java";
	String s3 = new String("java");
	String s4 = new String("java");
		
	System.out.println(s1 == s2);	//true
	System.out.println(s2 == s3);	//false
	System.out.println(s3 == s4);	//false
    
	System.out.println(s1.equals(s2));	//true
	System.out.println(s2.equals(s3));	//true
	System.out.println(s3.equals(s4));	//true
		
	System.out.println(s1.hashCode());	//3254818
	System.out.println(s2.hashCode());	//3254818
	System.out.println(s3.hashCode());	//3254818
	System.out.println(s4.hashCode());	//3254818

	System.out.println();
		
	s1 += "oracle";
	s3 += "oracle";
		
	System.out.println(s1.hashCode());	//87819808
	System.out.println(s2.hashCode());	//3254818
	System.out.println(s3.hashCode());	//87819808
	System.out.println(s4.hashCode());	//3254818
}

@콘솔출력값
true
false
false
true
true
true
3254818
3254818
3254818
3254818

87819808
3254818
87819808
3254818

문자열을 비교해주는 equals가 true라면 동일한 hashCode를 갖고 있으므로, s1/s2/s3/s3 모두 "java"를 갖고 있었으므로 true, 동일한 해쉬코드(3254818)이 출력되는 것을 알 수 있습니다.

여기서 s1과 s3에만 "oracle"을 추가하였습니다. 그렇다면 불변성 특징으로 인해 새로운 객체를 생성하여 참조값을 변경했을 것입니다.

따라서 s1과 s3의 hashCode가 변경된 것을 확인할 수 있었죠.

 

하지만 만일 자주 문자열을 바꾸고 더하고 빼고 한다면.. 그만큼 계속 객체를 재생성하기 때문에 메모리 낭비가 되겠죠.

 

이를 해결하고자 API에서는 문자열을 수정해줄 수 있는 StringBuilder와 StringBuffer를 제공해줍니다.

제공해주는 기능은 같지만 멀티쓰레드 동기화를 지원/미지원의 차이가 있습니다.

(아직 쓰레드를 안 배웠으므로 StringBuilder로 예를 들겠습니다.)


☞ StringBuilder

- mutable 멀티쓰레드 동기화 미지원

- 속도가 빠름

public void test2() {
	StringBuilder sb = new StringBuilder("java");
	System.out.println(sb.hashCode());
	System.out.println(sb);
	sb.append("oracle");
	System.out.println(sb.hashCode());
	System.out.println(sb);
}

@콘솔출력값
1130478920
java
1130478920
javaoracle

append() 메소드를 이용하여 "oracle"을 추가해주었습니다.

 

"java"의 값을 갖고 있는 객체의 주소값을 sb 참조변수에 대입해주었고, 해시코드를 출력해보았습니다.

그 후 "oracle"을 추가해 준 후 해시코드를 출력하니 동일한 해시코드가 출력되는 것을 확인할 수 있습니다.

 

새로운 객체를 생성한 것이 아닌 기존 객체에 "oracle"을 추가해준 것을 알 수 있습니다.

(해시코드 변동이 없으므로!!)

 

☞ StringBuffer

- mutable 멀티쓰레드 동기화 지원

- 속도가 다소 느림

LIST