카테고리 없음

StringBuffer 클래스 ( java.lang.StringBuffer)

까마귀코딩 2023. 2. 13. 14:31

String 의 클래스에서 인스턴스는 한번 생성되면 그 값을 읽기만 하고 변경할수 있다!

 

그러면 값을 변경하고 +추가도 하고싶을땐 뭘 쓰면될까 ??

 

바로 ! StringBuffer 클래스를 쓰면 된다 !

 

 

이를 위해서 StringBuffer 클래스는 내부적으로 buffer 라고 하는 독립적인 공간을 가진다 !

 

스트링 버퍼 클래스. . . . 

 

내부적으로 버퍼라고 하는 독립공간을 가짐 . . . 

 

버퍼 크기의  기본값은 16개의 문자를 저장할수 있는 크기 

생성자를 통해 그 크기를 별도로 설정할수 있다 !

 

하지만 !

인스턴스 생성시 사용자가 설정한 크기보다 언제나 16개의 문자를 더 저장할수 있도록 

여유있는 크기로 생성됩니다 !

 

 

더하기 연산자 + 요거 통해서 

String 인스턴스의 문자열을 결합하면,

내용이 합쳐진 새로운 String 인스턴스를 생성!!

 

 

 

따라서 문자열을 많이 결합하면 결합할수록 

공간의 낭비 뿐만 아니라 속도 또한 매우 느려지게 됩니다 !

 

속도저하와 공간낭비 하고 싶으면 

문자열을 많이 결합하면 되겠군.....

 

 

 

하 지 만 

StringBuffer 인스턴스를 사용하면

문자열을 바로 추가할수 있으므로, 

공간의 낭비도 없으며 속도도 매우 빨라집니다 !

 

이러한 StringBuffer 클래스는 java.lang 패키지에 포함되어 제공됩니다 !

 

 

String 클래스처럼 인스턴스가 한번 생성되면 그 값을 변경할수 없는 클래스를 불변클래스 라고 한다 !

 

반대로 StringBuffer 클래스와 같이 자유롭게 인스턴스의값을 변경할수 있는 클래스를 가변클래스라고 한다 !

 

String 클래스와 같은 불변클래스는 

StringBuffer 클래스의 append() 나 

insert() 메소드와 같이 값을 변경하는 set()메소드를 포함하지 않습니다. 

 

 

이렇게 불편할거같은 불변클래스를 사용하는 이유가 뭘까요 ? 

 

멀티 스레드 환경에서 객체가 변화되는 상황이라면  ? ? ? 

불변 인스턴스를 사용하는것이 좀더 신뢰할수있는 코드를 작성할수 있기 때문입니다!

 

즉, 하나의 객체에 접근하면서 각각의 객체가 서로 영향을 주어서는 안되는 경우에

불변 인스턴스를 사용하면 값이 변하지 않는다는점이 보장됩니다. 

 

 

아!

객체에 접근하고 싶고 

각각의 객체에 영향주고싶지는 않을때 

불변인스턴스를 사용하면 좋다는거구나~

 

 

append() 메소드 

 

요거 어따가 쓰는 메소드일까 ? 

 

append() 메소드는 인수로 전달된 값을 문자열로 변환한 후,

해당 문자열의 마지막에 추가합니다 !

 

이 메소드는 String클래스의 concat()메소드와 같은 결과를 반환하지만, 

내부적인 처리속도가 훨씬 빠릅니다!

 

String - concat보다 빠르다 !

 

 

 

StringBuffer str = new StringBuffer("Java");

System.out.println("원본 문자열 : " + str);

 

System.out.println(str.append("수업"));

System.out.println("append() 메소드 호출 후 원본 문자열 : " + str);

 

 

 

너무 길고 장황하다 

그냥 string 의 append 라고 하면 

문자열 뒤에 추가해주는거라고 생각하자 !

 

 

 

-----------------------------------

string 은 불변! 상수 !

 

그래서 자주 문자열 객체의 성질을 바꾸고 싶을때 사용하는게 스트링버퍼 !

 

스트링버퍼는 일종의 문자배열이며 

메모리를 자동으로 관리 !

 

메모리 삽입 / 삭제 / 추가 등등을 고속으로 처리!

 

 

그러니까 ~

문자열을 조작하는것이 목적 !

 

자주쓰는 메소드 : 

 

StringBuffer append() - 문자열 덧붙이기 

StringBuffer insert() - 문자열 삽입하기 

StringBuffer delete() - 문자열 삭제하기 

StringBuffer replace() - 문자열 대체하기 

 

StringBuffer repeat(n) - 문자열 n만큼 반복하기

 

boolean isBlank() - 문자열 비어있는지 조사하기  

Strng strip() - 유니코드가 정의하는 공백 싹다 제거하기 

String indent(n) -  각 줄 선두에 n만큼 공백넣어주기 

 

 

transform 함수 = 문자열을 인수로 받아서 임의의 변환을 수행하고 리턴하기

 

리턴타입이 꼭 문자열일 필요는 없고 임의의 함수를 지정할수 있다 !