본문 바로가기

웹개발/JAVA

[JAVA] String - immutable, StringBuilder and StringBuffer - mutable

mutalble : 객체 안에 있는 내용(원본)을 바꿀 수 있다. 

immutable : 객체 안에 있는 내용(원본)을 바꿀 수 없다. 

 

- String

		System.out.println("[String: immutable]");

		String str1 = "Hello"; // literal("")이라 메모리 하나에만 생성됨
		String str2 = str1;
		
		System.out.println("str1 = " + str1);
		System.out.println("str2 = " + str2);
		
		System.out.println(str1 == str2);  // 동일 참조
		
		str1 = str1.concat("Java"); // String 메소드 결과로 생성되는 결과 String 은 다른 객체다 (immutable)
		System.out.println("str1 = " + str1);
		System.out.println("str2 = " + str2);
		
		System.out.println(str1 == str2);  // 다른 참조

- 결과

- 메모리 상태

String str1 = "Hello";

String str2 = "Hello";

str2 = "He".concat("llo");

=> M.A에 "He", "llo"가 각각 만들어지고 이 둘을 이용해서 HEAP 메모리에 String 객체 생김

-> 따라서 str1==str2의 결과값이 false. 

- StringBuffer

     - Java ver 1.0부터 있던 클래스

     - 쓰레드에 안전(thread-safe), 속도가 느림

		System.out.println("[StringBuffer: mutable]");

		StringBuffer buff1 = new StringBuffer("Hello");
		StringBuffer buff2 = buff1;
		
		System.out.println("buff1 = " + buff1);
		System.out.println("buff2 = " + buff2);
		
		System.out.println(buff1 == buff2);  // 동일 참조
		
		// mutable 객체의 메소드는 동일한 동작이라도 immutable과 이름이 다르게 설계되어 있다
		// String.concat()  vs  StringBuffer.append()
		buff1.append("Java");
		
		System.out.println("buff1 = " + buff1); 
		System.out.println("buff2 = " + buff2);
		
		System.out.println(buff1 == buff2);

- 결과

- 메모리 상태

StringBuffer buff1 = new StringBuffer("Hello");

StringBuffer buff2 = buff1;

buff1.append("Java");

- StringBuilder

     - Java 5부터 생긴 클래스

     - 쓰레드에 안전하지 않다(thread-unsafe), 속도가 빠름

           => 이 외에는 StringBuffer와 StringBuilder는 같은 기능(메소드)를 갖고 있음

 

+) 웹 프로그래밍 등에선 문자열을 붙여 나가며(String의 concat, StringBuffer와 StringBuilder의 append와 같은) 완성하는 동작을 많이함. 따라서 실무에서는 String을 concat() 또는 '+' 연산하기 보다는 StringBuffer를 append() 하는 것을 더 많이 사용함.

    => 위의 메모리 상태에서 알 수 있듯이 append()가 더 성능적으로 좋다