공부하는 블로그

String과 String buffer의 차이점? 본문

Develop/JAVA

String과 String buffer의 차이점?

모아&모지리 2018. 1. 24. 19:44

자바의 기본 데이터 타입인 int, float, char 등과 다르게 String은 데이터 타입이 아닌 클래스객체입니다.

데이터 타입들은 시작할때 소문자로 시작하지만 String은 대문자로 시작하죠?

흡사 클래스의 객체를 만들때와 동일합니다.

또한 String은 불변 객체입니다.

한번 String name = "제이"; 라고 선언을 해버리면 먼저 String 객체 타입인 name이라는 인스턴스를 만들고

메모리에 제이 를 올려버립니다. 그리고 name이 제이를 참조하는 래퍼런스가 되는것입니다.

중요한점은 지금부터입니다.

이제 이 name에 새로운 내용을 추가합니다.

name = name + "잡식성개발자";

위와같은 소스를 적용하게 되면 name인스턴스가 가리키는 값은 제이잡식성개발자 가 됩니다.

우리는 흔히 이런식으로 코딩을 했을텐데 아까 위에서 String이 불변 객체라고 성명을 했듯이

한번 선언된 내용에 추가적으로 바뀌지 않습니다. String은 char의 배열 형태가 아니기 때문에 내용의 추가와 삭제가 되지 않거든요

그럼 도대체 어떻게 name 변수의 값이 바뀌는건지 답은 내부에 있습니다.

name = name + "잡식성개발자"; 구문이 실행될때 실제로는 스트링버퍼를 새로 생성해서

name이 가리키는 제이 를 만들어주고 스트링버퍼의 append 함수를 이용하여 잡식성개발자를 붙여줍니다.

그렇게 완성된 스트링버퍼값을 메모리에 올리고 name은 다시 이 값을 참조하게 됩니다.

스트링버퍼는 char 타입의 배열 형태로 되어있어서 한글자 한글자를 append 할 수 있다는것을 아셔야합니다.

그럼 그 와중에 생겨난 메모리 안의 제이 라는 값과 잡식성개발자 라는 값은 가비지컬렉터가 가지고 있다가 필요없어서 버리게 되겠죠

그 짧은 순간에 이런 일처리가 일어나게 되는겁니다.

아주 미세하지만 스트링버퍼를 사용하는경우가 스트링객체를 사용하는것보다 빠를것같다는게 제 생각입니다.