본문 바로가기
Study/java

Java 스트링빌더(Stringbuilder), 스트링버퍼(Stringbuffer)

by 얏옹이 2022. 11. 26.
반응형

Stringbuilder와 Stringbuffer는 거의 흡사하다.

 

다만, 동기화가 되고 안되고의 차이로 나눌수 있을거같은데. 동기화가 되면 멀티쓰레드에 안전하다.

 

싱글쓰레드와 멀티쓰레드의 차이점은, 쉽게 얘기하자면 싱글쓰레드는 1인이 혼자 일하는거고, 멀티 쓰레드는 여러 사람이 여러일을 동시에 하는것이라고 보면 될거같다.

 

Stringbuffer는 동기화가 되어있다. 따라서 멀티 쓰레드에 안전하고, Stringbuilder는 동기화가 안되어있다.

 

따라서 멀티 쓰레드 프로그램이라면 Stringbuffer를 사용하는것이 좋고. 싱글 쓰레드 프로그램이면 오히려 Stringbuffer가 불필요한 성능 저하를 일으킨다. 따라서 이럴때는 Stringbuilder가 적합하다.

 

그외 나머지 사용할수 있는 메소드나같은건 다 동일하다.

 

String 클래스의 단점을 보완한것이 바로 Stringbuilder와 Stringbuffer인데, 일단 String 클래스는 내부의 문자열을 수정할수가 없다.

 

String 클래스는 문자열을 추가하거나 새롭게 선언하면 Heap영역에 객체를 새롭게 생성해서 그 객체의 주소를 새롭게 가르키게 된다. 동작 수행을 해보면 사용자가 보기에는 크게 다름은 없지만. 메모리 적으로는 계속해서 새로운 객체를 생성해낸다면 메모리 낭비가 일어난다.

 

Stringbuffer와 Stringbuilder는 버퍼(buffer)라는 임시 메모리에 문자열을 저장한다. 그리고 그 버퍼 내부에서 문자열을 추가, 혹은 삭제 할수 있다. String 클래스의 메모리 적인 단점을 보완한것이다.

 

일단 간단한 예제는 싱글쓰레드 이기때문에 Stringbuilder로 작성 해보겠다.

 

public class StringTest01 {
	public static void main(String[] args) {
		
		//Stringbuilder 객체 생성 방법 2가지
		StringBuilder sb = new StringBuilder();
		StringBuilder sb1 = new StringBuilder("2022 카타르 월드컵 대한민국 16강 갈수 있드아");
		
		
		
		System.out.println(sb);
		System.out.println(sb1);
	}
}

 

Stringbuilder의 선언 방식은 2가지다.

 

일반적인 클래스 객체 생성방법과 생성과 동시에 문자열을 할당해도 된다.

 

 

아직 sb 변수에는 문자열을 추가해주지 않아서, 공백처리 되고, Sb1에는 처음에 선언할때 대입한 문자열이 정상적으로 출력된다.

 

이제 Stringbuilder의 메소드들을 살펴보면서 문차열을 추가, 삭제 및 조작 해주겠다.

 

데이터 끝부분에 추가는 .append() 이다.

public class StringTest01 {
	public static void main(String[] args) {
		
		//Stringbuilder 객체 생성 방법 2가지
		StringBuilder sb = new StringBuilder();
		StringBuilder sb1 = new StringBuilder("2022 카타르 월드컵 대한민국 16강 갈수 있드아");
		
		sb.append("김민재 ");
		sb.append("손흥민 ");
		sb.append("화이팅");
		
		
		
		System.out.println("sb : "+sb);
		System.out.println("sb1 : "+sb1);
	}
}

 

sb에 정상적으로 문자열끝부분에 잘 추가 된다.

 

다음 문자열을 지울수도 있다 .delete()로 지워준다 delete()는 int형 parameter를 2개 받는 delete()와. int형 parameter 1개를 받는 deleteCharAt()이 존재한다.

 

parameter 2개를 받는 delete()는 문자열의 각 문자를 인덱스 번호로 취급해, 시작번호~ 끝번호 사이 범위의 문자열을 삭제해주고.

 

parameter 1개를 받는 deleteCharAt()은 특정 인덱스 번호의 글자 '한글자' 만을 지워준다.

 

public class StringTest01 {
	public static void main(String[] args) {
		
		//Stringbuilder 객체 생성 방법 2가지
		StringBuilder sb = new StringBuilder();
		StringBuilder sb1 = new StringBuilder("2022 카타르 월드컵 대한민국 16강 갈수 있드아");
		
		sb.append("김민재 ");
		sb.append("손흥민 ");
		sb.append("화이팅");
		
		
		
		System.out.println("sb : "+sb);
		System.out.println("sb1 : "+sb1);
		
		sb1.delete(0, 4);
		sb.deleteCharAt(0);
		System.out.println("sb : "+sb);
		System.out.println("sb1 : "+sb1);
		
		
	}
}

문자열의 첫번째 인덱스를 0부터 시작한다. SB1의 0번인덱스부터 4번째 전, 즉 0~3사이의 글자를 삭제해주었고

SB에서는 deleteCharAt()으로 0번째 인덱스를 지워주었다.

 

 

 

정상적으로 지워진것을 확인할수 있다.

 

 

 

다음은 문자열 변환이다. replace()이다. 총 3개의 parameter를 줘야하는데. 시작인덱스, 끝 인덱스, 변환할 문자로 parameter을 줘야한다.

 

16강을 4강으로 변경해보겠다.

 

public class StringTest01 {
	public static void main(String[] args) {
		
		//Stringbuilder 객체 생성 방법 2가지
		StringBuilder sb = new StringBuilder();
		StringBuilder sb1 = new StringBuilder("2022 카타르 월드컵 대한민국 16강 갈수 있드아");
		
		sb.append("김민재 ");
		sb.append("손흥민 ");
		sb.append("화이팅");
		
		
		
	
		
		sb1.replace(18, 21, "4강");
		
		System.out.println(sb1);
		
	}
}

 

참고로 문자열의 인덱스 번호는 공백도 포함해서 계산해야한다.

 

18번 인덱스부터 21번까지의 인덱스를 "4강" 이라고 변경해주고 출력하니 16강이 4강으로 수정되었다.

 

replace와 비슷하게 setCharAt()이 있는데 이건 parameter가 2개다, 인덱스 번호와 char타입의 '문자'

 

말 그대로 특정 인덱스번호의 '한글자'를 바꾸겠다는것이다.

 

public class StringTest01 {
	public static void main(String[] args) {
		
		//Stringbuilder 객체 생성 방법 2가지
		StringBuilder sb = new StringBuilder();
		StringBuilder sb1 = new StringBuilder("2022 카타르 월드컵 대한민국 16강 갈수 있드아");
		
		sb.append("김민재 ");
		sb.append("손흥민 ");
		sb.append("화이팅");
		
		


		sb.setCharAt(0, '손');
		System.out.println(sb);
	
		
	}
}

 

setCharAt()의 유의할점은 parameter값으로 char타입을 줘야하기때문에 큰따옴표가 아닌 작은 따옴표로 줘야한다.

 

 

김민재의 성이 손으로 변경되었다.

 

 

 

다음은 문자열 뒤집기. reverse()가 있다. 문자열을 말 그대로 뒤집어서 역순으로 출력해준다.

 

public class StringTest01 {
	public static void main(String[] args) {
		
		//Stringbuilder 객체 생성 방법 2가지
		StringBuilder sb = new StringBuilder();
		StringBuilder sb1 = new StringBuilder("2022 카타르 월드컵 대한민국 16강 갈수 있드아");
		
		sb.append("김민재 ");
		sb.append("손흥민 ");
		sb.append("화이팅");
		
		


		sb.reverse();
		System.out.println(sb);
		
	
		
	}
}

 

 

마지막으로 insert()를 확인해보겠다. insert()는 parameter가 2개다. index번호, 문자열 이다.

 

index번호에 해당하는 위치에 글자를 삽입하겠다는것이다.

 

public class StringTest01 {
	public static void main(String[] args) {
		
		//Stringbuilder 객체 생성 방법 2가지
		StringBuilder sb = new StringBuilder();
		StringBuilder sb1 = new StringBuilder("2022 카타르 월드컵 대한민국 16강 갈수 있드아");
		
		sb.append("김민재 ");
		sb.append("손흥민 ");
		sb.append("화이팅");
		
		


		sb.insert(1, "킹갓제너럴");
		System.out.println(sb);
		
		
	
		
	}
}

 

인덱스 1번째 위치에, parameter값으로 던진 문자열이 삽입된것을 알수 있다.

 

 

마지막으로 length. 말 그대로 문자열의 문자 갯수 길이를 int형으로 리턴해준다.

 

public class StringTest01 {
	public static void main(String[] args) {
		
		//Stringbuilder 객체 생성 방법 2가지
		StringBuilder sb = new StringBuilder();
		StringBuilder sb1 = new StringBuilder("2022 카타르 월드컵 대한민국 16강 갈수 있드아");
		
		sb.append("김민재 ");
		sb.append("손흥민 ");
		sb.append("화이팅");
		
		


		sb.insert(1, "킹갓제너럴");
		System.out.println(sb);
		
		int length = sb.length();
		System.out.println("sb의 길이:"+length);
		
	
		
	}
}

반응형