💻 Study/Java

[Java] StringBuffer, StringBuilder 클래스와 메서드

와자! 2023. 3. 4. 23:30
728x90
728x90
이 게시글은 남궁성의 정석코딩 - 자바의 정석 기초편(2020최신)을 보고 공부한 내용을 정리한 게시글입니다.
틀린 내용이 있을 수 있습니다.

 

 

 

StringBuffer 클래스

String 클래스와 달리 내용을 변경할 수 있다.

문자열가지고 조작을 많이 할 경우 StringBuffer 클래스를 사용한다.

 

아래와 같이 객체 타입을 StringBuffer로 지정하고 StringBuffer의 메서드인 append()로 문자를 추가하면된다.

StringBuffer s = new StringBuffer("abc");
System.out.println(s.append("def")); // abcdef

 

 

StringBuffer 클래스는 equals() 메서드가 오버라이딩되어있지 않다.

String 클래스는 equals() 메서드가 내용을 비교하도록 오버라이딩 되어 있다.

// String 클래스의 equals() 메서드 사용
String str3 = new String("abc");
String str4 = new String("abc");

System.out.println(str3.equals(str4)); //true

 

같은 코드를 StringBuffer 타입으로 변경한 후 equals() 메서드를 사용하면 false가 뜬다.

StringBuffer str3 = new StringBuffer("abc");
StringBuffer str4 = new StringBuffer("abc");

System.out.println(str3.equals(str4)); //false

 

StringBuffer 클래스에서 equals() 메서드를 오버라이딩한 상태로 사용하고 싶다면,

toString()을 사용해서 String 타입으로 변경한 후 비교해야 한다.

StringBuffer str3 = new StringBuffer("abc");
StringBuffer str4 = new StringBuffer("abc");
String str5 = str3.toString();
String str6 = str4.toString();

System.out.println(str5.equals(str6)); //true

 

 

 

 


 StringBuilder 클래스

- 싱글 쓰레드 프로그램에서 사용하기 좋다.

* 싱글 쓰레드 : 한 번에 한 개의 작업만 할 수 있다. (ex. 카톡 채팅하면서 파일 다운로드 받기 불가)

* 멀티 쓰레드 : 한 번에 여러 개의 작업을 할 수 있다. (ex. 카톡 채팅하면서 파일 다운로드 받기 가능)

 

StringBuilder를 사용하는 이유

멀티 쓰레드 프로그램에서는 데이터를 공유하고 있어 작업하는 도중에 다른 사람이 건드릴 수 있다.

그래서 데이터를 보호하기 위해 동기화되어 있는 StringBuffer 클래스를 사용한다.

이 동기화는 멀티 쓰레드 프로그램이 아닌 경우 불필요한 작업을 진행해 성능 저하를 가져오기 때문에,

싱글쓰레드 프로그램을 사용하는 경우 동기화되어 있지 않은 StringBuilder 클래스를 사용한다. 

 

결론
멀티 쓰레드 프로그램이다 ⇒ StringBuffer 클래스
싱글 쓰레드 프로그램이다 ⇒ StringBuilder 클래스

 

 

 


 StringBuffer 메서드

StringBuilder 클래스도 사용할 수 있다.

 

 StringBuffer()

16문자를 담을 수 있는 버퍼(메모리 영역)를 가진 StringBuffer 객체를 생성한다.

괄호에 아무것도 입력하지 않을 경우 길이가 16인 배열이 생성되고,

숫자를 넣을 경우 숫자만큼의 문자를 담을 수 있는 배열을 생성,

문자를 넣을 경우 문자 개수 + 16 길이의 배열을 생성한다.

StringBuffer sb = new StringBuffer(); // 길이가 16인 배열
StringBuffer sb2 = new StringBuffer(10); // 길이가 10인 배열
StringBuffer sb = new StringBuffer("Hi"); // 길이가 18인 배열

 

 

 StringBuffer append(), StringBuffer insert(int pos, type)

StringBuffer append()

매개변수로 입력된 값을 문자로 변환하여 StringBuffe 객체가 저장하고 있는 문자열의 뒤에 덧붙인다.

StringBuffer sb1 = new StringBuffer("abc");
System.out.println(sb1); //abc

StringBuffer sb2 = sb1.append(true);
System.out.println(sb2); //abctrue

StringBuffer sb3 = sb1.append(123);
System.out.println(sb3); //abctrue123

System.out.println(sb1); //abctrue123
System.out.println(sb2); //abctrue123
System.out.println(sb3); //abctrue123

append는 기존 문자열 뒤에 값을 덧붙이고, 변수들은 그 주소를 참조하고 있기 때문에 

변수의 이름은 달라져도 참조하고 있는 주소가 같아 결과가 동일한 것을 확인할 수 있다.

 

StringBuffer insert(int pos, type)

type에 매개변수로 받은 값을 문자열로 변환하여 지정된 위치(pos)에 추가한다.

append()는 무조건 뒤에 삽입하는 반면, insert()는 원하는 위치에 추가할 수 있다.

StringBuffer sb = new StringBuffer("abcde");
sb.insert(3,"ccc");
System.out.println(sb); //abccccde

 

 

 

int capacity(), int length(), void setLength()

int capacity()

StringBuffer 객체의 버퍼크기를 알려준다.

 

int length()

StringBuffer 객체의 버퍼에 담긴 문자열의 길이를 알려준다.

StringBuffer sb = new StringBuffer();
sb.append("123");
System.out.println(sb.capacity()); //16
System.out.println(sb.length()); //3

sb.append("abcd");
System.out.println(sb.capacity()); //16
System.out.println(sb.length()); //7
- 처음 생성할 때 버퍼크기를 정해주지 않았으므로 capacity()의 값은 16이 나온다.
- length()는 버퍼에 담긴 문자열의 길이를 알려주므로 123의 길이, 3이라는 값이 나온다.
- append로 문자열을 추가한 후 capacity()를 구하면, 16이 나온다. 문자열이 추가된 것이기 때문이다.
- length()를 구하면 123abcd의 길이, 7이라는 값이 나온다.

 

void setLength(int newLength)

newLength에 입력한 길이로 문자열의 길이를 변경한다.

길이만큼의 문자열이 없을 경우 널문자 '\u0000'으로 채운다.

StringBuffer sb = new StringBuffer();

sb.append(123456789);
System.out.println(sb.length()); //9

sb.setLength(5);
System.out.println(sb); //9

sb.setLength(15);
System.out.println(sb); //12345          , 문자열 뒤에 10만큼의 공백이 있다.

 

 

 

 

char charAt(int index)

지정된 위치(index)에 있는 문자를 반환한다.

StringBuffer sb = new StringBuffer("abcde");
System.out.println(sb.charAt(3)); //d

 

 

StringBuffer delete(), StringBuffer deleteCharAt()

StringBuffer delete(int start, int end)

start 위치부터 end-1 위치까지의 문자를 제거한다.

StringBuffer sb = new StringBuffer("abcde");
System.out.println(sb.delete(1,3)); //ade

 

StringBuffer deleteCharAt(int index)

index 위치에 있는 문자를 제거한다.

StringBuffer sb = new StringBuffer("abcde");
System.out.println(sb.deleteCharAt(3)); //abce

 

 

 StringBuffer replace(), void setCharAt()

StringBuffer replace(int start, int end, String str)

start에서 end-1 사이의 글자를 str로 치환한다.

StringBuffer sb = new StringBuffer("abcde");
sb.replace(2, 4, "**");
System.out.println(sb); //ab**e

 

void setCharAt(int index, char ch)

index 위치에 있는 문자를 ch문자로 변경한다.

StringBuffer sb = new StringBuffer("abcde");
sb.setCharAt(4,'2');
System.out.println(sb); //abcd2

 

 

 StringBuffer reverse()

객체에 저장되어 있는 문자열의 순서를 거꾸로 나열한다

StringBuffer sb = new StringBuffer("abcde");
System.out.println(sb.reverse()); //edcba

 

 

 String substring()

String substring(int start)

start 범위부터 끝까지의 문자열을 잘라서 반환한다.

반환타입은 String이다.

 

String substring(int start, int end)

start 범위부터 end-1까지의 문자열을 잘라서 반환한다.

반환타입은 String이다.

StringBuffer sb = new StringBuffer("123456789");
System.out.println(sb.substring(5)); //6789
System.out.println(sb.substring(5,7)); //67

 

 

 

728x90
728x90