불변클래스
String 클래스에 값을 할당하면 메모리에 올라간 값은 절대 변경되지 않는다.
만약 새로운 값을 넣었더라도. 기존 값은 그대로 있으며, 메모리 주소값만 바뀔 뿐이다.
String a = "출근";
a = "퇴근";
- 처음 a라는 변수 선언 후 출근이라는 값을 넣었다.
- 그 후 "퇴근"이라는 값을 넣으면 출근 → 퇴근 으로 바뀌는 것이 아닌, 출근은 그대로 어딘가(상수풀영역)에 남아있고, 퇴근이라는 상수영역을 가르치게 되는 것이다.
- 만약 계속해서 a에 값을 넣는다면 상수풀에 불변값이 올라가게 된다.
문자열을 만드는 두가지 방법.
- String str1 = new String("ABC"); // 인스턴스가 생성됨. 힙 메로리에 올라감.
- String str2 = "123"; // 리터럴, 상수풀에 값이 올라감.
StringTest1 클래스
package string;
public class StringTest1 {
public static void main(String[] args) {
String str1 = new String("abc"); // false
String str2 = new String("abc"); // true
System.out.println(str1 == str2);
System.out.println(str1.equals(str2));
System.out.println("==========================================");
String str3 = "abc";
String str4 = "abc";
System.out.println(str3 == str4); // true
System.out.println(str3.equals(str4)); // true
}
}
- 리터럴 방식으로 선언한 문자열은 동등연산자로 비교해도 "상수풀"을 가르치는 주소값이 같으므로, true가 리턴된다.
두 문자열 연결하기 - concat()
package string;
public class StringTest2 {
public static void main(String[] args) {
String javaStr = new String("java");
String androidStr = new String("android");
System.out.println(javaStr);
System.out.println("처음 문자열 주소 값: " + System.identityHashCode(javaStr));
javaStr = javaStr.concat(androidStr);
System.out.println(javaStr);
System.out.println("주소값: " +System.identityHashCode(javaStr));
}
}
- String 클래스의 값은 변하지 않는다.
- 서로 주소값이 다른 문자열을 연결해서 다시 생성한 것이다.
StringBuffer 와 StringBuilder
String 클래스로 문자열을 연결하다보면 계속해서 메모리에 올라가기 때문에 성능에 영향을 줄 수 있다. 이를 해결하기 위해 StringBuffer 와 StringBuilder 를 사용한다.
package string;
public class StringBuilderTest {
public static void main(String[] args) {
String javaStr = new String("Java");
System.out.println("javaStr 문자열 주소: " + System.identityHashCode(javaStr));
StringBuilder buffer = new StringBuilder(javaStr);
System.out.println("연산 전 buffer 메모리 주소" + System.identityHashCode(buffer));
buffer.append(" and");
buffer.append(" android");
buffer.append(" programing is fun!!!");
System.out.println(buffer);
System.out.println("연산 후 buffer 메모리 주소" + System.identityHashCode(buffer));
javaStr = buffer.toString();
System.out.println(javaStr);
System.out.println("연결된 javaStr 문자열 주소: " + System.identityHashCode(javaStr));
}
}
- StringBuilder를 사용하면 문자열을 추가해도 메모리 주소값이 변경되지 않는다.
출처: do it 자바프로그래밍
'프로그래밍 > Java' 카테고리의 다른 글
Class 클래스 (0) | 2019.12.12 |
---|---|
wrapper클래스 (0) | 2019.12.11 |
기본클래스 - Object (0) | 2019.12.09 |
인터페이스의 구현과 상속 (0) | 2019.12.08 |
인터페이스 - 디폴트메서드, 정적메서드 (0) | 2019.12.08 |