1. String
자바에서 String은 문자열을 저장하고 처리하는 데 사용되는 내장 클래스입니다. 자바에서는 String 클래스를 사용해 문자열을 표현하며, 이는 내부적으로 문자 배열을 활용하여 문자 데이터를 관리합니다. String 객체는 한 번 생성되면 그 값을 변경할 수 없는 불변(immutable) 객체로 설계되어 있습니다. 즉, String 클래스에서 제공하는 문자열 수정 메소드를 사용하면 새로운 String 객체가 생성되는 것입니다. 이는 메모리 관리 측면에서 효율적이지 않을 수 있으므로, 문자열을 자주 변경해야 하는 경 StringBuilder 또는 StringBuffer 클래스를 사용하는 것이 더 효율적입니다. 또한, String 클래스는 문자열 연결, 부분 문자열 추출, 문자열 비교, 공백 제거 등 다양한 문자열 처리 기능을 제공합니다. 이는 프로그래밍에서 자주 사용되는 작업들이므로 String 클래스의 메소드들을 잘 알고 있으면 매우 유용합니다.
1-1. String의 특징
불변성 (Immutable) : string 객체는 한 번 생성되게 되면 그 값을 변경할 수 없다. 문자열을 수정하기 위해서는 새로운 string 객체를 생성해야만 한다. 번거롭지만 이로인한 특성으로 문자열과 스레드의 안정성을 보장해준다.
문자열 연결 (Concatenation) : string 객체는 + 연산자를 사용하여 문자열을 연결할 수 있다고 한다. 이를 문자열 연결(concatenation)이라고 한다. 간단하게 보면, "Hello" + "World"를 하게 되면 "HelloWorld"가 생성되는 것으로 보면 된다.
문자열 비교 (Comparison) : string 클래스는 문자열을 비교하기 위한 여러 메서드를 제공해준다. equals() 메서드를 사용하여 두 문자열이 동등한지 비교할 수 있으며, compareTo() 메서드를 사용하여 두 문자열의 대소를 비교할 수 있다.
문자열 길이 (Length) : length() 메서드를 사용하여 문자열의 길이를 반환할 수 있습니다. 이를 통해 문자열에 포함된 문자의 개수를 알 수 있게 된다.
문자열 분할 (Splitting) : split() 메서드를 사용하여 문자열을 특정 구분자를 기준으로 분할할 수 있다. 이를 이용하면 문자열을 여러 부분으로 분리할 수 있게 된다.
문자열 검색 (Searching) : indexOf() 메서드를 사용하여 특정 문자나 문자열이 문자열 내에서 처음으로 등장하는 위치를 찾을 수 있게된다. 또한 constains() 메서드를 사용하여 특정 문자열이 문자열 내에 포함되어 있는지도 확인할 수가 있게된다.
문자열 변경 (Modification) : replace() 메서드를 사용하여 문자열 내의 특정 문자나 문자열을 다른 값으로 바꿀 수 있다. 또한 substring() 메서드를 사용하여 문자열의 일부분만도 추출이 가능하다.
2. StringBuilder
자바에서 StringBuilder는 문자열을 조작하고 관리하는 데 사용되는 클래스입니다. String 클래스와는 달리 StringBuilder 클래스는 가변(mutable) 객체로 설계되어 있어, 객체가 한 번 생성된 후에도 내부 문자열을 자유롭게 변경할 수 있습다. StringBuilder는 내부적으로 문자 배열을 사용하여 문자 데이터를 저장하며, 이 배열의 크기는 동적으로 확장될 수 있습니다. 따라서 문자열 연결이나 수정 등의 작업을 반복적으로 수행해야 하는 경우, StringBuilder를 사용하면 String을 사용하는 것에 비해 메모리 사용량을 줄이고 성능을 향상시킬 수 있습니다. StringBuilder 클래스는 append(), insert(), delete(), reverse() 등의 메소드를 제공하여 문자열을 쉽게 조작할 수 있습니다. 이 메소드들은 내부 문자열을 직접 변경하기 때문에 새로운 객체를 생성하지 않아 메모리 효율성이 높습니다. 그러나 StringBuilder는 다중 스레드 환경에서 동기화를 보장하지 않기 때문에, 멀티스레드 환경에서는 동기화를 지원하는 StringBuffer를 사용하는 것이 좋습니다.
2-1. StringBuilder의 특징
가변성(Mutable) : StringBuilder는 가변적(mutable)인 특징을 가지고 있습니다. 즉, 한 번 생성된 StringBuilder 객체의 내부 문자열은 변경될 수 있습니다. 이는 String과는 대조적인 특징으로, String 객체는 불변(immutable)입니다.
성능 향상(Performance Improvement) : 문자열을 반복적으로 연결하거나 수정하는 작업을 수행할 때, StringBuilder를 사용하면 String을 사용하는 것에 비해 메모리 사용량을 줄이고 성능을 향상시킬 수 있습니다. 이는 StringBuilder가 내부적으로 문자열을 직접 변경하기 때문에 새로운 객체를 생성하지 않아 메모리 효율성이 높기 때문입니다.
메소드 지원(Method Support) : StringBuilder 클래스는 문자열을 조작하는 데 유용한 다양한 메소드를 제공합니다. 예를 들어, append() 메소드를 사용하여 문자열의 끝에 다른 문자열을 추가할 수 있고, insert() 메소드를 사용하여 문자열의 특정 위치에 다른 문자열을 삽입할 수 있습니다.
스레드 안전성 부재(Lack of Thread Safety) : StringBuilder는 멀티스레드 환경에서의 동기화를 보장하지 않습니다. 따라서, 여러 스레드가 동시에 같은 StringBuilder 객체를 수정할 경우 문제가 발생할 수 있습니다. 이런 상황에서는 동기화를 지원하는 StringBuffer를 사용하는 것이 좋습니다.
이러한 특징들로 인해, StringBuilder는 문자열을 반복적으로 조작해야 하는 상황에서 매우 유용하게 사용될 수 있습니다.
3. String과 StringBuilder의 차이점
불변성 vs 가변성
String은 불변(immutable)한 클래스다. 한 번 생성된 String 객체는 그 값을 변경할 수 없다. 따라서 문자열을 수정하기 위해서는 항상 새로운 String 객체를 생성해야 한다. 반면 StringBuilder는 가변(mutability)한 클래스이다. StringBuilder 객체는 내부 버퍼를 사용하여 문자열을 변경할 수 있다. 따라서 동일한 StringBuilder 객체에서 문자열을 수정할 수 있다.
성능
String의 경우 불변성 때문에 문자열을 수정할 때마다 새로운 String 객체를 생성하기 때문에 메모리 사용량이 증가할 수 있다. 특히 문자열을 자주 수정하는 경우에는 성능에 영향을 줄 수 있다. 반면 StringBuilder는 내부 버퍼를 사용하여 문자열을 직접 수정하기 때문에 메모리 사용량을 줄일 수 있고 이로 인해서 성능의 향상을 기대할 수 있다. 특히 문자열을 여러 번 수정해야 하는 경우에는 StringBuilder가 더 유리하다고 볼 수 있다.
스레드 안정성
String은 불변성으로 인해 여러 스레드에서 동시에 접근해도 안전하다. 동일한 String 객체를 여러 스레드에서 공유할 수 있다. 반면 StringBuilder는 가변성으로 인해 여러 스레드에서 동시에 접근하게 되면 동기화 과정에서 문제가 발생할 수 있다. 따라서 StringBuilder는 단일 스레드 환경이나 스레드 간 동기화가 필요한 경우에 사용하는 것이 좋다.
정리
각각의 장점과 단점을 정리해보자면 문자열을 자주 수정하지 않거나 스레드 안정성이 중요하지 않은 경우에는 String을 사용하는 것이 유리하고, 문자열을 자주 수정하거나 성능이 중요한 경우에는 StringBuilder를 사용하는 것이 좀 더 효율적이라고 생각이 된다. 무심코 지나쳤던 부분인데 정리하고 보니 내용이 꽤 중요한 부분이 많이 들어있어서 놀랬다. 기본과 기초에 충실해야하는 이유를 다시금 깨달았다.
'Language > Java' 카테고리의 다른 글
반복문 for (0) | 2023.12.13 |
---|---|
반복문 for-each (0) | 2023.12.12 |
반복문 while (0) | 2023.12.11 |
조건문 switch (0) | 2023.12.09 |
조건문 if (0) | 2023.12.09 |
쓰임 있는 사람이 되기 위해 노력 중입니다.