UpDown Dev Story
자바(Java) String, StringBurffer, StirngBuilder 에 대해서 알아보자 본문
String이란?
- 특징
- 불변(immutable)
- thread safe 하지 않다
- String은 참조형 변수 이기 때문에 선언할때마다 새로운 객체를 생성하고 그 객체를 바라보는 주소값을 가지게 된다
String변수를 선언하는 방법에는 두 가지 방법이 있다
public class StringStudy {
public static void main(String[] args) {
String literalString1 = "비교값";
String literalString2 = "비교값";
String objectString = new String("비교값");
System.out.println(literalString1);
System.out.println(literalString2);
System.out.println(objectString);
}
}
출력 값을 확인해보면 같은 값이 나오는것을 확인할수있다 그러면 3개 의 값이 모두 같은 값을 출력 됐으니 모두 같은 변수이구나 라고 생각할수 있다
3가지 값을 == , .equals() 를 사용하여 비교해보자
public class StringStudy {
public static void main(String[] args) {
String literalString1 = "비교값";
String literalString2 = "비교값";
String objectString = new String("비교값");
System.out.println(literalString1);
System.out.println(literalString2);
System.out.println(objectString);
System.out.println(literalString1==literalString2);
System.out.println(literalString1.equals(literalString2));
System.out.println(literalString1 == objectString);
System.out.println(literalString1.equals(objectString));
System.out.println(literalString2 == objectString);
System.out.println(literalString2.equals(objectString));
}
}
!? 이상하다 분명히 같은 값으로 출력되었는데 중간에 false는 왜 나오는걸까?
== , equals() 비교
- ==
- String은 불변 참조형 변수이기 때문에 System.out.println(literalString1 == literalString2); 값은 false 이겠지?
라고 생각할수 있다 그러나 true가 출력된것을 확인할수 있다 - == 가 true를 출력한 이유는 String 객체를 literal로 생성하면 해당 String 값은 Heap 영역 내 "String Constant Pool"에 저장되어 재사용되기 때문에 같은 주소값을 가진다
- 이해를 돕기 위한 그림
- String은 불변 참조형 변수이기 때문에 System.out.println(literalString1 == literalString2); 값은 false 이겠지?
- equals
- 그럼 위에서 공부한 내용으로는 System.out.println(literalString1 == objectString); 값은 true이겠지?
라고 생각할 수 있다 그러나 false가 출력된 것을 확인할 수 있다 (String Constant Pool 은 String 객체를 literal로 생성했을 때만 사용한다고 했는데....) - 그 이유는 Object class에 equals 메서드를 오버라이딩 한 String class의 equals 메서드를 확인해보면 된다
아래 코드를 보면 현재 자신의 인스턴스 값(this)과 equals 메소드에서 파라미터로 받은 객체가 같으면 true 를 리턴하고
파라미터로 넘어온 객체의 타입이 String이면 길이를 비교하고, 값을 비교하고, 해시코드를 비교한다.
- 그럼 위에서 공부한 내용으로는 System.out.println(literalString1 == objectString); 값은 true이겠지?
StringBurffer란?
- 특징
- 가변(mutable)
- StringBurffer 객체를 생성해서 heap메모리에 올라가게 되면 그 객체에 접근해서 값을 수정하는게 가능하다
- thread safe 하다 ( 이러한 이유로 StringBuilder 보다 성능이 떨어진다 )
- StringBuffer 클래스는 내부적으로 버퍼(buffer)라고 하는 독립적인 공간을 가집니다. 하지만 인스턴스 생성 시 사용자가 설정한 크기보다 언제나 16개의 문자를 더 저장할 수 있도록 여유 있는 크기로 생성됩니다.버퍼 크기의 기본값은 16개의 문자를 저장할 수 있는 크기이며, 생성자를 통해 그 크기를 별도로 설정할 수도 있습니다.
- 가변(mutable)
StringBuilder란?
- 특징
- 가변(mutable)
- StringBurffer 객체를 생성해서 heap메모리에 올라가게 되면 그 객체에 접근해서 값을 수정하는게 가능하다
- thread safe 하지 않다 ( 이러한 이유로 StringBuffer 보다 성능이 더 좋다 )
- StringBuilder 클래스는 내부적으로 버퍼(buffer)라고 하는 독립적인 공간을 가집니다. 하지만 인스턴스 생성 시 사용자가 설정한 크기보다 언제나 16개의 문자를 더 저장할 수 있도록 여유 있는 크기로 생성됩니다. 버퍼 크기의 기본값은 16개의 문자를 저장할 수 있는 크기이며, 생성자를 통해 그 크기를 별도로 설정할 수도 있습니다.
- 가변(mutable)
이상으로 String, StringBuffer, StringBuilder에 대해 알아봤습니다
'Java' 카테고리의 다른 글
자바(Java) 인터페이스(Interface) 와 추상클래스(abstract class)에 대해 알아보자 (0) | 2021.07.13 |
---|---|
자바(Java) 오브젝트(Object) 클래스(Class)에 대해 알아보자 (0) | 2021.07.11 |
자바(Java) 직렬화(Serializable) 대해 알아보자 (0) | 2021.07.10 |
자바(Java) 컬렉션(Collection)에 대해 알아보자 (0) | 2021.07.09 |
자바(Java) 스레드(Thread) 에 대해 알아보자 (0) | 2021.07.08 |
Comments