모르지 않다는 것은 아는것과 다르다.

Java

String,StringBuilder,StringBuffer

채마스 2022. 2. 26. 00:15

String 클래스

  • String 클래스는 아래와 같이 2가지 방법으로 선언할 수 있다.
    String str1 = new String("abc");
    String str2 = "abc";
  • new 로 생성하는 경우 힙 메모리에 생성되고, "" 로 생성하는 경우 상수 풀(constant pool)에 생성된다.
  • 힙 메모리는 생성될때마다 다른 주소 값을 가지지만, 상수 풀의 문자열은 모두 같은 주소 값을 가짐
public class StringTest {

    public static void main(String[] args) {
        String str1 = new String("abc");
        String str2 = new String("abc");

        System.out.println(str1 == str2); //false

        String str3 = "abc";
        String str4 = "abc";

        System.out.println(str3 == str4); //true
    }
}
  • 한번 생성된 String은 불변(immutable)이다.
  • String을 concat메소드를 사용해서 연결하면 기존의 String에 연결되는 것이 아닌 새로운 문자열이 생성된다. -> 메모리 낭비가 발생할 수 있다.
public class StringTest2 {

    public static void main(String[] args) {
        String java = new String("java");
        String android = new String("android");
        System.out.println(System.identityHashCode(java));

        java = java.concat(android);

        System.out.println(java);
        System.out.println(System.identityHashCode(java));

    }
}
  • 위의 결과처럼 concat 으로 새로 생성된 문자열은 새로운 문자열이 hash code 가 다른것을 확인 할 수 있다.
  • 위와 같은 경우가 반복되면 메모리 낭비가 발생할 수 있고, StringBuilder, StringBuffer 를 사용해서 이를 해결할 수 있다.





StringBuilder, StringBuffer 활용하기

  • 내부적으로 가변적인 char[]를 멤버 변수로 가진다.
  • 문자열을 여러번 연결하거나 변경할 때 사용하면 유용하다.
  • 새로운 인스턴스를 생성하지 않고 char[] 를 변경한다.
  • StringBuffer는 멀티 쓰레드 프로그래밍에서 동기화(synchronization)을 보장한다.
  • 단인 쓰레드 프로그램에서는 StringBuilder 사용을 권장한다.
  • toString() 메소드로 String 반환한다.
  • 코드 예시
public class StringBuilderTest {

    public static void main(String[] args) {
        String java = new String("java");
        String android = new String("android");

        StringBuilder buffer = new StringBuilder(java);
        System.out.println(System.identityHashCode(buffer));
        buffer.append("android");
        System.out.println(System.identityHashCode(buffer));

        java = buffer.toString();
    }
}
  • 위의 경우 hash code 가 같은 것을 확인할 수 있다.
  • 반환할 때는 toString 을 이용해서 반환해서 문자열로 사용한다.





text block 사용하기 (java 13)

  • 문자열을 """ """ 사이에 이어서 만들 수 있다.
  • html, json 문자열을 만드는데 유용하게 사용할 수 있다.
  • 코드 예시
public class StringTextBlock {

    public static void main(String[] args) {

        String strBlock = """
                This 
                is 
                text
                block
                test.""";
        System.out.println(strBlock);

        System.out.println(getBlockOfHtml());

    }

    public static String getBlockOfHtml() {
            return """
                    <html>

                        <body>
                            <span>example text</span>
                        </body>
                    </html>""";

    }
}
  • 위의 결과는 """ ~ """ 내부에 작성한 문자열이 그대로 출력되는 것을 확인할 수 있다.

'Java' 카테고리의 다른 글

내부 클래스  (0) 2022.02.26
Thread  (0) 2022.02.26
Stream  (0) 2022.02.26
Static 변수와 Static 메서드  (0) 2022.02.26
Optional  (0) 2022.02.26