일상기록
String과 StringBuffer/StringBuilder 본문
자바 String에 대하여 개발직군 면접중 받은 질문이다. 가, 나, 다, 라, ... 하 까지 문자를 하나씩 for문 으로 더해가면서 문자열로 만드려고 한다. String과 StringBuffer중 어떤거로 만드려고하는지와 근거는 무엇인가?
기존에 알고 있던 기본지식은 다음과 같다
String은 문자를 추가, 삭제할 시 주소값이 계속해서 바뀌게 된다. 그에 반해 StringBuffer, StringBuilder는 아래와 같이
StringBuilder sbd = new StringBuilder();
StringBuffer sbf = new StringBuffer();
객체를 생성한후에 append, delete로 추가, 삭제 하므로 주소값이 일정하다.
String str = "String";
StringBuilder sbd = new StringBuilder();
StringBuffer sbf = new StringBuffer();
sbd.append("StringBuilder");
sbf.append("StringBuffer");
// 연산 전 객체들의 주소
System.out.println("String 객체의 주소 : "+str.hashCode());
System.out.println("StringBuilder 객체의 주소 : "+sbd.hashCode());
System.out.println("StringBuffer 객체의 주소 : "+sbf.hashCode());
str += "Test";
sbd.append("Test");
sbf.append("Test");
System.out.println("=============================");
// 연산 후 객체들의 주소
System.out.println("String 객체의 주소 : "+str.hashCode());
System.out.println("StringBuilder 객체의 주소 : "+sbd.hashCode());
System.out.println("StringBuffer 객체의 주소 : "+sbf.hashCode());
String이 새로운 주소값을 가르키게 되면 이전의 주소값은 GC(Garbage Collection)에 의해 정리 된다.
면접에 답변은 StringBuffer로 선택할거 같다고 말했고 추가, 삭제에 용의하다고 설명했다. 기존에 그렇게 사용해 봤기에 이런 답변을 냈지만 중요한 걸 빼먹은 답변이였다.
StringBuffer를 사용하는 주된 이유는 StringBuffer 클래스는 내부적으로 버퍼(buffer)라고 하는 독립적인 공간을 가지게 되어, 문자열을 바로 추가할 수 있어 공간의 낭비도 없으며 문자열 연산 속도도 매우 빠르다는 특징이 있다.
반면 String은 문자열을 결합하면, 내용이 합쳐진 새로운 String 인스턴스를 생성하게 되어, 따라서 문자열을 많이 결합하면 결합할수록 공간의 낭비뿐만 아니라 속도 또한 매우 느려지게 된다는 단점이 있다.
이러한 내용을 설명하고 String은 불변성을 가지기 때문에 변하지 않는 문자열을 자주 읽어들일 때 사용하면 좋은 성능을 기대 할 수 있습니다. 라는 것이다.
StringBuffer/StringBuilder의 차이점은
StringBuffer는 멀티 스레드 환경에서 안전하다는 장점 이며
StringBuilder는 문자열 파싱 성능이 가장 우수하다는 장점 이다
조금더 잘 설명할 수 있는 부분인데 횡설수설 한거 같아 아쉽다.
- String 을 사용해야 할 때 :
- String은 불변성
- 문자열 연산이 적고 변하지 않는 문자열을 자주 사용할 경우
- 멀티쓰레드 환경일 경우
- StringBuilder 를 사용 해야 할 때 :
- StringBuilder는 가변성
- 문자열의 추가, 수정, 삭제 등이 빈번히 발생하는 경우
- 동기화를 지원하지 않아, 단일 쓰레드이거나 동기화를 고려하지 않아도 되는 경우
- 속도면에선 StringBuffer 보다 성능이 좋다.
- StringBuffer 를 사용해야 할 때 :
- StringBuffer는 가변성
- 문자열의 추가, 수정, 삭제 등이 빈번히 발생하는 경우
- 동기화를 지원하여, 멀티 스레드 환경에서도 안전하게 동작
'Java' 카테고리의 다른 글
Java - 제네릭 타입의 형변환 (0) | 2023.04.18 |
---|---|
Java - 제네릭 메소드 (0) | 2023.04.18 |
Java - 와일드 카드 (0) | 2023.04.17 |
Java - 제네릭(Generic) (0) | 2023.04.17 |
Java - OOP (0) | 2023.04.16 |