#009. StringBuilder 객체 알아보기...
1. StringBuilder 의 객체를 알아보자.
테스트를 위해 oop 패키지에 StringBuilderDemo Class를 만들고 아래와 같이 작성해본다.
코드 | package oop; public class StringBuilderDemo { public static void main(String[] args) { StringBuilder sb = new StringBuilder(); sb.append("Hi"); sb.append(", "); sb.append("Dong Hyuk"); System.out.println("SB: " + sb+", Code: "+sb.hashCode()); sb.deleteCharAt(8); System.out.println("SB: " + sb+", Code: "+sb.hashCode()); sb.insert(8, '-'); System.out.println("SB: " + sb+", Code: "+sb.hashCode()); sb.delete(0, 4); System.out.println("SB: " + sb+", Code: "+sb.hashCode()); } } |
결과 | SB: Hi, Dong Hyuk, Code: 1807500377 SB: Hi, DongHyuk, Code: 1807500377 SB: Hi, Dong-Hyuk, Code: 1807500377 SB: Dong-Hyuk, Code: 1807500377 |
설명 | 문장4: StringBuilder 클래스의 sb라는 객체로 생성하고 있다. 문장5,6,7: sb 객체에 값을 추가해주고 있다. 문장9: sb 객체에 8번째 자리의 문자를 삭제하고 있다. 문장11: sb 객체에 8번째 자리에 - 문자를 삽입하고 있다. 문장13: sb 객체에 0~4까지 자리에 문자를 삭제하고 있다. 문장8,10,12,14: 결과를 출력하며, 참조 값이 변경되지 않는 것을 확인 할 수 있다. 이 예제를 보면 값이 변경되더라도, 객체가 새로 생성되지 않는 다는 뜻이다. |
2. 위 내용을 보고 JVM이 메모리에 어떻게 할당하는지 확인해 보자.
명령어 | 클래스 영역 [static 영역] | 메서드 영역(변수) [stack 영역] (heap영역 참조) | 객체 영역 [heap 영역] (실제데이터공간) |
StringBuilder sb = new StringBuilder(); sb.append("Hi"); sb.append(", "); sb.append("Dong Hyuk"); sb.deleteCharAt(8); sb.insert(8, '-'); sb.delete(0, 4); |
Java.lang .StringBuilder |
sb = 1807500377 |
Stringbuilder(1807500377)(sb) |
* 설명: 위의 sb = 1807500377 참조 값이 메모리의 실제 주소는 아니다. 오른쪽의 heap 영역의 (sb)는 객체가 실제 존재하는 위치다. StringBuilder 의 어떤 메서드를 사용해도 참조 값은 변하지 않는다. * 이유: StringBuilder은 char[] 의 배열을 최초 17개(갯수는 System 성능에 따라 다른 듯)를 만든다, 그보다 더 많이 들어오면 17개를 더 늘려서 34개로, 51개로.... 늘리다가, delete 메서드 등에 의해 내용이 5자로 줄어들면 자동으로 17개의 배열로 줄이게 된다. |
3. 이전 강좌 String 과 위 글의 StringBuilder 가 다르다는 것은 확인 했을 것이다. 그렇다면, 상황에 따라서 String, StringBuilder 중 어느 것을 사용해야 성능을 발휘할 수 있는지 아래에서 찾아보자. 테스트를 위해 위에서 만든 클래스의 내용을 지우고, 아래와 같이 작성해본다.
코드 | package oop; public class StringBuilderDemo { public static void main(String[] args) { long startTime, curTime;
String s = new String(); startTime = System.currentTimeMillis(); for(int i=0;i<100000;i++) { s+="A"; } curTime=(System.currentTimeMillis()-startTime); System.out.println("S : "+curTime+" 밀리초");
StringBuilder sb = new StringBuilder(); startTime = System.currentTimeMillis(); for(int i=0;i<100000;i++) { sb.append("A"); } curTime=(System.currentTimeMillis()-startTime); System.out.println("SB: "+curTime+" 밀리초"); } } |
결과 | S : 9018 밀리초 SB: 5 밀리초 |
설명 | 위 예제는 String 와 StringBuilder 의 객체에 담은 내용은 같다. 처리시간을 확인 해봤다. 결과는 예상했던 대로 String 으로 만든 객체가 9초가 걸렸고, StringBuilder 로 만든 객체가 0.005초 걸렸다. 위 상황을 볼 때, 문자열이 계속 변경이 된다면, String 객체보다는 StringBuilder 로 만들어서 사용하는 것이 메모리와 성능에 좋은 영향을 끼칠 것이다. |
다음시간엔 wrapper class(래퍼클래스)에 대해서 알아보자.
잡담. 오늘도 12:40분까지 강좌를 쓰고 있습니다. 읽어주셔서 감사합니다.
'Developer > Java-oop' 카테고리의 다른 글
#011. Array (배열) 알아보기... (1) | 2011.03.29 |
---|---|
#010. Wrapper Class 알아보기... (1) | 2011.03.29 |
#008. String 객체 알아보기... (0) | 2011.03.22 |
#007. this 알아보기... (0) | 2011.03.21 |
#006. 생성자(Constructor) 와 생성자오버로딩(Constructor Overloding) 알아보기... (0) | 2011.03.21 |