시작하기 전 ...
String vs StringBuffer vs StringBulider을 정확히 이해하고 어느시점에 적재적소로 사용할 것인지 다시 한번 정리가 필요하다고 판단하여 포스팅을 하게 되었다!.. 더보기
stirng 빈 값 체크 참고
Goal
- String에 대해서 알아본다
- StringBuffer에 대해서 알아본다
- StringBulider에 대해서 알아본다
String이란?
참조형 데이터 타입으로 실제 사용은 기본 타입 처럼 사용한다.
public final class String implements Serializable, Comparable<String>, CharSequence {
서로 다른 객체를 반환하는 String
public static void main(String [] args){
String a = "rose";
System.out.println(a + " " + System.identityHashCode(a)); //문자열과 메모리 주소 출력
a = a+"2";
a = a+"3";
System.out.println(a + " " + System.identityHashCode(a));
}
결과
rose 589446616
rose23 2109957412
- String은 heap에 실제값 저장 / stack에 주소값 저장과 같이 저장한다.
- 리터럴은 String Constant pool에 위치
- 객체는 heap 영역에 할당
- String은 크기가 고정되어 있기 때문에 내부의 문자열을 수정할 수 없다
- 새로운 문자열이 만들어지면 새로운 객체가 생성되고 기존 객체는 버려지는데 (= GC의 대상) = 자원 낭비
- 문자열 연산이 많아질 때 계속해서 객체를 만드는 오버헤드가 발생하므로 성능이 떨어질 수 밖에 없다
- 하지만 Imutable 속성 때문에, thread-safe하다
- 연산이 적고 문자열을 읽을 일이 많은 경우에는 String클래스의 사용이 더 적절하다.
- +로 문자열을 더하는 연산을 한다.
절대 사용하면 안되는 메소드 intern()
new String(String)으로 생성한 문자열 객체라고 할지라도, String Constant pool에 해당 값이 있으면 그 값을 참조하는 객체를 리턴한다(= 동일한 주소값을 리턴). 만약 동일한 문자열이 존재하지 않으면 풀에 해당 값을 추가한다.
- 따라서, intern() 메소드를 수행 뒤에 문자열은 equals()가 아닌 ==으로 동일한지 비교가 가능해진다
- 새로운 문자열을 계속 만드는 프로그램에서 intern() 메소드를 이용하여 억지로 문자열 풀에 값을 할당하도록 하면, 저장되는 영역은 한계가 있어 그 영역에 대해 별도로 메로리를 청소하는 단계를 거친다.
- 즉, 작은 연산 하나를 빠르게 하기 위해 전체 자바 시스템에 악영향을 주게 된다.
StringBuffer란?
public final class StringBuffer extends AbstractStringBuilder implements Serializable, Comparable<StringBuffer>, CharSequence {
- mutable 가변적
- 문자열 연산 등으로 기존 객체의 공간이 부족하게 되는 경우 기존의 버퍼 크기를 늘리며 유연하게 동작한다.
- .append() .delete() 등의 API를 이용하여 동일 객체내에서 문자열을 변경하는 것이 가능
- 초기 buffer의 크기 설정, 버퍼 크기 줄이고 늘리며 객체 생성 속도가 느리다.
- synchronized를 지원하여 thread-safe
- 문자열이 많고 멀티스레드 환경에서 사용
서로 같은 객체를 반환하는 StringBuffer
public static void main(String [] args){
StringBuffer b = new StringBuffer("rose");
System.out.println(b + " " + System.identityHashCode(b)); //문자열과 메모리 주소 출력
b.append("2");
b.append("3"); //문자열 추가
System.out.println(b + " " + System.identityHashCode(b));
}
결과
rose 901506536
rose23 901506536
StringBulider란?
StringBuilder클래스는 문자열을 변경하거나 이어붙이는 경우 추가 메모리 생성 없이 기존 문자열이 확장되는 클래스
public final class StringBuilder extends AbstractStringBuilder implements Serializable, Comparable<StringBuilder>, CharSequence {
- mutable 가변적
- 문자열 연산 등으로 기존 객체의 공간이 부족하게 되는 경우 기존의 버퍼 크기를 늘리며 유연하게 동작한다.
- .append() .delete() 등의 API를 이용하여 동일 객체내에서 문자열을 변경하는 것이 가능
- 초기 buffer의 크기 설정, 버퍼 크기 줄이고 늘리며 객체 생성 속도가 느리다.
- thread-unsafe
- 문자열이 많고 단일 쓰레드 환경에서 사용
서로 같은 객체를 반환하는 StringBuilder
public static void main(String [] args){
StringBuilder c = new StringBuilder("rose");
System.out.println(c + " " + System.identityHashCode(c)); //문자열과 메모리 주소 출력
c.append("2");
c.append("3"); //문자열 추가
System.out.println(c + " " + System.identityHashCode(c));
}
결과
rose 747464370
rose23 747464370
StringBuffer, StringBuilder
String vs StringBuffer vs StringBulider
String | StringBuffer | StringBulider |
immutable | mutable | |
+ | append() | |
문자열을 더하면 새로운 string 객체가 생성되고 기존 객체는 버려진다 |
문자열을 더하더라도 새로운 객체를 생성하지 않는다 | |
thread-safe | 동기화(synchronized)를 지원하여 thread-safe |
thread-unsafe |
Serializable, CharSequence 인터페이스 구현 |
자바의 신 by 이상민
https://velog.io/@0sunset0/StringStringBuilderStringBuffer-%EC%B0%A8%EC%9D%B4-thread-safe%EB%9E%80-String%EC%9D%B4-%EB%B6%88%EB%B3%80%EA%B0%9D%EC%B2%B4%EC%9D%B8-%EC%9D%B4%EC%9C%A0
https://da-nyee.github.io/posts/java-string-vs-stringbuffer-vs-stringbuilder/
https://madplay.github.io/post/difference-between-string-stringbuilder-and-stringbuffer-in-java
'JAVA > about java' 카테고리의 다른 글
[java] equals(), hashcode(), toString() 재정의를 왜 하는가 (0) | 2023.08.24 |
---|---|
[java] java.lang, java.util 패키지와 Object 클래스 (0) | 2023.08.24 |
[type] 자료형, 기본 자료형 (Primitive type) vs 참조 자료형(Reference type) (0) | 2023.08.21 |
[variables] 지역변수, 클래스변수, 인스턴스 변수 (0) | 2023.08.20 |
[Polymorphism] 다형성과 오버라이딩(overriding) vs 오버로딩(overloading) (0) | 2023.08.18 |