Java 에서 문자열을 다루는 클래스 

1. String vs StringBuffer/ StringBuilder 

String과 StringBuffer/ StringBuilder 클래스의 가장 큰 차이점은 String은 불변 (immutable)의 속성을 갖는다는 점

String str = "hello";
str = str + "world"; // [hello world]

>> hello 에 world 문자열을 더해 "hello world"로 변경된게 아님

"hello"값이 들어가 있던 String 클래스의 참조변수 str이 "hello world"라는 값을 가지고 있는 새로운 메모리영역을 가리키게 변경되고, 처음에 선언했던 "helllo"로 값이 할당되어 있던 메모리 영역은 Garbage로 남아있다가 GC(garbage collection)에 의해 사라지게 됨.  String 클래스는 불변하기 때문에 문자열을 수정하는 시점에 새로운 String 인스턴스가 생성되는 것 

위와 같이 String 은 불변성을 가지기 때문에 변하지 않는 문자열을 자주 읽어들이는 경우 String을 사용해 주면 좋은 성능을 기대할 수 있지만, 문자열 추가, 수정, 삭제 등의 연산이 빈번하게 발생하는 경우에는  Heap 메모리에 많은 가비지가 생성되어 힙메모리 부족으로 성능에 영향을 끼치게 됨

>> 이를 해결하기 위해 가변성을 가지는 StringBuffer와 StringBuilder클래스 도입

StringBuffer sb= new StringBuffer("hello");
sb.append(" world");

>> "hello" 에 " world"가 더해져 하나의 문자열로 합쳐짐 

String str = "strA";
StringBuilder sbd = new StringBuilder();
StringBuffer sbf = new StringBuffer();

sbd.append("sbdA");
sbf.append("sbfA");

System.out.println("String 객체의 주소 : "+str.hashCode());
System.out.println("StringBuilder 객체의 주소 : "+sbd.hashCode());
System.out.println("StringBuffer 객체의 주소 : "+sbf.hashCode());

str += "strB";
sbd.append("sbdB");
sbf.append("sbfB");
System.out.println("=============================");

System.out.println("String 객체의 주소 : "+str.hashCode());
System.out.println("StringBuilder 객체의 주소 : "+sbd.hashCode());
System.out.println("StringBuffer 객체의 주소 : "+sbf.hashCode());
String 객체의 주소 : 3541040
StringBuilder 객체의 주소 : 1468177767
StringBuffer 객체의 주소 : 434091818
=============================
String 객체의 주소 : 1758230625
StringBuilder 객체의 주소 : 1468177767
StringBuffer 객체의 주소 : 434091818

-> StringBuffer, StringBuilder에 문자열을 추가하게되면 추가할 문자열의 크기(길이)만큼 현재 문자열을 저장하는 배열의 공간을 늘려주고, 늘려준 공간에 추가할 문자열을 넣어주는 방식 .> 값이 변경되도라고 같은 주소공간을 참조 

2.

StringBuffer VS StringBuilder

둘이 차이는 동기화 유무 

StringBuffer : 동기화 키워드를 지원하여 멀티 쓰레드환경에서 안전함 , synchronized 키워드 사용 

StringBuilder : 동기화를 지원하지 않기 때문에 멀티 쓰레드 환경에서 사용하는것 부적합 . 단일 쓰레드에서 성능 뛰어남

* 스레드란 ?  프로세스가 할당받은 자원을 이용하는 실행의 단위 
 한 프로세스 내에서 동작되는 여러실행 흐름으로 프로세스 내의 Heap, Data, Code 영역을 공유 (멀티 스레드의 경우 이 프로세스 영역들을 공유) 

멀티스레드 : CPU 의 최대 활용을 위해 프로그램의 둘 이상을 동시에 실행하는 기술

 컨텍스트 스위칭을 통해서 이뤄짐. 하나의 스레드에서 다음 스레드로 이동하면서 컨텍스트 스위칭이 일어남. 스위칭이 일어나면서 부분적으로 조금씩 각각의 스레드에 대한 작업을 끝냄 

- 장점 :응답성 증가 / 경제성/  멀티프로세서의 활용..

- 단점 : 단일스레드보다 느림/ 동기화 필요 / 운영체제 지원필요 

 

싱글스레드 : 메인스레드 하나만 가지고 작업을 처리 . 하나의 레지스터와 스택으로 표현가능 

장점: 프로그래밍 난이도가 쉽고 CPU , 메모리 적게 사용 

-

 

'개념정리' 카테고리의 다른 글

3. 자바 컴파일 과정  (0) 2023.04.05
2. 싱글톤패턴 (Singleton pattern)  (0) 2023.04.05
개념 정리  (0) 2023.04.05
1. OOP 객체지향 프로그래밍  (0) 2023.04.05
복사했습니다!