2013년 9월 10일 화요일

[Team L.A.D] 재학생 Study01 - Java 에서 String , StringBuffer , StringBuilder 어떻게 활용해야 할까?

1. String을 어떻게 하자는 말인가.

   1-1. String 과 new String 은 어떻게 다른가.

         - Java 를 기준으로 설명 하겠다.

         - 질문 

            1) String a = "abc";
                String b = "abc";

                System.out.println(a==b); //출력값은 true or false?

             2) String a = "abc";
                 String b = new String("abc");

                  System.out.println(a==b); //출력값은 true or false?

                  System.out.println(a.equals(b)); // 출력값은 true or false?

          - 정답은 1번은 true , 2번 문제의 답은 false , true 입니다.

 
          - '==' 은 해당 변수의 Value와 주소값을 함께 비교합니다. 즉, 주소값과
              Value값이 모두 동일해야만 같다라고 인정합니다.

          - 'equals(...)' 는 해당 변수의 Value만을 비교합니다.

          - String을 new String()으로 선언하는 경우에 새로운 인스턴스 주소 값을

             갖게 됩니다. 따라서 Value값이 같다고 해도 주소값이 다르기 때문에

             '==' 으로는 비교해서는 true를 반환 할 수 없습니다.

           - 즉 String으로 변수값만 선언하는 것은 같은 주소 값에서 , Stack으로만

              쌓이는 형태이고 , new String() 으로 선언하는것은 자바 메모리에 다른 주소를

              할당하게 된다.

            - 즉 특별히 , 인코딩 및 세부적인 작업을 해주지 않을 것이라면 String 을 

               새로 생성자를 만들지는 않는게 좋다.

     1-2. 왠만하면 String 을 쓰지 않는게 좋다.정말?

            - 자 여기서 언제 String을 쓰지 말라는 걸까?

            - 설마 선언할 때? 문자열 표현할때? 그런게 아니다.

            - String 은 불변객체 이다 . 즉 한번 생성자로 정의를 내리면 변하지 않는다.

            - 따라서 정한 Value 값이 변할일이 거의 없고 그 값 그대로 쓰인다면

              ( Ex) Label 의 이름 , 단일 String 의 가벼운 Update) String 을 쓰는게 좋다.


       1-3. 그럼 언제 쓰지 말라는건가?      
           
             - String 을 쓸때 이렇게 쓰는 경우가 종종 있다.

             - String a ="a";
                a += "b";

             - 이렇게 for문으로 돌아서 들어간다거나 , 가장 큰 예로 웹 프로그래밍을 할 시

                Query 로 작성할때 String 으로 처리한다.

              - 이럴 경우가 String 을 쓰면 안대는 경우다.

              - 즉 지속적으로 String 문자열이 추가될 경우에 쓰면 안댄다.

              - 이유를 판단해보자. 

              - String class 에 새로운 String 을 추가하게 되면

              - 기존의 String이 아닌 새로운 String 이 생성된다. 즉 주소값이 바뀌면서
                 값이 바뀌게 되고 , 기존의 String 은 GC 대상이 된다.

              - 즉 , 메모리 사용량과 응답 시간이 급속히 증가하게 된다.

        1-4. 이러한 부분들을 해결해 주기 위해 나온 StringBuilder , StringBuffer

              - Java 는 String , StringBuffer , StringBuilder 라는 3가지 문자열을 처리하는

                클래스를 제공합니다. 

              - StringBuffer 와 StringBuilder 에서 제공되는 메소드와 형태는 동일합니다.

              - 다만 차이점은 StringBuilder 는 ThreadSafe 하지 않습니다. 즉 여러 Thread

                 에서 단일 객체를 실행할 경우 문제가 발생합니다. 

              - 그래서 되도록 Java 에서 처리할때는 StringBuffer 로 처리하는 것을 추천한다.

             ※ 예제소스는 별도 첨부 합니다.

              - 예제 소스 String 으로 처리시 used Time  : 1934 ms

              - 예제 소스 String 으로 처리시 메모리 사용량 : 48,290 KB
 
              - 예제 소스 StringBuffer 처리시 used Time  : 25 ms
             
              - 예제 소스 StringBuffer 처리시 메모리 사용량 : 3,576 KB

              - 예제 소스 StringBuilder 처리시 used Time  : 22 ms
  
              - 예제 소스 StringBuilder 처리시 메모리 사용량 : 3,576 KB

            1-5. 그러나 Java 는 대안을 내놓았다.

                - JDK 1.5 이상일 경우 컴파일 시 StringBuilder로 자동 변환 시켜줍니다.

                - 허나 메모리를 많이 사용한다는 부분은 변동이 없습니다. 

                - 따라서 믿지 말고 원칙대로 사용하자
              
     
결론  및 요약          

String 은 문자열 Data 의 Update 또는 가벼운 추가 정도로 사용한다.

StringBuffer 는 Thread의 안전과 활용이 중요하거나, 현재 Thread 안전성을 정확히

판단하기 어려울 때 사용한다.

StringBuilder 는 그다지 안전성이 중요하지 않고 , 간편한 프로그램에서 사용한다.

StringBuffer 와 StringBuilder 는 비슷하니 되도록 StringBuffer 를 사용하는 것이 좋겠다.


끝~




댓글 없음:

댓글 쓰기