스트링 클래스의 문제점

말하는 감자·2024년 12월 20일
0

자바 중급

목록 보기
4/21
post-thumbnail

문제점

  • String 클래스는 문자열을 다룰 때 사용하는 클래스
  • String 클래스는 불변 클래스이다

Code

public class StringExam {
    public static void main(String[] args) {
        String str1="hello world";
        String str2= str1.substring(5); //5번부터~
        System.out.println(str1);
        System.out.println(str2);

        String str3=str1+str2;
        System.out.println(str3);

        String str4=new StringBuffer().append(str1).append(str2).toString();
        System.out.println(str4);

        //메모리 할당과 해제가 반복적으로 발생하여 성능저하
        String str5="";
        for(int i=0;i<10;i++){
            str5=str5+"*";
        }
        System.out.println(str5);
        //해결
        StringBuffer sb=new StringBuffer();
        for(int i=0;i<10;i++){
            sb.append("*");
        }
        System.out.println(sb.toString());
    }
}
  • String 객체의 불변성으로 인하여 반복문을 실행할 때 마다 새로운 String 객체가 생성됨
  • 계속해서 새로운 문자열이 생성되므로 메모리 할당과 해제가 반복적으로 발생 -> 성능 저하
  • 해결: StringBuilder 클래스나 StringBuffer 를 사용하여 해결 가능

Code 실습

public class StringBufferPerformanceTest{
    public static void main(String[] args){
        // (1) String의 +연산을 이용해서 10,000개의 *를 이어붙입니다.
        //시작시간을 기록합니다.(millisecond단위)
        long startTime1 = System.currentTimeMillis();
        String str="";
        for(int i=0;i<10000;i++){
            str=str+"*";
        }
        //종료시간을 기록합니다.(millisecond단위)
        long endTime1 = System.currentTimeMillis();
        
        // (2) StringBuffer를 이용해서 10,000개의 *를 이어붙입니다.
        //시작시간을 기록합니다.(millisecond단위)                
        long startTime2 = System.currentTimeMillis();
        StringBuffer sb = new StringBuffer();
        for(int i=0;i<10000;i++){
            sb.append("*");
        }
        //종료시간을 기록합니다.(millisecond단위)
        long endTime2 = System.currentTimeMillis();
        
        // 방법(1)과 방법(2)가 걸린 시간을 비교합니다.
        long duration1 = endTime1-startTime1;
        long duration2 = endTime2-startTime2;
        
        System.out.println("String의 +연산을 이용한 경우 : "+ duration1);
        System.out.println("StringBuffer의 append()을 이용한 경우 : "+ duration2);
    }
}

결과

  • 시간 복잡도(성능)에서 StringBuffer가 String보다 훨씬 유리함
profile
주니어개발자(?)

0개의 댓글