String
특징
- Java에서 String은 불변성을 가지는 특성이 있습니다. 즉 변하지 않는 문자열을 자주 사용하는 경우엔 성능이 우수합니다.
- 불변성을 가지고 있기 때문에 멀티쓰레드 환경에서 안전성을 가집니다.
불변(immutable)
String str = "hello";
str += "world";
단점
- 문자열에 대한 변경이 자주 일어나는 프로그램에서 String만 사용하게 되면 String의 특성은 "불변" 이기 때문에 좋은 성능을 내기 어렵습니다.
할당방법
String strA = "abc";
String strB = new String("abc");
String strC = "abc";
String stcD = new String("abc");
System.out.println(strA==strB);
System.out.println(strA==strC);
System.out.println(strB==strD);
- 결과값이 다른 이유는 String타입 값 할당 방식에 따라 저장방식이 다르기 때문입니다.
- 리터럴 변수를 대입하는 경우
- Heap 메모리 영역 안의 특별한 메모리 공간인 constant poll영역에 저장됩니다.
- constant poll에 존재하는 리터럴 값을 사용하게 된다면 새롭게 리터럴 값을 만들지 않고 현재 존재하는 값을 사용하게 됩니다.
- new 키워드를 사용한 경우
- 일반적인 객체와 동일하게 heap 영역에 메모리 공간이 할당됩니다.
- 같은 문자열이라도 new 키워드를 사용하면 같은 값이지만 다른 메모리 영역을 참조하게 됩니다.
StringBuffer / StringBuilder
- 이 두개는 "가변성(Mutable)"을 가지기 때문에 append() delete() 메서드를 이용하여 동일 객체 내에서 문자열 변경하는 작업이 가능합니다. 문자열에 대한 변경이 자주 일어나는 경우에는 StringBuilder, StringBuffer를 사용하면 보다 좋은 성능을 낼 수 있습니다.
StringBuffer sb = new StringBuffer("hello");
sb.append("world")
StringBuffer / StringBuilder의 차이
- 가장 큰 차이점은 동기화의 유무입니다.
- StringBuffer는 동기화 키워드를 지원하여 멀티쓰레드 환경에서 안전합니다.
- StringBuilder는 동기화를 지원하지 않기 때문에 멀티쓰레드 환경에서 사용하는것은 적합하지 않지만 동기화를 고려하지 않는 만큼 단일쓰레드에서의 성능은 StringBuffer보다 좋습니다.
참고
https://velog.io/@heoseungyeon/StringBuilder%EC%99%80-StringBuffer%EB%8A%94-%EB%AC%B4%EC%8A%A8-%EC%B0%A8%EC%9D%B4%EA%B0%80-%EC%9E%88%EB%8A%94%EA%B0%80