Java/JAVA

[JAVA] 자바의 String과 StringBuffer

담크 2021. 9. 19. 15:30

오늘은 String과 StringBuffer의 차이점에 대해서 공부해보도록 하겠습니다.

 

String

지난 포스팅에서도 설명했지만 String은 불변성(immutable)을 가지고 있습니다.

불변성이란 말 그대로 변하지 않는 것을 의미합니다. 그래서 데이터가 한번 생성되고 나면 그 뒤에는 변하지 않습니다.

String이 한번 선언되면 변하지 않는다니 뭔가 잘 이해가 안되시죠 간단한 코드로 알아봅시다.

String s = "Hello";
System.out.println(s.hashCode());
s += ", Java";
System.out.println(s.hashCode());
System.out.println(s);

결과를 보면 s를 출력했을때의 연산은 잘 나왔지만 주소값이 앞에 두 개가 다른 것을 알 수 있습니다.

이 말은 처음 문자열 "Hello"에 ", Java"라는 연산을 하게되면 s에 값이 "Hello, Java"로 바뀌는 것이 아니라 새로운 s가 만들어진다는 의미입니다.

만약 여기에서 같은 값인 "Hello, Java"를 추가해도

String h = "Hello, Java";
System.out.println(s == h);
System.out.println(s.equals(h));

s는 연산을 통해 만들어진 주소값을 가져오고, h는 String pool에 이미 생성되어있던 주소값을 가져왔기 때문에 s == h값이 false가 나옵니다.

 

 

StringBuffer

StringBuffer 클래스는 java.lang 패키지 안에서 제공하고 있으며, String과 다르게 가변성(mutable)을 가지고 있습니다.

먼저 코드를 통해 간단하게 알아봅시다.

StringBuffer sb = new StringBuffer();
System.out.println(sb.hashCode());

sb.append("Hello").append(", Java");
System.out.println(sb.hashCode());
System.out.println(sb);

StringBuffer의 경우 new를 통해 새로운 객체를 생성해준 후 append( ) 메소드를 이용하여 String처럼 문자열을 추가해줬습니다.

여기서 String과의 차이가 발생하게 되는데 StringBuffer는 인스턴스의 값을 자유롭게 변경할 수 있는 가변성의 특징을 가지고 있기 때문에 문자열을 추가하기 전과 후의 hashcode를 비교해봤을 때 동일한 주소값을 가지고 있다는 것을 알 수 있습니다.