String 클래스

  • String 선언하기
  • 힙 메모리는 생성될때마다 다른 주소값을 가지지만, 상수 풀의 문자열은 모두 같은 주소 값을 가짐
// 힙 메모리에 생성
String str1 = new STring("abc");
// 상수풀에 있는 주소를 참조
String str2 = "abc";
public class StringTest {
	public static void main(String[] args) {
    	String str1 = new String("abc");
        String str2 = new String("abc");
        
        // false
        System.out.println(str1 == str2);
        
        String str3 = "abc";
        String str4 = "abc";
        
        // true
        System.out.println(str3 == str4);
    }
}
        

한번 생성된 String은 불변(immutable)

String을 연결하면 기존의 String에 연결되는 것이 아닌 새로운 문자열이 생성된다.(메모리 낭비 발생 가능)

public class StringTest {
    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));
        
        // 6번째와 11번째의 해쉬코드가 서로 다르다
    }
}

StringBuilder, StringBuffer

String의 위와같은 문제점으로 인해 StringBuilder 또는 StringBuffer의 사용을 권장한다.

내부적으로 가변적인 char[]를 멤버 변수로 가져 문자열을 연결하거나 변경해도 새로운 인스턴스를 생성하지 않고 내부의 char[]를 변경한다.

StringBuffer는 멀티 쓰레드 프로그래밍에서 동기화를 보장한다.

- StringBuilder 사용

public class StringBuilderTest {
    public static void main(String[] args) {
        System.out.println("StringBuilderTest");

        String java = new String("java");
        String android = new String("android");

        StringBuilder builder = new StringBuilder(java);
        System.out.println("빌더 처음 해시코드: " + System.identityHashCode(builder));
        builder.append(android);
        System.out.println("빌더에 android 추가한 뒤 해시코드 : " + System.identityHashCode(builder));
        System.out.println("builder = " + builder.toString());
    }
}

 

-StringBuffer 사용

public class StringBufferTest {
    public static void main(String[] args) {
        System.out.println("StringBufferTest");

        String java = new String("java");
        String android = new String("android");

        StringBuffer buffer = new StringBuffer(java);
        System.out.println("버퍼 처음 해시코드: " + System.identityHashCode(buffer));
        buffer.append(android);
        System.out.println("버퍼에 android 추가한 뒤 해시코드 : " + System.identityHashCode(buffer));
        System.out.println("buffer = " + buffer.toString());
    }
}

'JAVA' 카테고리의 다른 글

Java Stream  (0) 2021.05.07
Java I/O Stream -2 파일 입출력  (0) 2021.05.07
Java I/O Stream -3 보조 스트림  (0) 2021.05.07
Java I/O Stream -1 기본 스트림  (0) 2021.05.07
인터페이스와 추상클래스의 차이  (0) 2021.05.05

+ Recent posts