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 를 사용하는 것이 좋겠다.
끝~
댓글 없음:
댓글 쓰기