본문 바로가기
교육, 학습/멀티캠퍼스_풀 스택

JAVA 문법 - StringBuffer클래스 사용 이유(String과 비교)

by 개발하는 경제학도 2022. 1. 13.

강의 소개

현재 수강하고 있는 멀티캠퍼스 k-digital 지능형 웹서비스 풀 스택 과정을 수강하며 적은 내용입니다.

교재로는 자바의 정석을 사용하고 있습니다.


StringBuffer클래스

java.lang패키지에 있는 클래스이다.

동일 패키지 내의 String과 동일하게 문자열을 처리하지만 가장 중요한 '수정 가능'하다는 차이점이 있다.

String과 비교해보며 수정이 가능한 이유가 무엇인지, 사용하는 이유는 무엇인지 알아본다.

 

사용 이유

String은 원본 변경이 불가능하다. String타입의 문자열을 수정할 때마다, 메모리 내의 힙 영역에 문자열이 변경된 새로운 인스턴스가 생긴다. 이로써 메모리 낭비가 될 수 있어 스트링 버퍼 클래스를 사용하는 것이다.

 

String 클래스와의 차이점(4가지)

1) StringBuffer는 + 연산자로 문자열 결합이 안된다.

대신 append메서드를 사용한다.  ex.  sb1 = sb1.append(sb2);  

 

2) 인스턴스 생성 시에 메모리에 미리 저장공간(버퍼)을 확보해둔다.

아래 코드처럼 스트링 버퍼 인스턴스를 생성하기만 해도 16 문자를 저장할 수 있는 공간(버퍼)을 확보해둔다.

StringBuffer sb1 = new StringBuffer();  // 이미 16문자 저장공간이 확보된 상태

 

만약 int를 매개변수로 주면, 그 수만큼 문자를 저장할 수 있는 공간을 인스턴스 생성 시에 확보해준다.

StringBuffer sb3 = new StringBuffer(50);  // int를 매개변수로 주면, 그 수만큼 문자를 저장할 수 있는 공간 확보해줌.

 

3) 배열의 크기보다 버퍼(저장공간)가 작으면, 자동으로 저장공간을 늘려준다.

문자열이 거의 다 차면 알아서 추가 저장공간을 알아서 늘려준다. 따라서 스트링 버퍼는 String 클래스와 다르게 수정할 수 있게 된다.

 

4) equals 메서드를 오버 라이딩하지 않았다.

StringBuffer타입의 인스턴스는 Object 클래스의 equals메서드를 그대로 사용한다. 따라서 인스턴스의 주소 값을 비교한다.

StringBuffer sb1 = new StringBuffer("Good morning");
StringBuffer sb2 = new StringBuffer("Good morning");
// Object 클래스의 equals 메서드 호출
System.out.println(sb1.equals(sb2));  // false

 

위의 코드에 이어서 StringBuffer타입의 인스턴스를 다시 String타입으로 바꿔주면 equals로 '문자열 값 비교'가 가능하다.

String s1 = sb1.toString();  // String클래스의 toString : 문자열로 출력
String s2 = sb2.toString();

System.out.println(s1.equals(s2));  // true

 

줄여서 적으면 아래와 같다.

sb1.toString().equals(sb2.toString());

 

 

출처: 자바의 정석(남궁 성 저), 멀티캠퍼스

참고자료: 이것이 자바다(신용권 저)

댓글