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()가 더 성능적으로 좋다
'웹개발 > JAVA' 카테고리의 다른 글
[JAVA] Collection - Set(HashSet, TreeSet) (0) | 2021.09.04 |
---|---|
[JAVA] Collection - List(ArrayList, LinkedList의 CRUD 동작) (0) | 2021.09.04 |
[JAVA] Inner Class (0) | 2021.09.03 |
[JAVA] Exception 클래스의 상속 관계, 예외 클래스 만들기 (0) | 2021.09.02 |
[JAVA] 다형성(Polymorphism)의 유용함 + up casting & down casting (0) | 2021.08.28 |