본문 바로가기

Developer/Java-oop

#009. StringBuilder 객체 알아보기...

#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분까지 강좌를 쓰고 있습니다. 읽어주셔서 감사합니다.