ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Java] StringBuffer/StringBuilder 클래스
    IT/개발(자바, 서블릿, 스프링 등) 2020. 1. 18. 21:54

    StringBuffer와 StringBuilder도 String처럼 문자열을 처리하는 클래스다. 

     

    String 클래스는 단점이 하나 있다. 바로 원본이 변경되지 않는다는 점이다. 원본 문자열이 변경되지 않으니 문자열을 수정할 때마다 메모리에 새로운 문자열이 생성되고 이전 문자열은 메모리에 남아 쓸데없는 자리만 차지하게 된다. 즉, String은 메모리 사용에 있어서 비효율적인 면이 있다.

     

    String의 단점을 보완하는 클래스가 StringBuffer와 StringBuilder다. 문자열을 처음 만들 때 넉넉한 메모리 공간을 확보해서 그 안에 문자열을 저장하고 수정한다. 문자열을 처리하기 위해 넉넉한 메모리 공간을 버퍼(buffer)라고 부른다. 버퍼에서 문자열을 수정하므로 수정할 때마다 String처럼 새로운 문자열을 만들 필요가 없다.

     

    StringBuffer와 StringBuilder 클래스의 차이점은 무엇일까? 두 클래스 모두 버퍼를 이용하여 문자열을 수정하므로 효율적으로 메모리를 관리할 수 있다는 공통점이 있고, 멤버로 가지고 있는 메서드도 거의 같다. 평상시에 어떤 클래스를 사용해도 무방하다. 딱 한가지 차이는 생성된 인스턴스를 동시에 여러 곳에서 접근하여 사용할 때이다. 

     

    예를들어 지금 공연 좌석 예매를 할 때, 하나의 좌석에 여러 명이 동시에 예매를 시도할 때 어떻게 처리해야 할까? 먼저 예매를 시도한 사람이 있다면 그 사람이 작업을 완료할 때까지 다른 사람은 그 좌석을 선택할 수 없어야 한다. 만약 이런 제약을 두지 않으면 동시에 예매할 수 있도록 한다면 한 좌석을 여러 명이 예매하게 되는 사태가 벌어진다. 

     

    StringBuffer 클래스는 동시에 접근하는 사항에 대처할 수 있다. 여러 곳에서 동시에 접근해야 한다면 StringBuffer를 사용하면 된다. StringBuffer는 동시에 접근하는 상황을 처리하기 위해 내부적으로 많은 처리를 한다.

     

    StringBuilder 클래스는 대처할 수 없다. 동시에 접근하는 상황이 발생할 가능성이 없다면 StringBuilder를 사용한다. 

     

    public class Test {
    	public static void main(String[] args) {
    		StringBuilder sb = new StringBuilder("날이 좋아서 ");
    
    		System.out.println(sb);
    		System.out.println(sb.append("날이 적당해서"));
    		System.out.println(sb.insert(8, "날이 좋지 않아서 "));
    		System.out.println(sb.append(" 모든 날이 좋았다 "));
    
    		int start = sb.indexOf("모든 날이 좋았다 ");
    		int end = sb.length();
    		System.out.println(sb.replace(start, end, "너와 함께 한 시간 모두 눈부셨다"));
    	}
    }
    
    [실행결과]
    날이 좋아서
    날이 좋아서 날이 적당해서
    날이 좋아서 날이 좋지 않아서 날이 적당해서
    날이 좋아서 날이 좋지 않아서 날이 적당해서 모든 날이 좋았다
    날이 좋아서 날이 좋지 않아서 날이 적당해서 너와 함께 한 시간 모두 눈부셨다
Designed by Tistory.