티스토리 뷰

20일차인 오늘은 StringBuffer, Vector, ArrayList, StringTokenizerTest에 대해서 학습했다.

 

String 클래스 객체는 Heap 메모리 영역(가비지 컬렉션이 동작하는 영역)에 생성하고 한번 생성된 객체의 내부 내용을 변화시킬 수 없다.

String 객체는 이러한 이유로 문자열 연산이 많은 경우 성능이 좋지 않다.

 

String객체사용

StringBuffer와 StringBuilder는 String과 다르게 동작한다. 문자열 연산 등으로 기존 객체의 공간이 부족하게 되는 경우 기존의 버퍼 크기를 늘리며 유연하게 동작한다. StringBuffer와 StringBuilder 클래스가 제공하는 메서드는 서로 동일하다.

 

StringBuffer 객체 사용

 

 

  • String
    • 짧은 문자열을 더할 경우
    • 문자열 연산이 적고 멀티스레드 환경일 경우
  • StringBuffer
    • 스레드에 안전한 프로그램이 필요할 때나, 개발 중인 시스템의 부분이 스레드에 안전한지 모를 경우
    • 문자열 연산이 많고 멀티스레드 환경일 경우

출처 : https://dejavuhyo.github.io/posts/string-stringbuffer-stringbuilder/

 

String, StringBuffer, StringBuilder 차이 및 장단점

1. 개념 Java에서 문자열을 다루는 대표적인 클래스로 String, StringBuffer, StringBuilder가 있다.

dejavuhyo.github.io

 

public class StringBuffer_1 {
	public static void main(String[] args) {
				
		StringBuffer stbf_1 = new StringBuffer("Java");
		StringBuffer stbf_2 = new StringBuffer(10);
		StringBuffer stbf_3 = new StringBuffer();
		
		System.out.println("stbf_1.length() : " + stbf_1.length()); // 4
		System.out.println("stbf_1.capacity() : " + stbf_1.capacity()); // 20
		
		System.out.println();
		System.out.println("stbf_2.length() : " + stbf_2.length()); // 0
		System.out.println("stbf_2.capacity() : " + stbf_2.capacity()); // 10
		// capacity() 현재 문자열의 버퍼 크기
		
		System.out.println();
		System.out.println("stbf_3.length() : " + stbf_3.length()); // 0
		System.out.println("stbf_3.capacity() : " + stbf_3.capacity()); // 16

	}
}

 

StringBuffer 객체의 capacity 값의 기본값은 무조건 16값으로 고정된다.

length()의 값이 늘어날수록 capacity의 값도 1씩 증가한다.

 

public class StringBuffer_2 {
	public static void main(String[] args) {
		
		// StringBuffer 속에 존재하는 메소드 append, insert, setLength, reverse . . . 
		
		StringBuffer stbf = new StringBuffer("Java");
		
		stbf.append(" Program"); // Java Program
		
		System.out.println(stbf); // Java Program
		
		for(int i = 0;i < stbf.length(); i++) {
			
			System.out.print(stbf.charAt(i) + "\t");  // Java Program
		}
		
		System.out.println();
		
		for(int i = stbf.length()-1;i >= 0; i--) {
			
			System.out.print(stbf.charAt(i) + "\t"); // margorP avaJ
		}
		
		stbf.insert(4, "*"); // Java* Program
		
		System.out.println("\n" + stbf);
		
		System.out.println("문자열의 길이 : " + stbf.length()); // 13
		
		stbf.setLength(5);
		
		System.out.println("새로운 문자열의 길이 : " + stbf.length()); // 5
		
		System.out.println("setLength(5) 적용 문자열 : " + stbf); // java*
		
		System.out.println("반전 문자열 : " + stbf.reverse()); //*avaj

	}
}

StringBuffer 객체 속에 존재하는 append(), insert(), setlength(), reverse() 메서드에 대해 학습했다.

 

public class StringBuffer_3 {
	public static void main(String[] args) {
		
		// String의 연산보다 StringBuffer가 훨씬 더 빠르다는것.
		
		long start, end;
		
		String str_1 = new String("1 ~ 1000 의 합 11 : ");
		StringBuffer stbf_2 = new StringBuffer("1 ~ 1000의 합 22 : ");
		
		start = System.currentTimeMillis();
		
		for(int i = 0; i < 70000; i++) {
			str_1 += i;
			str_1 += "+";
		}		
		
		end = System.currentTimeMillis();
		
		System.out.println("String Time : " + (end - start));
		
		start = System.currentTimeMillis();
		
		for(int i = 0; i < 70000; i++) {
			stbf_2.append(i);
			stbf_2.append("+");
		}
		
		end = System.currentTimeMillis();
		
		System.out.println("StringBuffer Time : " + (end - start));
		
	}
}

String 객체보다 StringBuffer 객체의 연산의 속도가 훨씬 빠르다는 것은 이론적으로 알겠는데, 실제적으로 체감해보기 위해서 코드를 작성했다. System.currentTimeMillis() 메소드를 사용하여 start 값과 end 값을 입력받은 뒤 반복문으로 둘러쌓인 연산을 진행하면서 소요되는 시간을 측정했다. 결과는 StringBuffer 객체의 압승이였다.

 


Vector vv = new Vector(5);

vv.add("1");

vv.add("2");

vv.add("3");

 

vv.trimToSize(); 

capacity와 size를 동일시 하게 만들어주는 메소드라고 생각했지만, 그 본질을 따져보면, capacity와 Size가 동일한 새로운 인스턴스를 생성해서 원소의 내용을 복사하는 것이라고 한다.

 

 

vv.ensureCapacity(6)

size가 6보다 크면 작동하지 않지만, 6보다 작을 경우 크기가 6인 새로운 인스턴스를 생성하고, 원소를 복제한다. 남는 공간에는 null값이 배정된다.

 

* size가 capacity보다 커질경우 capacity가 2배 증가하는 모습을 보인다.

 

출처 : https://keepmind.net/java-collection-framework-1/

 

[Java] Collection Framework 1 | KEEPMIND

이번 포스트부터 시작해서 앞으로 4개 정도의 포스트에서는 Collection Framework에 대해 다룰 예정입니다. Collection Framework는 Java의 자료구조라고 생각하시면 됩니다. 정확히는 다수의 데이터를 처리

keepmind.net

 

 

 

댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
링크