String 클래스 한계점
JAVA에서 String 객체를 사용하는 것은 메모리할당 및 해제를 사용한다. String 객체는 불변 객체이기 때문에 두개의 String 객체를 더하게 되면 새로운 String 객체가 탄생하게 된다. 그만큼 메모리 할당/해제 작업이 빈번해지는 것이고 메모리 부담이 커질 수 밖에 없다.
이런 문제의식 속에서 탄생한 방법이 StringBuilder 방버이다. String 객체를 더하는 연산을 수행할 때 새로운 String 객체를 생성하지 않는다. 기존 객체에 더하는 방식을 사용하여 메모리 부담을 완화할 수 있다. 프로그램이 고도화 되면서 좀더 라이트한 프로그램 운영을 위해서 필수적인 조건이다.
String 객체 예제
public class StringTest {
public static void main(String[] args){
// String 객체 생성
String stringValue1 = "STRING VALUE 1";
String stringValue2 = "STRING VALUE 2";
// String 객체 주소 출력
System.out.println(stringValue1.hashCode());
System.out.println(stringValue2.hashCode());
// String 객체 연산
stringValue1 = stringValue1+stringValue2;
// String 객체 주소 출력
System.out.println(stringValue1.hashCode());
System.out.println(stringValue2.hashCode());
}
}
출력된 결과를 확인하면 연산 후 StringValue1의 주소값이 변경된 것을 확인할 수 있다. 연산이 한번이면 그나마 다행이지만 반복된 연산 속에서 사라지는 메모리 감당이 안된다.
출력결과
740219923
740219924
106273511
740219924
String 객체를 무자비하게 사용하는 경우 부작용이 생긴다. String 주소값은 Stack 메모리에 쌓이게 된다. JAVA의 Garbage Collector가 호출되기 전까지 Heap 메모리에 클래스들이 쌓이게 된다. 메모리는 점점 사용가능 공간을 잃어버리게 되는 것이다.
String의 무자비한 생성을 막기 위해서 고안된 방법이 StringBuilder와 StringBuffer다. 추가적인 문자열이 더해질 때 String 객체와 같이 새로운 객체를 메모리에 할당하는 방식이 아닌, 동일 메모리 주소값에서 연산을 수행하게 된다. 연산을 몇번을 반복해도 주소값은 동일하게 유지된다.
StringBuilder/StringBuffer 예제
public class StringTest {
public static void main(String[] args){
StringBuilder sbd = new StringBuilder();
StringBuffer sbf = new StringBuffer();
// StringBuilder 초기 주소값
System.out.println("StringBuilder 주소 : "+sbd.hashCode());
sbd.append("test1");
// StringBuilder 연산 후 주소값
System.out.println("StringBuilder 주소 : "+sbd.hashCode());
// StrinfBuffer 초기 주소값
System.out.println("StringBuilder 주소 : "+sbf.hashCode());
sbf.append("test1");
// StrinfBuffer 연산 후 주소값
System.out.println("StringBuilder 주소 : "+sbf.hashCode());
}
}
출력결과를 보면 StringBuilder 및 StringBuffer 모두 append() 연산 후에도 동일한 주소값을 가지는 것을 확인할 수 있다. 최초 선언될 때의 주소값을 연산 후에도 계속 가지고 가기 때문에 메모리를 절약하고 가벼운 애플리케이션을 구현할 수 있다.
출력
StringBuilder 주소 : 225534817
StringBuilder 주소 : 225534817
StringBuilder 주소 : 1878246837
StringBuilder 주소 : 1878246837
StringBuilder, StringBuffer 차이점
두 클래스의 가장 큰 차이점은 Thread-safe 속성이다. StringBuilder는 멀티스레드 환경에서 모든 스레드들이 접근하도록 허용한다. 즉 변경가능한 문자열이기 때문에 동기식 프로그램에서 사용하기 적당하다.
반면 StringBuffer는 변경가능한 문자열이긴 하지만 multiple thread 환경에서 안전하게 사용할 수 있다. 다른 스레드에서 접근이 불가능하다는 것이다. 따라서, StringBuffer 클래스는 웹 소켓 프로그래밍 등 비동기식 프로그램에서 사용한다.
'Programming' 카테고리의 다른 글
SpringBoot란? 시작시 주의사항 알아야 하는 개념들 (0) | 2022.02.23 |
---|---|
JAVA StringTokenizer 란 개념 이용방법 (1) | 2022.02.23 |
JAVA BufferedReader와 BufferedWriter 사용법 (0) | 2022.02.18 |
Spring Boot Cause: invalid source release: 11 문제 해결 Fixing (0) | 2022.02.14 |
Ubuntu 20.04 LTS에 IntelliJ IDEA Intall 하는 방법 using Command Line Spring Boot 초기 설정하는 방법 (0) | 2022.02.14 |
스프링 vs 스프링부트 차이점 10분만에 이해하기 (0) | 2022.02.13 |
댓글