Notice
Recent Posts
Recent Comments
Link
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
Archives
Today
Total
관리 메뉴

UpDown Dev Story

자바(Java) String, StringBurffer, StirngBuilder 에 대해서 알아보자 본문

Java

자바(Java) String, StringBurffer, StirngBuilder 에 대해서 알아보자

updown 2021. 7. 11. 12:20

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);
	}
}

필자에 IDE에서 캡쳐

출력 값을 확인해보면 같은 값이 나오는것을 확인할수있다 그러면 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));
	}
}

필자의 IDE에서 캡쳐

!? 이상하다 분명히 같은 값으로 출력되었는데 중간에 false는 왜 나오는걸까?

== , equals() 비교

  • ==
    • String은 불변 참조형 변수이기 때문에 System.out.println(literalString1 == literalString2); 값은 false 이겠지?
      라고 생각할수 있다 그러나 true가 출력된것을 확인할수 있다
    • == 가 true를 출력한 이유는 String 객체를 literal로 생성하면 해당 String 값은 Heap 영역 내 "String Constant Pool"에 저장되어 재사용되기 때문에 같은 주소값을 가진다
    • 이해를 돕기 위한 그림
    • 출처: https://ifuwanna.tistory.com/3
  • equals 
    • 그럼 위에서 공부한 내용으로는 System.out.println(literalString1 == objectString); 값은 true이겠지?
      라고 생각할 수 있다 그러나 false가 출력된 것을 확인할 수 있다 (String Constant Pool 은 String 객체를 literal로 생성했을 때만 사용한다고 했는데....)
    • 그 이유는 Object class에 equals 메서드를 오버라이딩 한 String class의 equals 메서드를 확인해보면 된다
      아래 코드를 보면 현재 자신의 인스턴스 값(this)과 equals 메소드에서 파라미터로 받은 객체가 같으면 true 를 리턴하고
      파라미터로 넘어온 객체의 타입이 String이면 길이를 비교하고, 값을 비교하고, 해시코드를 비교한다.
    • 필자의 IDE에서 캡쳐

StringBurffer란?

  • 특징
    • 가변(mutable)
      • StringBurffer 객체를 생성해서 heap메모리에 올라가게 되면 그 객체에 접근해서 값을 수정하는게 가능하다
    • thread safe 하다 ( 이러한 이유로 StringBuilder 보다 성능이 떨어진다 )
      •  
    • StringBuffer 클래스는 내부적으로 버퍼(buffer)라고 하는 독립적인 공간을 가집니다. 하지만 인스턴스 생성 시 사용자가 설정한 크기보다 언제나 16개의 문자를 더 저장할 수 있도록 여유 있는 크기로 생성됩니다.버퍼 크기의 기본값은 16개의 문자를 저장할 수 있는 크기이며, 생성자를 통해 그 크기를 별도로 설정할 수도 있습니다.

StringBuilder란?

  • 특징
      • 가변(mutable)
        • StringBurffer 객체를 생성해서 heap메모리에 올라가게 되면 그 객체에 접근해서 값을 수정하는게 가능하다
      • thread safe 하지 않다 ( 이러한 이유로 StringBuffer 보다 성능이 더 좋다 )
        •  
      • StringBuilder 클래스는 내부적으로 버퍼(buffer)라고 하는 독립적인 공간을 가집니다. 하지만 인스턴스 생성 시 사용자가 설정한 크기보다 언제나 16개의 문자를 더 저장할 수 있도록 여유 있는 크기로 생성됩니다. 버퍼 크기의 기본값은 16개의 문자를 저장할 수 있는 크기이며, 생성자를 통해 그 크기를 별도로 설정할 수도 있습니다.

이상으로 String, StringBuffer, StringBuilder에 대해 알아봤습니다

Comments