불변클래스

String 클래스에 값을 할당하면 메모리에 올라간 값은 절대 변경되지 않는다.

만약 새로운 값을 넣었더라도. 기존 값은 그대로 있으며, 메모리 주소값만 바뀔 뿐이다.

String a = "출근";
a = "퇴근";
  • 처음 a라는 변수 선언 후 출근이라는 값을 넣었다.
  • 그 후 "퇴근"이라는 값을 넣으면 출근 → 퇴근 으로 바뀌는 것이 아닌, 출근은 그대로 어딘가(상수풀영역)에 남아있고, 퇴근이라는 상수영역을 가르치게 되는 것이다.
  • 만약 계속해서 a에 값을 넣는다면 상수풀에 불변값이 올라가게 된다.

 

문자열을 만드는 두가지 방법.

  1. String str1 = new String("ABC"); // 인스턴스가 생성됨. 힙 메로리에 올라감.
  2. 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
블로그 이미지

파니동

,