ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • java.lang 패키지 - StringBuffer 클래스
    백엔드/자바 2020. 8. 13. 05:47

    StringBuffer란?

    앞서 포스팅한 String클래스는 변경이 불가능한 immutable 자료형이다.

     

    반면 StringBuffer클래스mutable자료형이다.

     

    String 클래스의 인스턴스는 가진 텍스트를 변경할 때마다 새로 인스턴스가 생성된다.

     

    하지만 StringBuffer는 텍스트를 변경해도 해당 인스턴스가 새로 유지 된다.

     

    그래서 텍스트 변경이 잦은 작업을 위해서는 String보다는 StringBuffer가 더 유리하다.

    StringBuffer의 구조

    StringBuffer은 String과 마찬가지로 클래스 내부에 문자형 배열 ( char[ ] )참조 변수를 갖는다.

     

    이 배열의 크기는 StringBuffer를 생성자를 이용해 생성할 때 결정된다.

     

     

     

    변수 sf1과 같이 인스턴스를 생성할 때 따로 명시하지 않으면 16글자 저장 가능 배열이 기본 생성된다.

     

    반면 sf2와 같이 인스턴스 생성시 별도 명시할 경우 해당 숫자 크기에 맞는 배열이 생성된다.

     

    이때 주의할 점은 인스턴스 생성시 배열의 크기를 충분히 크게 만들어야 하는 것이다.

     

    만약 배열의 크기가 충분치 않을 경우, 배열의 크기를 초과하는 텍스트를 입력할 경우에는

     

    새로운 배열 생성 => 기존 배열의 문자 복사 => 참조 변경 등의 과정을 거쳐 배열을 새로 만든다.

     

    그런 경우 성능상으로 손해를 볼 수 있다.

     

    그러므로 가급적이면 처음부터 충분한 크기의 배열을 생성하는 것이 성능에 유리하다.

    StringBuffer의 equals()

     

    java.lang 패키지 - Object 클래스

    Object 클래스 모든 클래스의 최고 조상 클래스로 Object 클래스의 모든 멤버는 모든 클래스에서 바로 사용이 가능하다. Object 클래스는 멤버 변수는 존재하지 않고 11개의 메서드만 가지고 있으며 Ob

    sgcomputer.tistory.com

    Object 클래스 포스트에서 이야기한바 있는데, String 클래스의 equals() 메서드는 오버라이딩되있다.

     

    일반적으로 equals() 메서드가 두 객체의 주소값을 비교하는데 반해 String은 문자열을 비교하도록 되있다.

     

    이는 사용자가 오버라이딩한 것이 아닌 클래스에서 처음부터 오버라이딩되서 제공되는 것이다.

     

    하지만 StringBuffer 클래스의 equals()는 오버라이딩되지 않았다.

     

     

     

    위의 결과처럼 직접 확인해보면 같은 문자열을 가졌더라도 두 객체가 다르다고 판단한다.

     

    이땐 어떻게하면 좋을까?

     

     

     

    위와 같이 StringBuffer를 String으로 변환해서 비교하면 편리하게 비교할 수 있다.

     

    toString()메서드로 String에 내용을 복사하고 그 둘을 비교하면 문자열끼리 비교가 가능하다.

    StringBuffer의 메서드들

    public static void main(String[] args) {
    
            // StringBuffer의 객체 생성
            StringBuffer sf1 = new StringBuffer();
    
            // capacity(): 객체가 가진 버퍼의 크기를 반환함
            sf1.capacity();
    
            // length(): 버퍼에 담긴 문자열의 길이를 반환함
            sf1.length();
    
            // append(): 매개변수로 입력된 값을 문자열로 변환하여 저장된 문자열의 뒤에 덧붙임
            sf1.append("ABC");
    
            // delete(): 왼쪽숫자부터 오른쪽숫자 사이에 있는 문자를 제거(index 기준).
            // 단, 오른쪽 숫자에 해당되는 문자는 제외한다.
            // 해당 메서드를 실행할 경우 "ABC" => "C"로 변경됨
            sf1.delete(0,2);
    
            // deleteCharAt(): 괄호 안 인덱스에 해당하는 문자를 제거
            sf1.deleteCharAt(0);
        }

     

    public static void main(String[] args) {
    
            StringBuffer sf1 = new StringBuffer();
    
            sf1.append("AAAAA");
    
            System.out.println(sf1); // "AAAAA" 출력
    
            // replace(): 왼쪽 숫자에서부터 오른쪽 숫자 범위에 포함된 문자를
            // 매개변수로 주어진 문자열로 바꾼다.
            // 단, 오른쪽 숫자에 해당하는 문자는 범위에 포함되지 않는다.
            sf1.replace(1, 5, "BCDE");
    
            System.out.println(sf1); // "ABCDE" 출력
    
        }

     

    public static void main(String[] args) {
    
            StringBuffer sf1 = new StringBuffer();
    
            sf1.append("ABCDE");
    
            System.out.println(sf1); // "ABCDE" 출력
    
            // reverse(): 버퍼에 저장된 문자열의 순서를 거꾸로 한다.
            sf1.reverse();
    
            System.out.println(sf1); // "EDCBA" 출력
    
        }

     

    public static void main(String[] args) {
    
            StringBuffer sf1 = new StringBuffer();
    
            sf1.append("AABAA");
    
            System.out.println(sf1); // "AABAA" 출력
    
            // setCharAt(): 지정된 위치의 문자를 입력한 문자로 바꾼다.
            sf1.setCharAt(2, 'C');
    
            System.out.println(sf1); // "AACAA" 출력
    
        }

     

    public static void main(String[] args) {
    
            StringBuffer sf1 = new StringBuffer();
    
            sf1.append("ABCDE");
    
            System.out.println(sf1); // "ABCDE" 출력
    
            // substring(num): 입력된 숫자의 뒤에 남은 문자를 반환한다.
            String s1 = sf1.substring(3);
    
            // substring(start, end): start에서 end 사이의 문자를 반환한다.
            // 단 end에 해당하는 문자는 제외.
            String s2 = sf1.substring(2,4);
    
            System.out.println(s1); // "DE" 출력
            System.out.println(s2); // "CD" 출력
    
        }
Designed by Tistory.