String의 불변성
Java의 String 객체는 불변(immuatable)이다.
예를 들어 아래와 같은 코드를 작성했다고 가정하자.
String str = "Hello";
str = "World!";
위 코드에서 str은 "Hello"에서 "World!"로 수정되는 것이 아니다.
먼저 첫 번째 줄의 동작을 살펴보면 "Hello"라는 문자열이 String Pool에 객체로 저장되고 str은 해당 문자열을 참조할 뿐이다.
두 번째 줄에서는 "World!" 문자열이 String Pool에 추가되고 str은 해당 문자열을 참조한다.
이제 "Hello" 문자열은 더 이상 참조되지 않으므로 Garbage Collection의 대상이 된다.
수정 가능한 StringBuffer
StringBuffer는 수정할 수 있는(modifiable) 문자열이다.
데이터 변경 시 String 클래스와 달리 새로 오브젝트가 생성되지 않고 동적으로 조절한다.
따라서 문자열 수정 작업이 많거나 대용량의 문자열을 처리하는 경우 StringBuffer가 효율적이며
안정성과 메모리 효율성을 추구하는 경우에는 String이 효율적이다.
StringBuffer 생성자
StringBuffer 클래스는 생성자가 다음과 같이 오버로딩되어 있다.
- StringBuffer()
16개 문자를 위한 메모리 공간 할당
- StringBuffer(int size)
size 만큼의 메모리 공간 할당
- StringBuffer(String str), StringBuffer(CharSequence chars)
문자열을 할당 후 추가로 16개의 문자를 할당할 수 있는 공간을 할당
StringBuffer 클래스 메서드
StringBuffer 클래스도 유용한 몇 가지 메서드를 제공하고 있다.
- int length()
문자열의 길이를 반환
- int capacity()
객체에 할당된 메모리 크기를 반환 (문자 개수를 기준으로)
- void setLength(int len)
문자열의 길이를 조정
* setLength()를 통해 길이를 늘인 후 length()로 길이를 확인하면 실제로 출력되는 문자열의 길이와 다르게 출력되는데
이는 setLength()로 길이를 늘릴 경우 데이터가 없는 부분은 null 문자(\u0000)으로 채워지기 때문이다.
- char charAt(int where)
인덱스 where 위치의 문자를 반환
- void setChatAt(int where, char ch)
인덱스 where 위치의 문자를 ch로 설정
- StringBuffer append(String str), StringBuffer append(int num), StringBuffer append(Object obj)
객체 문자열을 추가
매개변수로 int나 객체를 전달할 경우 각각 내부적으로 String.valueOf()과 toString()을 호출하여 문자열로 변환한 후 추가한다.
- int insert(int index, String str), int insert(int index, int num), int insert(int index, Object obj)
지정한 인덱스 위치에 문자열을 삽입
- StringBuffer reverse()
문자열을 역순으로 뒤집음
- StringBuffer delete(int startIndex, int endIndex)
startIndex부터 endIndex까지의 문자열을 제거
- StringBuffer deleteCharAt(int loc)
인덱스 loc 위치의 문자를 제거
- StringBuffer replace(int startIndex, int endIndex, String str)
startIndex부터 endIndex까지의 문자열이 제거되고 그 부분에 str을 삽입
'Java > Java 문법' 카테고리의 다른 글
[Java] String 클래스 (0) | 2024.12.02 |
---|---|
[Java] 박싱, 언박싱, 래퍼클래스(Wrapper Class), Integer, Character (0) | 2024.12.01 |
[Java] 열거형 (enum) (0) | 2024.12.01 |
[Java] 레이스 컨디션 (Race Condition), 스레드 동기화 (synchronized) (0) | 2024.12.01 |
[Java] 스레드(Thread), 모니터(Monitor), Runnable 인터페이스 (0) | 2024.10.27 |