StringBuilder, StringBuffer

Sun choi·2024년 8월 7일

NEW 지식

목록 보기
14/34

[자바알고리즘] 문자열 내림차순으로 배치하기

Q. 문자열 s에 나타나는 문자를 큰것부터 작은 순으로 정렬해 새로운 문자열을 리턴하는 함수, solution을 완성해주세요.
s는 영문 대소문자로만 구성되어 있으며, 대문자는 소문자보다 작은 것으로 간주합니다.
str은 길이 1 이상인 문자열입니다.

예시) "Zbcdefg" -> return "gfedcbZ"


1번 코드

import java.util.*;

class Solution {
    public String solution(String s) {
        String answer = "";
        
        String[] str = s.split("");
        Arrays.sort(str, Collections.reverseOrder());
        
        for(String a : str)
           answer += a;
        
        return answer;
    }
}

구글링해서 이렇게 따라 작성하다가 스트링빌더 사용해보고 싶어서 다시 작성했다.


2번 코드

import java.util.Arrays;

class Solution {
    public String solution(String s) {
        char [] aa = s.toCharArray();
        Arrays.sort(aa);
        StringBuilder answer = new StringBuilder(String.valueOf(aa));
        answer.reverse();
        return answer.toString();
    }
}

이걸 풀기 위해 공부한 StringBuilder와 StringBuffer.

Java에서 String 객체는 한번 값이 할당되면 그 공간은 변하지 않는다.(불변성)
하지만 Stringbuilder나 StringBuffer 객체는 한번 값이 할당되더라도 한번 더 다른 값이 할당되면 할당된 공간이 변하는 특성을 갖고 있다.(가변성)
StringBuilder , StringBuffer에 문자열을 추가하게 되면 추가할 문자열의 크기(길이)만큼 현재의 문자열을 저장하는 배열의 공간을 늘려주고, 늘려준 공간에 추가할 문자열을 넣어주는 방식으로 되어있다.

하지만 두 클래스의 기능은 동일하지만 한 가지 차이점이 있다.
바로 동기화(Synchronization)에서의 차이점.

StringBuilder는 동기화를 지원하지 않는 반면, StringBuffer는 동기화를 지원하여 멀티 스레드 환경에서도 안전하게 동작할 수 있. StringBuilder는 동기화를 지원하지 않는 반면, 속도면에선 StringBuffer 보다 성능이 좋다.


🍄 StringBuilder 주요 메서드

(StringBuffer 또한 동일함)

.append( ) : StringBuffer 인스턴스가 저장하고 있는 문자열 뒤에 덧붙인다

.delete(int start, int end) : 시작위치(start) 부터 끝 위치(end) 사이에 있는 문자를 제거한다 (단, 끝 위치의 문자는 제외!)

.deleteCharAt(int index) : 지정된 위치(index)의 문자를 제거한다.

.insert(int pos, String str) : 두번째 매개변수로 받은 값을 문자열로 변환하여 지정된 위치(pos)에 추가한다. (pos는 0부터 시작)

.replace(int start, int end, string str) : 지정된 범위(start ~ end)의 문자들을 주어진 문자열로 바꾼다. (end 위치의 문자는 범위에 포함 되지않는다!)

.reverse( ) : 문자열의 순서를 거꾸로 나열한다.

.setCharAt(int index, char ch) : 지정된 위치의 문자를 주어진 문자(ch)로 바꾼다

.toString( ) : StringBuffer 인스턴스의 문자열을 String으로 반환한다.

.subString(int start) or .subString(int start, int end)
: 지정된 범위 내의 문자열을 String으로 뽑아서 반환한다.


🍄 결론

변하지 않는 문자열을 자주 사용할 경우 String 타입을 사용하는 것이 성능면에서 유리!

단일 스레드 환경 과 문자열의 추가, 수정, 삭제 등이 빈번히 발생하는 경우 StringBuilder를 사용하는 것이 성능면에서 유리!

멀티 스레드 환경 과 문자열의 추가, 수정, 삭제 등이 빈번히 발생하는 경우 StringBuffer를 사용하는 것이 성능면에서 유리!



📍 참고 자료
https://velog.io/@jmjgirl/JAVA-%EB%AC%B8%EC%9E%90%EC%97%B4-%EB%92%A4%EC%A7%91%EA%B8%B0-reverse
https://velog.io/@heoseungyeon/StringBuilder%EC%99%80-StringBuffer%EB%8A%94-%EB%AC%B4%EC%8A%A8-%EC%B0%A8%EC%9D%B4%EA%B0%80-%EC%9E%88%EB%8A%94%EA%B0%80

profile
풀스택 개발자의 공부기록 📖

0개의 댓글