Published 2022. 11. 4. 16:42

- StringBuilder, StringBuffer = 가변클래스( 기존의 자리에서 값이 변경되는 개념)

* 두개의 클래스 모두 생성자나 메소드가 동일함

* 유일한 차이점 동기화 유무 => 속도차이 

*동기화 : 한자원에 대해 여러 스레드가 접근하려 할 때 한 시점에서 하나의 스레드만 사용될 수 있도록 하는 것 

 >StringBuilder : 동기화 제공 x -> 속도가 빠름

> StringBuffer : 동기화 제공 o -> 속도가 느림 

 

** StringBuilder 

- 리터럴값 바로 대입 불가 

StringBuilder sb1 = "hello"; (x)

-객체 생성시 처음에 16개의 문자들을 저장할 수있는 버퍼가 내부적으로 생성

public void method1() {
         //1.기본 생성자로 생성
		StringBuilder sb1 = new StringBuilder();
		System.out.println("sb1의 수용량 : "+ sb1.capacity()); //16
		System.out.println("sb1 문자열의 길이 : "+ sb1.length());//0
		
		//2.정수값 하나 전달가능한 매개변수 생성자로 생성 
		StringBuilder sb2 = new StringBuilder(30);
		System.out.println("\nsb2의 수용량 : "+sb2.capacity());//30 => 전달한 정수값 크기만큼의 수용량 생성됨 
		System.out.println("sb2 문자열의 길이 : "+ sb2.length());//0
		
		//3.문자열 하나 전달가능한 매개변수 생성자로 생성
		StringBuilder sb3 = new StringBuilder("반가워!!");
		System.out.println("\nsb3의 수용량 : "+ sb3.capacity()); //21  // 기본값 16+6 =21 
		System.out.println("sb3 문자열의 길이 : "+ sb3.length()); //5
	}

- StringBulider 는 가변클래스로 값 변경시 주소값이 변경되지 않음 (즉 , 그자리에서 수정)

public void method2() {
		
		StringBuilder sb = new StringBuilder("반가워!");
		
		System.out.println("sb : " + sb); //반가워!
		System.out.println("수용량 : "+ sb.capacity()); //20
		System.out.println("문자열의 길이 : "+ sb.length()); //4
		System.out.println("주소값 : "+System.identityHashCode(sb)); //1562557367
		System.out.println("======================");
		
		//1. (붙이다 추가하다)append(String str) : StringBuilder타입으로 반환 
		//    기존의 문자열에 새로운 문자열을 추가하고 싶을때 사용 
		sb.append("안녕!");
		System.out.println("sb : " + sb); //반가워!안녕!
		System.out.println("수용량 : "+ sb.capacity()); //20
		System.out.println("문자열의 길이 : "+ sb.length()); //7
		System.out.println("주소값 : "+System.identityHashCode(sb)); //1562557367 주소값 변경안됨 
		System.out.println("======================");
		
		sb.append("다들 조금만 힘내세요!!!");//14글자 (수용범위 초과)
		System.out.println("sb : " + sb); // 반가워!안녕!다들 조금만 힘내세요!!!
		System.out.println("수용량 : "+ sb.capacity()); //42 (기존의 수용량 *2 + 2)
		System.out.println("문자열의 길이 : "+ sb.length()); // 21
		System.out.println("주소값 : "+System.identityHashCode(sb)); //1562557367 주소값 변경안됨 
		System.out.println("======================");
        
		//2.delete(int start, int end): 반환형 StringBuilder
		//        시작인덱스<=  <끝인덱스 범위의 문자열 삭제 
		sb.delete(2, 5); // 워, 녕
		System.out.println("sb : " + sb); // 반가녕!다들 조금만 힘내세요!!!
		System.out.println("수용량 : "+ sb.capacity()); //42 
		System.out.println("문자열의 길이 : "+ sb.length()); // 18
		System.out.println("주소값 : "+System.identityHashCode(sb)); //1562557367 주소값 변경안됨 
		System.out.println("======================");
		
		//3.insert(int offset,String str) : StringBuilder
		//  offset위치에 str추가시켜주는 메소드
		sb.insert(1, "ㅎㅎㅎ");
		System.out.println("sb : " + sb); // 반ㅎㅎㅎ가녕!다들 조금만 힘내세요!!!
		System.out.println("수용량 : "+ sb.capacity()); //42 
		System.out.println("문자열의 길이 : "+ sb.length()); // 21
		System.out.println("주소값 : "+System.identityHashCode(sb)); //1562557367 주소값 변경안됨 
		System.out.println("======================");
		
		//4.reverse() :StringBuilder
		// 기존의 문자열을 역으로 바꿀때
		sb.reverse();
		System.out.println("sb : " + sb); // !!!요세내힘 만금조 들다!녕가ㅎㅎㅎ반
		System.out.println("수용량 : "+ sb.capacity()); //42 
		System.out.println("문자열의 길이 : "+ sb.length()); // 21
		System.out.println("주소값 : "+System.identityHashCode(sb)); //1562557367 주소값 변경안됨 
		System.out.println("======================");
		
		//메소드체이닝 == 메소드 연이어서 호출 
		sb
		.append("ㅋㅋㅋ")
		.delete(0,4)
		.reverse()
		.insert(2,"ㄱㄱㄱ");
		
		System.out.println("sb : " + sb); // ㅋㅋㄱㄱㄱㅋ반ㅎㅎㅎ가녕!다들 조금만 힘내세
		System.out.println("수용량 : "+ sb.capacity()); //42 
		System.out.println("문자열의 길이 : "+ sb.length()); // 23
		System.out.println("주소값 : "+System.identityHashCode(sb)); //1562557367 주소값 변경안됨 
		System.out.println("======================");
		
	}

'JAVA' 카테고리의 다른 글

10. API _ StringTokenizer  (0) 2022.11.04
10.API_String 메소드  (0) 2022.11.04
10. API _String  (0) 2022.11.04
10. API _ Math  (0) 2022.11.04
9_3. 다형성 _ 인터페이스  (0) 2022.11.03
복사했습니다!