Programming Language/Java

[Java] String Class와 StringBuffer Class

개발왕 금골드 2020. 6. 21. 21:12
반응형

안녕하세요 골드입니다.

오늘은 Java에 있는 Class 중 String과 StringBuffer에 대해서 글을 쓰도록 하겠습니다.

 

1. String 클래스

 

일부 언어에서는 문자열을 Char형 배열로 다루었습니다.

하지만 자바에서는 문자열을 위한 String 클래스를 제공합니다.

String은 자바에서 제공해주는 Class입니다. int나 char과 같은 기본 자료형이 아닙니다.

String의 내부에서는 일부 언어에서 사용하는 것과 마찬가지로 Char형 배열로 저장됩니다.

 

문자열 변수를 선언할 때는 두 가지 방법이 있습니다.

문자열을 지정하는 방법과 String Class 생성자를 사용하는 방법입니다.

첫 번째로 문자열을 지정하는 방법을 사용한 경우입니다.

 

String a1 = "str";

String a2 = "str";

 

이 경우에 a1과 a2는 같은 주소값을 가리키게 됩니다. 문자열 리터럴은 이미 존재하는 것을 재사용하기 때문입니다.

 

a1 -> str

a2

 

두 번째 방법은 String Class 생성자를 사용하는 방법입니다. new 연산자에 의해 새로운 메모리에 할당되기 때문에 새로운 인스턴스가 생성됩니다.

 

String a1 = new String("str");

String a2 = new String("str");

 

문자열 값은 같지만, 새로운 인스턴스를 생성하였기 때문에 둘은 서로 다른 주소값을 가리킵니다.

 

a1 -> str

a2 -> str

 

 

String Class에서 중요한 점은 한 번 생성된 String형 변수가 갖고 있는 문자열은 읽을 수만 있고, 변경이 불가합니다.

 

예를 들어 아래와 같은 코드가 있다면

String str = "hello";

String bb = "world";

String str = str + bb;

 

마치 변수 str이 담고 있는 값 hello -> hello world로  바뀌는 것처럼 보이지만, 내부적으로 str은 hello라는 값이 담긴 주소를 가리키다가 str + bb;를 함으로써 다른 주소에 새로운 인스턴스를 생성하고 해당 변수가 있는 주소를 가리키게 됩니다.

 

str -> hello

bb -> world

 

(str -X-> hello)

str -> hello world

 

이후 hello값이 담겨있던 인스턴스는 자바의 가비지 컬렉터에 의해 제거됩니다.

 

결론적으로 String형 변수에 연산을 많이 사용한다면 메모리 공간에 낭비가 되므로 연산을 줄이거나 String을 사용하는 대신 StringBuffer Class를 사용하는 것이 좋습니다.

StringBuffer에 경우 String과 다르게 해당 인스턴스를 수정하는 작업이 가능합니다.

 

String Class는 중요하고 많은 메서드가 있습니다. 그 중 몇 가지만 보겠습니다.

 

boolean equals(Object obj)매개변수 문자열(obj)와 String 인스턴스를 비교합니다. obj가 String이 아니거나 문자열이 다르면 false를 반환합니다.

//b = true
int length()문자열의 길이를 알 수 있습니다.
// l = 2
String[] split(String regex)문자열을 regex로 분리해서 배열에 담습니다.

//arr[0] = a, arr[1] = b ...
String trim()문자열의 왼쪽과 오른쪽에 있는 공백을 제거한 결과를 반환합니다.

//s2 = aa
String valueof(Object o)매개변수로 지정된 값을 문자열로 변환합니다.
//i = "10"

 

2. StringBuffer 클래스

StringBuffer Class는 내부적으로 문자열 편집을 위한 버퍼(Buffer)를 가지고 있어 문자열 수정이 가능합니다. 버퍼는 StringBuffer 인스턴스를 생성할 때, 그 크기를 지정할 수 있습니다. 지정하지 않으면 16개의 문자를 저장할 수 있는 버퍼를 생성합니다. 만약 크기가 넉넉하지 않아 편집 중인 문자열이 버퍼의 크기보다 길어지게 되면 버퍼를 다시 늘려야 함으로 작업 효율이 떨어지게 됩니다.

StringBuffer도 마찬가지로 문자열을 저장하기 위해서 내부적으로 char형 배열을 사용합니다.

그럼 StringBuffer를 하나 생성하겠습니다.

 

StringBuffer sb = new StringBuffer("aaa");

 

그리고 뒤에 문자열을 추가합니다. 추가하기 위해서는 append()를 사용합니다.

 

sb.append("bbb"); //sb = aaabbb

 

를 하게 되면 sb의 주소값에 위치한 문자열 변수 뒤에 bbb가 합쳐집니다. String 클래스처럼 새로운 인스턴스를 생성하는 것이 아닙니다.

 

StringBuffer는 비교할 때 단순히 equals를 사용할 수 없습니다. toString()을 사용해서 String 인스턴스를 생성한 후 equals를 사용해야 합니다.

 

그럼 StringBuffer Class에서 사용하는 메서드 몇 가지를 보겠습니다.

 

StringBuffer append(Object obj)매개변수로 입력된 값을 문자열로 변환하여 StringBuffer 인스턴스에 저장된 문자열 뒤에 덧붙입니다.

//sb2 = abb
int capacity()
(length()는 문자열의 길이를 알려줍니다.)


//size = 16
StringBuffer delete(int start, int end)시작과 끝 위치 사이에 문자를 제거합니다. 단, 끝 위치는 제외합니다.

//sb2 = abcg
StringBuffer insert(int pos, Object obj)두 번째 매개변수를 문자열로 변환하여 지정된 POS에 추가합니다.

//sb = abcd!
StringBuffer replace(int start, int end, String str)시작 끝 범위에 문자를 주어진 문자열로 바꿉니다. 끝 위치는 포함되지 않습니다.

//sb = 01ab56

 

StringBuffer는 다양한 연산과 문자열 값을 편집하는데 많이 사용하기 때문에 편집을 위한 메서드 위주로 작성하였습니다.

String 클래스와 StringBuffer를 소개하는 이유는 결국 효율입니다. String형 변수를 가지고 다양한 연산을 하게 되면 낭비되는 메모리가 많기 때문에 다양한 연산을 사용해야 한다면 StringBuffer를 사용하는 것이 좋습니다. 

저는 알고리즘을 풀다가 StringBuffer에 필요성을 느껴서 공부해봤습니다.

 

 

 

 여기까지 골드였습니다.
감사합니다.

 

참고자료 :
남궁성 Java의 정석 3판 도우출판 p477

반응형