뮤터블 객체는 생성 후 그 상태를 변경 할 수 있는 반면 이뮤터블 객체는 생성 후 그 상태를 변경 할 수 없는 객체를 말한다. 

자바에서는 String 객체는 값을 변경 할 수 없는 이뮤터블 객체이다. 

String string = "Hello"; //1번
System.out.println(System.identityHashCode(str1)); // 140799417 해쉬코드 식별 값을 반환
string  += "World"; //2번 
System.out.println(System.identityHashCode(str1)); // 926370398

 

위에서 실행 한 2번째 코드는 다음과 같은  실행 과정을 거친다. 

1. 새로운 String 객체 string 객체를 생성한다.

2. string 에 "Hello" 값을 하나씩 복사한다.

3. "Hello" 뒤에 "World" 값을 저장한다. 

 

이렇게 하나하나 짚어가며 찾는 방식은 시간 복잡도가 O(N)이 된다.   

 

StringBuilder클래스는 뮤터블 하므로 문자열 변경 할 때 시간 복잡도 관점에서 훨씬 효율적이다.

 

 

● 테스트 코드

public static void main(String[] args) {

	String string = "Hello";

    System.out.println(System.identityHashCode(string)); // 메소드는 객체를 특정 할 수 있는 식별 값을 반환
    string += "World";
    System.out.println(System.identityHashCode(string));

    System.out.println("------------------시간복잡도 String -------------------");
    long start = System.currentTimeMillis();
    for(int i =1; i <= 100000; i++) {
    string +=i;
}
    long end = System.currentTimeMillis();
    System.out.println(((end - start) / 1000.0) +"초");

    System.out.println("------------------시간복잡도 StringBuilder---------------------");

    long start2 = System.currentTimeMillis();
    StringBuilder stringBuilder = new StringBuilder();
    stringBuilder.append("Hello");
    stringBuilder.append("World");
    for(int i =1; i <= 100000; i ++) {
    stringBuilder.append(i);
}
    long end2 = System.currentTimeMillis();

    System.out.println(((end2 - start2) / 1000.0) +"초");


    long result1 =  end - start;
    long result2 =  end2 - start2;

    System.out.println("------------------StringBuilder의 속도 String에 비해 ---------------------");

    long res = (result1 / result2);
    System.out.println("StringBuider성능 : "+res+"배");
}

 

● 비교수행 결과

String vs StringBuilder 속도비교

 

● 참고서적 : 코딩테스트 합격자되기(자바편)

'Java' 카테고리의 다른 글

JAVA SOLID 개념  (0) 2024.07.17
JAVA 파일 읽기 및 효율적인 I/O 처리 방법  (0) 2024.06.15
Java에서 Json(Object, Array) 다루기  (0) 2024.03.01
Java 개행처리  (0) 2024.02.28
Java JDBC Connection  (0) 2024.02.24

+ Recent posts