[자바] StringBuilder 와 StringBuffer ?
프로그래밍을 배우는 동안 String은 여러 목적으로 자주 쓰고있는 문자열 자료형 이다.
말그대로 하나의 문자가 아닌 여러문자로 이루여진 데이터를 의미한다.
또한 String 클래스는 여러 메소드를 가지고있어 원하는 목적에맞게 메소드를 활용하여 편리하게 사용이 가능하다.
프로그램을 만들어보던중 String이 가지고 있는 기능중에서 내가 원하는 메소드를 가지고 있지않다는 것을 알았고 그러다가 방법을 찾던 중
StringBuilder 와 StringBuffer 클래스에 대해 알게되었다.
일단 문자열안에 원하는 인덱스 위치에 원하는 문자열을 추가하는 메소드를 찾고있었다.
그 기능을 가진 메소드를 만들어도 되지만 이미 그 메소드가 존재할 것이라 생각했다.
StringBuilder 와 StringBuffer , String 은 어떤차이가 있을까 ..
String
일단 String객체는 immutable 이라고 한다. 즉 변하지않는 불변의 특성을 갖는다고 한다.
음..이 얘기는 이해가 잘되지않는다. 그래서 더 알아보았다.
String 클래스 내부에는 private final char value[] 이라는 char자료형의 배열이 존재한다.
String 클래스의 인스턴스의 문자열은 결국 private final 로 보호되어 변할 수가 없다는 말이 된다.
아 자주 쓰던 클래스인데도 이해하는데 꽤걸렷다...
아맞다 하면서 딱 생각이 난것이 String의 메소드를 사용할때 마다 새로운 String 인스턴스로 받아야만 한다는 사실이 생각이 났다. 그러고 나서 왜 내용이 변하지 않는 불변의 특성을 갖고 있는지 이해할 수 있게 되었다. 즉 원래 가지고 있던 내용은 바뀌지않고 바뀐내용을 새로운 String을 생성해서 반환한다는것이다.
그렇다면 메모리와 관련해서, 계속 String이 수정된다면 새로운 String 이 생성되어 heap에 계속 쌓이게 될 것이다. 메모리 관리를 생각한다면 효율적이지 못한것같다.
StringBuilder
String과 다르게 수정이 가능하다. immutable 이 아닌 mutable 이다.
String 에서 계속 값을 + 해서 변경할 경우 새로운 String클래스를 생성하지만
그와 다르게 새로운 객체를 생성시키지 않고 기존에 있는 객체의 크기를 증가시키면서 값을 더하게된다. 즉, String은 새로생성 될때마다 새로운 주소를 할당 받게 되어 heap에 쌓이게 되지만 StringBuilder는 기존의 주소에서의 메모리에서 더해지는 원리이다.
String 에서 계속 값을 + 해서 변경할 경우 새로운 String클래스를 생성하지만
그와 다르게 새로운 객체를 생성시키지 않고 기존에 있는 객체의 크기를 증가시키면서 값을 더하게된다. 즉, String은 새로생성 될때마다 새로운 주소를 할당 받게 되어 heap에 쌓이게 되지만 StringBuilder는 기존의 주소에서의 메모리에서 더해지는 원리이다.
이 StringBuilder가 제공하는 메소드에는 대표적으로
StringBuilder Append(string value) : 새로운 문자열을 뒤에 추가.
StringBuilder Insert(int index, string value) : index위치에 value를 삽입한다.
StringBuilder Remove(int Index, int length) : index위치에서 부터 length길이 만큼 일부를 삭제한다.
StringBuilder Replace(char AChar, char BChar) : A를 B로 교체한다.
string ToString() : StringBuilder을 String로 변환하여 반환한다.
StringBuffer
Stringbuilder와 메소드가 동일하고 하는일도 같은것같다.
하지만 StringBuilder와의 차이점이 있다.
동기화(synchronized) 지원 여부 이다. StringBuffer는 멀티 쓰레드상태에서 동기화를 지원한다는 것이다.
동기화를 지원하기때문에 멀티 쓰레드 에서는 StringBuffer를,
단일 쓰레드에서는 StringBuilder를 하는것이 좋다고한다.
여기서 동기화(synchronized) 라는것이 무엇을 의미하는것일까...
멀티쓰레드 환경에서 하나의 자원이 존재한다고 할때, 둘이상의 쓰레드가 이 자원에 동시 접근하여 수정된다면 문제가 발생할 수 있다. 이 상황을 처리하기위한 방법이 동기화를 이용하는것이다. synchronized 이 구현된 객체나 메소드가 실행되는 중에는 다른 쓰레드에서 접근할 수 없다.
동기화관련 처리로 인해 성능은 StringBuilder보다 약간 느리다고 한다.
마지막으로..
앞으로는 아무생각없이 String을 마구 사용하는것보단 상황에 맞게 알맞은 클래스들을 이용하여 사용해야겠다.ㅎㅎ
댓글
댓글 쓰기