자바에서 문자열을 다루는 대표적인 클래스로 String, StringBuffer 그리고 StringBuilder가 있다.
비교적 간단한 연산을 수행할 시 어떤 클래스를 사용해도 OK 그렇지만 그 반대의 경우 (+ 멀티쓰레드) 에는 각 클래스의 특징을 이해하고
상황에 맞게 사용하는 것이 좋다.
String
- 불변의 속성
String str = "Hello";
str += "world";
문자열 + 문자열이 가능한데 웬 불변? 이라고 생각이 들 수 있다.
"Hello" 값이 들어있던 String 클래스의 참조변수 str이 추가된 문자열 "world"가 추가된 "Hello world"의 값으로 새로운 메모리 영역을 가리키게 변경되는 것이다. 그리고 처음에 선언했던 "Hello"로 할당된 메모리 영역은 갈비지 콜렉터에의해 사라지게된다.
이제 불변의 의미가 이해되었을 것이다.
즉, 스트링 클래스는 불변하기에 문자열을 수정하는 시점에 새로운 인스턴스가 생성되는 것이다!
불변의 속성을 가진 String
String str1 = "hello world";
String str2 = str1.substring(5);
System.out.println(str1);
System.out.println(str2);
- 실행결과
hello world
world
- 기존의 str1은 전혀 변화 없다.
- substring메소드는 5번째 부터 문자열을 잘라서 새로운 문자열을 반환하는 메소드
- str1자체는 전혀 변화가 없다.
String클래스를 사용할 때 가장 문제가 발생하는 경우는 다음과 같은 코드를 사용할 때 입니다.
String str3 = str1 + str2;
System.out.println(str3);
- 실행결과
hello world world
문자열과 문자열을 더하게 되면 내부적으로는 다음과 같은 코드가 실행
String str4 = new StringBuffer().append(str1).append(str2).toString();
System.out.println(str4);
문자열을 반복문 안에서 더하는 것은 성능상 문제가 생길 수 있으니 반드시 피하도록 하자.
이처럼 스트링은 불변의 속성을 가지므로 변하지 않는 문자열을 자주 읽어들이는 경우 사용하면 적합하다.
그러나 문자열의 추가, 수정 그리고 삭제 등의 연산작업이 자주 일어날때 스트링 클래스를 사용하게되면 힙 메모리에
많은 수의 임시 가비지들이 생성되어 힙 메모리 부족으로 치명적 영향을 미칠 수 있음!
이러한 문제점을 해결하기위해
가변의 속성을 가지는 StringBuffer/ StringBuild 클래스를 적합하게 사용할 수 있다.
아래와 같이 append() 메서드를 사용하여 " " <- 문자열을 파라미터로 전달하면, 기존에 할당된 메모리 주소 그대로 값을 변경할 수 있다!
String str2 = new StringBuffer().append("hello").append(" ").append("world").toString();
System.out.println(str2);
- 자기 자신의 메소드를 호출하여 자기 자신의 값을 바꿔나가는 것을 메소드체이닝 이라고 한다.
- StringBuffer클래스는 메소드 체인 방식으로 사용할 수 있도록 만들어져 있다.
- 앞에서 5줄로 작성했던 코드를 위와 같이 한 줄로 수정할 수 있다.
- StringBuffer는 append메소드 외에도 길이를 구하거나, 자르거나 등의 다양한 메소드들을 가지고 있다.
그러면 StringBuilder과는 어떤 차이가 있을까?
바로 동기화의 유무이다.
StringBuffer는 동기화 키워드를 지원하여 멀티쓰레드 환경에서 안전하다는 장점을 가진다. (스트링도 동일함)
/ StringBuilder은 동기화를 지원하지 않기에 멀티쓰레드 환경에서는 적합하지 않으나 단일쓰레드 환경에서는
스트링 버퍼보다 우수한 성능을 가진다.
클래스 별 특징 정리
'공부 STUDY > JAVA' 카테고리의 다른 글
[JAVA] 제네릭 Generic (0) | 2023.01.15 |
---|---|
[JAVA] java.util패키지 | 컬렉션 프레임워크(Collection Framework) (0) | 2023.01.15 |
[JAVA] java.lang 패키지/오토박싱 (0) | 2023.01.15 |
[JAVA] Object 클래스, 오버라이딩 (0) | 2023.01.15 |
[JAVA] 예외처리( exception handing ) - (3)사용자 정의 exception (0) | 2023.01.15 |