Hun's Blog

[JAVA] String 과 String Buffer 의 차이 본문

Language/Kotlin & Java

[JAVA] String 과 String Buffer 의 차이

jhk-im 2020. 3. 21. 19:47

참고 - 

https://wikidocs.net/276

 

위키독스

온라인 책을 제작 공유하는 플랫폼 서비스

wikidocs.net

http://tcpschool.com/java/java_api_stringBuffer

 

코딩교육 티씨피스쿨

4차산업혁명, 코딩교육, 소프트웨어교육, 코딩기초, SW코딩, 기초코딩부터 자바 파이썬 등

tcpschool.com

String 과 String Buffer 의 차이

String  - immutable class

1
2
3
4
5
String s = "";
s += "Hello";
s += " ";
s += "World";
 

- String 은 + 연산이 있을 때 마다 새로운 String 객체가 생성된다.

- 문자열 간 + 연산이 있는 경우 자바에서 자동으로 새로운 String 객체를 만든다.

- "Hello" , " " , "World"  총 3개의 String 자료형 객체가 만들어진 것이다.

 

** String 자료형은 한번 값이 생성되면 그 값을 변경할 수 없다.

이러한 속성의 클래스를 immutable class (불변 클래스) 라고한다.

불편 클래스는 append(), insert() 와 같은 값을 변경하는 set 메소드가 없다.

 

** 불편한 것 같은데 왜 사용하는가?

멀티 스레드 환경에서 객체가 변화되는 상황이라면

불변 클래스 인스턴스를 사용하는 것이 좀 더 신뢰할 수 있기 때문이다.

하나의 객체에 접근하면서 각각 객체가 서로 영향을 주어서는 안되는 경우

불변 클래스 인스턴스를 사용하면 값이 변하지 않는다는 점이 보장된다. 

 

StringBuffer  - mutable class

1
2
3
4
5
6
7
8
StringBuffer sb = new StringBuffer();
sb.append("Hello");
sb.append("World");
System.out.println(sb); // Hello World
System.out.println(sb.equals("Hello World")); // false
System.out.println(sb.toString().equals("Hello World")); // true
sb.insert(0,"Insert - ");System.out.println(sb); //Insert - Hello World
 

- StringBuffer는 단 한번만 생성된다.

- StringBuffer인 sb 라는 객체에 append() 메소드를 사용하여 문자가 추가 되는 것이다.

- insert() 메소드로 원하는 위치에 문자열을 삽입할 수 있다.
- 생성된 객체가 변경이 가능하다는 점에서 mutable class (가변 클래스) 라고한다.

 

**  StringBuffer 클래스는 내부적으로 buffer 라고 하는 독립적인 공간을 가진다.

버퍼 크기의 기본값은 16개의 문자를 저장할 수 있는 크기이며, 생성자를 통해 그 크기를 별도로 설정할 수도 있다. StringBuffer 를 사용하면 문자열을 바로 추가할 수 있으므로, 공간의 낭비도 없으며 속도도 매우 빨라진다.

 

** 장점이 많은 것 같은데 StringBuffer 만 사용하면 안되나?

상황에 따라 다르다. StringBuffer 는 String 보다 무거운 편에 속한다. 문자열 추가나 변경등의 작업이 많은 경우 StringBuffer 를 사용하고, 변경 작업이 거의 없는 경우 String 을 사용하는 것이 좋다.

 

 

정리-

- String은 불변 클래스이고 불변 클래스로 생성된 객체는 값을 변경할 수 없다.

객체에 값이 변경될 때 변경되는 문자가 추가 or 제거되는 것이 아니라 완전히 새로운 객체가 생성되는 것이다. 그렇기 때문에 변경이 많은 경우 계속해서 객체가 생성되기 때문에 속도도 느려지고 메모리 사용량도 증가한다.

- StringBuffer는 가변 클래스이며 객체가 생성되고 나서 값을 변경할 수 있다.
문자 변경시 새로운 객체 생성 없이 바로바로 변경할 수 있기 때문에  메모리 낭비 없이 속도가 매우 빨라질 수 있으나 String 보다 무거워서 기본적으로는 메모리를 많이 사용한다.

문자 추가변경이 많은 경우 StringBuffer
그 이외에는 String을 사용한다.