본문 바로가기
Dev/Java

String, StringBuilder, StringBuffer의 차이

by 펭귄안에 온천 2023. 5. 15.
728x90
반응형

스트링(String), 스트링버퍼(StringBuffer), 스트링빌더(StringBuilder)는 모두 문자열을 처리하는 클래스

 

그러나 차이점이 있음

 

String

- String은 immutable(불변)

- String은 문자열을 대표하는 것으로 문자열을 조작하는 경우 유용하게 사용함

- String 객체는 한번 생성되면 할당된 메모리 공간이 변하지 않음.

- 연산자, concat메서드를 통해 다른 문자열 을 붙여도 기존의 문자열에 새로운 문자열을 붙이는것이 아닌 새로 String을 만든 후 새 String객체에 연결된 문자열을 저장하고, 그 객체를 참조하게 함 ->문자열 연산이 많은 경우 성능이 좋지 않음

-  Immutable한 객체는 간단하게 사용가능하고, 동기화에 대해 신경쓰지 않아도 되기때문에(Thread-safe),  내부 데이터를 자유롭게 공유 가능

String Buffer, StringBuilder

- 기존의 버퍼 크기를 늘리며 유연하게 동작합니다. 

- StringBuffer는 각 메서드별로 Synchronized Keyword가 존재하여, 멀티스레드 환경에서도 동기화를 지원.
- StringBuilder는 동기화를 보장하지 않음.

 

- 멀티스레드 환경이라면 값 동기화 보장을 위해 StringBuffer를 사용하는게 좋음

- 단일스레드 환경이라면 StringBuilder를 사용하는 것이 좋음

정리

- String은 짧은 문자열을 더할 경우 사용

- StringBuffer는 스레드에 안전한 프로그램이 필요할 때나, 개발 중인 시스템의 부분이 스레드에 안전한지 모를 경우 사용하면 좋습니다.

- StringBuilder는 스레드에 안전한지 여부가 전혀 관계 없는 프로그램을 개발할 때 사용하면 좋습니다.

 

 

단순히 성능만 놓고 본다면 연산이 많은 경우, StringBuilder > StringBuffer >>> String 입니다.

 

 

 

 

  @Test
    void StringTest(){
        // String
        String str = "Hello";
        String new_str = str.concat(" World"); // 새로운 문자열 객체를 만들어서 반환합니다.
        System.out.println(str); // Hello
        System.out.println( new_str ); //Hello World

        // StringBuffer
        StringBuffer buffer = new StringBuffer("Hello");
        buffer.append(" World"); // 기존 객체의 값을 변경합니다.
        System.out.println(buffer); // Hello World

        // StringBuilder
        StringBuilder builder = new StringBuilder("Hello");
        builder.append(" World"); // 기존 객체의 값을 변경합니다.
        System.out.println(builder); // Hello World
    }

 

 

 

	@Test
	public void stringBuffer(){
		StringBuffer stringBuffer = new StringBuffer("stringBuffer");
		addStringBuffer(stringBuffer);
		System.out.println(stringBuffer); // stringBuffer^^
	}
	private void addStringBuffer(StringBuffer stringBuffer){
		stringBuffer.append(" ^^");
		System.out.println(stringBuffer); // stringBuffer^^
	}
    /*
    stringBuffer 가변이다.
    를 매개변수로 전달 할때, 참조 타입 변수는 실제로 객체의 주소를 가리키는 값이 전달 되기 때문에
    addStringBuffer()에서 값을 변경하면
    동일한 객체를 참조하고 있는 변경 내용이 변경됨
    */
    
    
    
    
    
	@Test
	public void string(){
		String str = "String";
		addString(str);
		System.out.println(str); //String
	}
	private void addString(String str){
		str += "^^";
		System.out.println(str); //String^^
	}
    /*
    String은 불변이기 때문에 문자열 연결등의 작업이 수행 될때마다
    새로운 String객체가 생성된다.
    
    */

 

반응형