⭐String 과 StringBuffer

String 클래스
문자열을 표현하는데 사용된다.

💀불변 immutable 이다.
한 번 설정하면 변경할 수 없다.

 

String 클래스를 통해 문자열을 저장하는 방식엔 2가지가 있다.


리터럴 방식
String str1 = "Hello";
Heap 안에 존재하는 특정한 영역
String Constant Poll에 저장돼 재사용된다.

new 연산자 사용
String str1 = new String("Hello");
Heap 메모리에 객체로서 올라간다.

String 클래스의 특성으로 인해
문자열을 자주 변경한다면
메모리 낭비가 심해질 수 있다.

 

상수풀에 문자열을 저장한 뒤
이를 참조해서 재사용하면 메모리를 아낄 수 있다.

 

⭐StringBuffer

 

String 클래스의 불변성으로 인해
문자열을 자주 변경할 때 메모리 낭비가 발생할 수 있다.

 

StringBuffer를 사용하면

객체를 계속해서 생성시키지 않고 문자열을 변경 가능하다.

 

 

예제) String 클래스의 객체 선언 방식

 

package _string;
/**
 * 4.24
 * String 연습
 */
public class StringTest1 {

    //변수
    //생성자
    //메서드

    //main
    public static void main(String[] args) {

        String str1 = "문자열"; //Heap => StringPool에 저장

        String str2 = new String("abc"); //Heap에 저장
        String str3 = new String("abc");
        //Heap에 올라가면 주소값이 생성된다.
        /*
        참조 비교
        주소 == 주소
        각각 객체의 주소값을 비교한다.
         */
        System.out.println("str2 == str3: " + (str2 == str3));

        //문자열을 리터럴 방식으로 만들어보자
        String str4 = "abc";
        String str5 = "abc";
        String str6 = "abc";

        System.out.println("str4 == str5: " + (str4 == str5));
        /*
        문자열은 아주 많이 사용되는 데이터 타입이다.
        모든 문자열이 객체로 저장된다면
        메모리 효율이 떨어지게 된다.

        상수풀에 문자열을 저장한 뒤
        이를 참조해서 재사용하면 메모리를 아낄 수 있다.

        그래서 str1 = "abc" = str4,str5 인 것이다.
         */

        String str7 = str6 + " 안녕"; //"abc 안녕"이라는 새로운 녀석이 상수풀에 올라갔다.
        System.out.println(str7);

    }//end of main
}//end of class

String은 리터럴 방식, 객체 방식으로 선언하면 저장방식의 차이로 인해 주소값이 달라질 수 있다.

str2, str3은 객체로

str4, str4는 리터럴로 선언됐다.

 

예제2)

String은 불면한다

 

💀String 객체는 불변 immutable 이다.

원래 객체 주소가 생성됐고
내부 변수 값이 변경된다면
String 클래스는 수정되지 않고 불변이다.

⭐ 만약 수정을 하게되면
새로운 String 객체를 만드는 동작이 실행된다.

package _string;
/**
 * 4.24
 * String 연습
 */
public class StringTest2 {

    //main
    public static void main(String[] args) {

        //객체
        String str1 = new String("Hello");
        String str2 = new String("World");

        /*
        String 객체는 불변 immutable 이다.

        원래 객체 주소가 생성됐고
        내부 변수 값이 변경된다면
        String 클래스는 수정되지 않고 불변이다.

        만약 수정을 하게되면
        새로운 String 객체를 만드는 동작이 실행된다.
         */

        System.out.println("고유주소확인: " + System.identityHashCode(str1));

        //문자열 연결 기능 호출
        str1 = str1.concat(str2);

        System.out.println("수정주소확인: " + System.identityHashCode(str1));

    }//end of main
}//end of class

str1의 문자열 값을 변경하자 sir1의 주소값도 자동으로 변경됐다.

 

예제3)

String 클래스에 포함된 다양한 메서드를 사용해봤다.

 

⭐replace 메서드
문자열 내 특정 문자열을
다른 문자나 문자열로 교체할 때 사용한다
ex 비속어

⭐ substring 메서드
문자열 일부분을 추출하여
새로운 문자열로 반환한다.

두가지 오버로딩 메서드를 제공한다.
startindex~
startindex~ endIndex
index는 0부터 시작한다.

package _string;
/**
 * 4.24
 * String 연습
 */
public class StringTest3 {

    //main
    public static void main(String[] args) {

        String str1 = "ABCD";
        int countStr1 = str1.length(); //문자열 길이
        System.out.println("countStr1: " + countStr1);

        /*
        replace 메서드는
        문자열 내 특정 문자열을
        다른 문자나 문자열로 교체할 때 사용한다
        ex 비속어

        World 를 Java로 대체해보자
         */
        String str2 = "HelloWorld";
        String str3 = str2.replace("World", "Java");

        System.out.println("str2: " + str2); // HelloWorld
        System.out.println("str3: " + str3); // HelloJava

        /*
        substring 메서드는
        문자열 일부분을 추출하여
        새로운 문자열로 반환한다.

        두가지 오버로딩 메서드를 제공한다.
        startindex~
        startindex~ endIndex
        index는 0부터 시작한다.
         */
        String result1 = str2.substring(0, 5);
        System.out.println("HelloWorld의 1~5번째 글자: " + result1);

    }//end of main
}//end of class

 

예제4)

StringBuffer 활용

package _string;
/**
 * 4.24
 * String Buffer 연습
 */
public class StringBufferTest1 {

    //main
    public static void main(String[] args) {

    String str1 = new String("Hello");
    String str2 = new String("World");

    //새로 배우는 데이터 타입 StringBuffer
    StringBuffer buffer1 = new StringBuffer(str1);

        System.out.println(buffer1);
        System.out.println("수정전 해시코드: " + System.identityHashCode(buffer1));

    //buffer1 값을 수정해보자 Replace
    buffer1.append(str2); //문자열 합치기
    buffer1.append("111");
    buffer1.append("222");

        System.out.println(buffer1);
        System.out.println("수정후 해시코드: " + System.identityHashCode(buffer1));

        /*
        hashCode()
        API7에서는 객체의 유일성 보장하는 정수값
        API8부터는 buffer1.toString() 해야 값을 확인 가능

        StringBuffer 데이터 타입을 String으로 형변환 하려면 toString()하면 됨
         */
        String result1 = buffer1.toString();
        System.out.println(result1);

    }//end of main
}//end of class

StringBuffer 구문을 통해 주소값 변경없이(객체생성 없이) 문자열을 변경한 모습

 

+ Recent posts