티스토리 뷰

StringBuffer

  • 저장하고 있는 문자열을 변경할 수 있는 클래스이다.
  • 내부적으로 문자열 편집을 위한 버퍼를 가지고 있으며, 인스턴스를 생성할 때 그 크기를 직접 지정해 줄 수도 있다.
    • default size는 16으로 설정되어 있다.
    • 편집 중인 문자열의 길이가 버퍼의 길이를 초과하면 버퍼의 길이를 늘려주는 작업이 추가로 수행되어야 한다 → 효율성 하락
  • 인스턴스 생성시에 버퍼로 사용하기 위한 char형 array가 생성되는 것으로 알고 있었는데, 실제 코드를 열어 보면 byte array 타입으로 멤버변수가 선언되어 있다.
    • 내부 코드를 조금 살펴보면 문자열이 UTF-16과 LATIN1 방식 두 가지 인코딩 방식으로 존재할 수 있기 때문에 이를 모두 지원하기 위한 방법인 것으로 생각된다.
    • 그래서 인스턴스 생성시에 UTF-16으로 인코딩된 문자열을 다룰 경우 StringUTF16 class의 newBytesFor() 메서드를 사용하여 주어진 길이의 2배의 길이를 가진 byte 형 array를 생성하여 가지고 있게 된다.
      • Java Datatype 중 byte 형의 크기는 1 byte, char 형의 크기는 2 bytes 이므로 전체 배열의 크기는 같음을 알 수 있다.
    • 문자열 편집을 위해 문자를 추가하거나 꺼낼 때 등 이 배열에 접근해 값을 다룰 때, 주어진 문자열의 인코딩 방식에 따라 별도로 정의된 함수를 사용한다.

문자열 비교

이 클래스는 equals 메서드를 오버라이딩 해 주지 않았다.

그래서 String 처럼 equals를 이용한 문자열 비교는 불가능하다. 이러한 방식의 비교를 원한다면 toString() 메서드를 사용해 String 타입의 인스턴스를 받은 다음, 다시 이 인스턴스에 equals() 메서드를 사용해야 한다.

동기화

StringBuffer 클래스의 메서드들을 살펴보면 저장된 문자열 데이터에 접근하는 모든 메서드에 synchronized 키워드가 붙어 있다.

아직 Java에서 synchronized 키워드에 의한 동기화 방식이 어떻게 이루어지는지 정확히 알고 있지는 않지만, 이를 통해 저장중인 문자열 데이터에 한번에 한 쓰레드만 접근할 수 있도록 해 주어 thread-safe하게 처리할 수 있음을 기대할 수 있다고 한다.

  • 한번에 하나의 쓰레드만 저장된 데이터에 접근할 수 있어야 하므로 아마 lock & unlock 방식을 이용하고 있지 않을까 생각해본다.
  • 이 부분은 나중에 따로 한 번 찾아보기로 한다.

StringBuilder

멀티 쓰레드로 작성된 프로그램이 아닐 경우, StringBuffer의 동기화 기능은 불필요한 동기화 과정을 거쳐야 하므로 성능 저하를 일으킬 수 있다.

StringBuilder는 이러한 문제를 해결하기 위한 것로, StringBuffer에서 동기화 기능만 제거한 클래스이다.

동기화 기능의 유무를 제외한 다른 모든 것은 서로 동일하다.

'Programmers 데브코스 > 더 알아보기' 카테고리의 다른 글

23 Design Patterns  (0) 2021.08.08
Java의 Object class 훑어보기  (0) 2021.08.07
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/12   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31
글 보관함